45

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ディレクトリを指しています)。

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

4

7 に答える 7

44

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

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

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

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

この出力から、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>

これがあなたにも役立つことを願っています。あなたの目的により適しているかもしれない他の利用可能なプロパティがあるので、私がこの時点に到達した方法の前文を含めました。

于 2013-01-02T09:42:40.770 に答える
19

わかりました。これは「BuildserverでSignTool.exeが見つかりません」というGoogleでの最初のヒットだったので、VisualStudio2015とWindows10Enterprise64ビットの追加情報を追加します。

VisualStudioセットアップにClickOnce公開ツールを追加する必要がありました。 ClickOnceを追加できるVisualStudio2015セットアップ

この後、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の開発者コマンドプロンプトを起動すると、一般的なパスが取得されます ここに画像の説明を入力してください

と入力します where signtool.exe

于 2015-12-03T08:38:16.737 に答える
12

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)解決されることを前提としています。それ以外の場合は、マクロを適切なディレクトリに置き換えます。armx86x64$(Platform)

編集(2017.07.05):これは新しいWindows 10キットに準拠し、次のことを強制
する更新です:<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>
于 2015-12-08T19:34:25.307 に答える
7
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
于 2017-06-28T08:31:16.780 に答える
3

私にとって、今日(2020年7月20日)、以前の提案はすべて失敗しましたが、それらのほとんどは過去に機能していましたが、古いものを使用しながら、後のWindows10SDKの場所にも対応するより包括的なアプローチを公開することにしましたフォールバックとしてのもの。

<PropertyGroup Label="UserDefinedVariables">

    <!-- Get Windows SDK root folder-->

    <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>

    <!-- Evaluates the most recent Windows SDK folder containing SignTool.exe -->

    <!-- add new versions here, duplicating following line -->
    <SignToolFolder Condition="'$(SignToolFolder)' == '' And exists('$(WindowsKitsRoot)bin\10.0.18362.0\x64\Signtool.exe')">$(WindowsKitsRoot)bin\10.0.18362.0\x64\</SignToolFolder>
    <SignToolFolder Condition="'$(SignToolFolder)' == '' And exists('$(WindowsKitsRoot)bin\10.0.17763.0\x64\Signtool.exe')">$(WindowsKitsRoot)bin\10.0.17763.0\x64\</SignToolFolder>
    <SignToolFolder Condition="'$(SignToolFolder)' == '' And exists('$(WindowsKitsRoot)bin\10.0.17134.0\x64\Signtool.exe')">$(WindowsKitsRoot)bin\10.0.17134.0\x64\</SignToolFolder>
    <SignToolFolder Condition="'$(SignToolFolder)' == '' And exists('$(WindowsKitsRoot)bin\10.0.16299.0\x64\Signtool.exe')">$(WindowsKitsRoot)bin\10.0.16299.0\x64\</SignToolFolder>
    <SignToolFolder Condition="'$(SignToolFolder)' == '' And exists('$(WindowsKitsRoot)bin\10.0.15063.0\x64\Signtool.exe')">$(WindowsKitsRoot)bin\10.0.15063.0\x64\</SignToolFolder>
    <SignToolFolder Condition="'$(SignToolFolder)' == '' And exists('$(WindowsKitsRoot)bin\10.0.14393.0\x64\Signtool.exe')">$(WindowsKitsRoot)bin\10.0.14393.0\x64\</SignToolFolder>
    <SignToolFolder Condition="'$(SignToolFolder)' == '' And '$(Platform)' == 'AnyCPU' ">$(WindowsKitsRoot)bin\x64\</SignToolFolder>
    <SignToolFolder Condition="'$(SignToolFolder)' == ''">$(WindowsKitsRoot)bin\$(Platform)\</SignToolFolder>

    <!-- Now we should be able to calculate SignTool.exe fullpath -->

    <SignToolExe Condition=" '$(SignToolFolder)' != '' ">$(SignToolFolder)SignTool.exe</SignToolExe>

</PropertyGroup>


<!-- Finally, I would suggest you add the following lines to your project file because they will be quite usefull when things go wrong (and they will) -->

<!-- Send indivual compile bessages to MSBuild output so you check the value of each variable -->
<Target Name="ShowUserDefinedVariables" BeforeTargets="BeforeBuild">
    <Message Importance="High" Text="WindowsKitsRoot = $(WindowsKitsRoot)" />
    <Message Importance="High" Text="SignToolFolder = $(SignToolFolder)" />
    <Message Importance="High" Text="SignToolExe = $(SignToolExe)" />
</Target>
于 2020-07-20T22:03:29.913 に答える
1

私が使用しているこのアプローチは、標準のビルドイベントに依存しています。

powershell -Command "(Resolve-Path \"C:\Program Files (x86)\\Windows Kits\\10\\bin\\*\\x64\" | Select-Object -Last 1).Path" > stpath
set /p STPATH=<stpath
del stpath

"%STPATH%\signtool.exe" sign ..........

新しいWindowsSDKがインストールされ、最新のパスを選択すると、新しいパスに対応します。

于 2021-01-15T12:07:12.963 に答える
0

実行可能ファイルまたはdllに署名するためにsigntoolが使用されていると思います。Visual Studio 2019には、DeveloperCmdとDeveloperPowershellの両方を提供するDeveloperコマンドラインがあります。これらのオプションはどちらも、現在のWindows SDKを気にすることなく、signtoolを自動的に解決できます。

解決中のsigntoolのスクリーンショット

ネイティブPowerShellからDeveloperPowershellを使用する場合は、DeveloperPowershellのモジュールをインポートするだけです。モジュールをインポートするには、ネイティブPowerShellで次の行を実行する必要があります。

&{Import-Module "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"; Enter-VsDevShell 5ee267ff}

5ee267ffマシンごとに異なります。これは、DeveloperPowershellショートカットのプロパティで確認できます。

モジュールがインポートされると、ネイティブのPowerShellからでもsigntoolを解決できます。最後に、プロジェクトのビルド後のイベントにスクリプトを追加して、このスクリプトがDeveloper Powershellをインポートし、署名にsigntoolを使用できるようにします。

于 2020-08-12T07:26:06.453 に答える