web-dev-qa-db-ja.com

Visual Studio 2012を使用する場合のSignTool.exeまたは「Windows Kits」ディレクトリへのパス

Visual Studio 2012を使用しているときにSignTool.exeへのパスを取得するにはどうすればよいですか?

Visual Studio 2010では、使用できます

_<Exec Command="&quot;$(FrameworkSDKDir)bin\signtool.exe&quot; sign /p ... />
_

ここで、$(FrameworkSDKDir)

_"c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\"
_

しかし、Visual Studio 2012では、$(FrameworkSDKDir)

_ "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\"
_

そしてSignToolは

_ "c:\Program Files (x86)\Windows Kits\8.0\bin\x64\"
_

ハードコーディング以外にこのディレクトリへのパスを取得する方法はありますか(FrameworkSDKDirWindowsSDKDirを試しましたが、両方ともv8.0Aディレクトリを指します)。

SignFileMSBuild タスクを認識していますが、証明書のパスワードを受け入れないため、使用できません。)

40
Ryan

私はちょうど同じ問題に遭遇しました。 Visual Studio 2012コマンドプロンプトからビルドを実行することはできましたが、IDEで失敗していました。詳細または診断ログを探すと、 MSBuildログのデフォルトの場所はどこですか? になり、Visual Studioが本当に必要な診断情報を提供できないことがわかりました。

これが私が最終的にそれを修正するためにしたことです。

通常のコマンドプロンプト(Visual Studioのコマンドプロンプトではありません)を開き、MSBuild(%SystemRoot%\ Microsoft.NET\Framework\v4.0.30319\MSBuild.exe)へのパスを完全修飾して、そこからmsbuildを実行します。最終的に、Visual Studio 2012で受け取っていたのと同じエラーメッセージ(エラーコード9009)を受け取りました。

次に、/ v:diagスイッチを追加して、「診断」ログ(すべてのプロパティとアイテムの値を表示)を使用して同じビルドを実行します。

この出力から、signtool.exeの場所を取得するために使用できるいくつかの新しいプロパティがあることがわかりました(以下の抜粋)。

windir = C:\Windows
windows_tracing_flags = 3
windows_tracing_logfile = C:\BVTBin\Tests\installpackage\csilogfile.log
WindowsSDK80Path = C:\Program Files (x86)\Windows Kits\8.0\
WIX = C:\Program Files (x86)\WiX Toolset v3.7\

したがって、この問題に対する私の解決策は、*。targetsファイルに以下を追加することでした。

<SignToolPath Condition=" Exists('$(WindowsSDK80Path)bin\x86\signtool.exe') and '$(SignToolPath)'=='' and '$(PROCESSOR_ARCHITECTURE)'=='x86' ">$(WindowsSDK80Path)bin\x86\signtool.exe</SignToolPath>
<SignToolPath Condition=" Exists('$(WindowsSDK80Path)bin\x64\signtool.exe') and '$(SignToolPath)'=='' and '$(PROCESSOR_ARCHITECTURE)'=='AMD64' ">$(WindowsSDK80Path)bin\x64\signtool.exe</SignToolPath>

これもあなたのお役に立てば幸いです。目的に合った他のプロパティが利用できるため、このポイントに到達した方法の前文を含めました。

42
M. Shawn Dillon

OK.

VisualStudioセットアップにClickOnce Publishing Toolsを追加する必要がありました: Visual Studio 2015 Setup where you can add ClickOnce

この後、signtool.exeを見つけます

  • c:\ Program Files(x86)\ Windows Kits\8.1\bin \x64\
  • c:\ Program Files(x86)\ Windows Kits\8.1\bin \x86\
  • c:\ Program Files(x86)\ Windows Kits\8.1\bin \arm\

Visual Studio 2017をインストールすると、

  • C:\ Program Files(x86)\ Windows Kits\10\bin\arm\signtool.exe
  • C:\ Program Files(x86)\ Windows Kits\10\bin\arm64\signtool.exe
  • C:\ Program Files(x86)\ Windows Kits\10\bin\x64\signtool.exe
  • C:\ Program Files(x86)\ Windows Kits\10\bin\x86\signtool.exe

また、Visual Studio 2017 15.7.4を使用すると、選択したインストールしたWindows 10キットに従ってパスが再び変更されます。

Visual Studio 2017のDeveloperコマンドプロンプトを開始することにより、ジェネリックパスを取得しますenter image description here

where signtool.exe

15
gReX

以下は、ビルドマシンの特定の構成に基づいてSignToolPath変数を見つけて設定するために使用できる、より一般的なアプローチです。レジストリを読み取ることにより:

<PropertyGroup>
    <WindowsKitsRoot>$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot81', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot>
    <WindowsKitsRoot Condition="'$(WindowsKitsRoot)' == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot>
    <SignToolPath Condition="'$(SignToolPath)' == ''">$(WindowsKitsRoot)bin\$(Platform)\</SignToolPath>
</PropertyGroup>

これは、$(Platform)armx86、またはx64のいずれかに解決されることを前提としています。それ以外の場合は、$(Platform)マクロを適切なディレクトリに置き換えます。

[〜#〜] edit [〜#〜](2017.07.05):
これは、新しいWindows 10 Kitに委ねられ、<PropertyGroup>($Platform)=='AnyCPU'に強制する更新されたx86です。

<PropertyGroup>
  <WindowsKitsRoot>$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot10', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot>
  <WindowsKitsRoot Condition="'$(WindowsKitsRoot)' == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot81', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot>
  <WindowsKitsRoot Condition="'$(WindowsKitsRoot)' == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot>
  <SignToolPath Condition=" '$(SignToolPath)' == '' And '$(Platform)' == 'AnyCPU' ">$(WindowsKitsRoot)bin\x86\</SignToolPath>
  <SignToolPath Condition="'$(SignToolPath)' == ''">$(WindowsKitsRoot)bin\$(Platform)\</SignToolPath>
</PropertyGroup>
12
ergohack
Resolve-Path  "C:\Program Files*\Windows Kits\*\bin\*\signtool.exe"

出力:

Path
----
C:\Program Files (x86)\Windows Kits\8.0\bin\x64\signtool.exe
C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe
C:\Program Files (x86)\Windows Kits\8.1\bin\arm\signtool.exe
C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe
C:\Program Files (x86)\Windows Kits\8.1\bin\x86\signtool.exe
6
dhcgn