使用Visual Studio 2012时,SignTool.exe或"Windows Kits"目录的路径

Rya*_*yan 41 msbuild signtool visual-studio-2012

使用Visual Studio 2012时,如何获得SignTool.exe的路径?

在Visual Studio 2010中,您可以使用

<Exec Command="&quot;$(FrameworkSDKDir)bin\signtool.exe&quot; sign /p ... />
Run Code Online (Sandbox Code Playgroud)

哪里$(FrameworkSDKDir)

"c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\"
Run Code Online (Sandbox Code Playgroud)

但在Visual Studio 2012中,$(FrameworkSDKDir)

 "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\"
Run Code Online (Sandbox Code Playgroud)

和SignTool在

 "c:\Program Files (x86)\Windows Kits\8.0\bin\x64\"
Run Code Online (Sandbox Code Playgroud)

有越来越路径不是硬编码等这个目录的方式(我试过FrameworkSDKDirWindowsSDKDir,但都指向v8.0A目录).

(我知道SignFile MSBuild任务,但我不能使用它,因为它不接受证书密码.)

小智 42

我刚遇到同样的问题.从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\
Run Code Online (Sandbox Code Playgroud)

所以,我对这个问题的解决方案是将以下内容添加到我的*.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>
Run Code Online (Sandbox Code Playgroud)

希望这对你也有帮助.我列出了我如何达到这一点的序言,因为有其他可用的属性可能更适合您的目的.

  • 这是两年前的事,但你可以解释一下你是如何将它添加到目标中的吗?我的解决方法是添加到post build事件:IF EXIST"C:\ Program Files(x86)\ Windows Kits\8.0\bin\x86\signtool.exe""C:\ Program Files(x86)\ Windows Kits\8.0\bin\x86\signtool.exe"sign/a/d"QA"$(ProjectDir)obj\$(PlatformName)\ $(ConfigurationName)\ QA.exe (2认同)

gRe*_*ReX 16

好的,因为这是google上第一个"在buildserver上找不到SignTool.exe",我将为VisualStudio 2015和Windows 10 Enterprise 64bit添加额外的信息.

我必须在VisualStudio安装程序中添加ClickOnce发布工具: Visual Studio 2015安装程序,您可以在其中添加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,Path根据您安装的所选Windows 10 Kit再次更改.

通过启动Visual Studio 2017开发人员命令提示符,您将获得路径通用 在此输入图像描述

并输入 where signtool.exe

  • 如果您已经安装了VS2015,您可以转到控制面板 - >添加/删除程序 - >右键单击MS Visual Studio并选择更改以重新运行此设置向导并添加上面的选项 (3认同)

erg*_*ack 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>
Run Code Online (Sandbox Code Playgroud)

这是假定$(Platform)解析为一个arm,x86x64.请用$(Platform)适当的目录替换宏.

编辑(2017.07.05):
这是一个更新<PropertyGroup>,推迟到新的Windows 10工具包并强制($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>
Run Code Online (Sandbox Code Playgroud)

  • `<SignToolPath Condition ="'$(SignToolPath)'==''和'$(Platform)'=='AnyCPU'"> $(WindowsKitsRoot)bin\x64\</ SignToolPath>``<SignToolPath Condition ="' $(SignToolPath)'==''"> $(WindowsKitsRoot)bin\$(平台)\ </ SignToolPath> (3认同)

dhc*_*cgn 6

Resolve-Path  "C:\Program Files*\Windows Kits\*\bin\*\signtool.exe"
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)


Jul*_*bre 5

因为对我来说,今天(20/07/2020),之前的所有建议都失败了,尽管其中大多数在过去都有效,但我决定发布一个更全面的方法,该方法还解决了以后的 Windows 10 SDK 位置,同时仍然使用旧版本作为后备。

<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>
Run Code Online (Sandbox Code Playgroud)