如何在安装了Visual Studio 2017的计算机上获取signtool.exe的路径

5

我接手了一个基于Visual Studio 2012的项目。 在这个项目中,signtool.exe的路径是通过以下方式找到的:

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

现在我想将项目移植到Visual Studio 2017。但是因为缺少Windows SDK 8,所以无法像以前那样获得路径。

我已经安装了Click Once组件和Windows 10 SDK,因此signtool.exe可用。

请问有人可以告诉我如何在Visual Studio 2017中找到路径吗?


2
https://msdn.microsoft.com/en-us/library/ms164304.aspx - Hans Passant
4个回答

4

请问如何在Visual Studio 2017中查找路径?

您可以根据配置从注册表中找到并设置SignToolPath变量:

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

我们可以将此属性设置到我们的项目文件或者.target文件中,然后将其导入到项目文件中。
或者,您可以将环境变量设置为SignToolPath,全局系统路径(通过控制面板->系统->高级系统设置->环境变量)。
C:\Program Files (x86)\Windows Kits\10\bin\x86

希望这能帮到您。

2

根据Leo的回复,这是我更新后的Windows Kit 10 PropertyGroup。虽然没有经过彻底测试,但在我的电脑上可以正常工作 ;-)

  <PropertyGroup>
    <!-- Windows Kits 10 -->
    <WindowsKitsRoot Condition="'$(WindowsKitsRoot)' == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', 'KitsRoot10', null, RegistryView.Registry32, RegistryView.Default))</WindowsKitsRoot>
    <SignToolPath Condition="'$(WindowsKitsRoot)' != '' And '$(SignToolPath)' == '' And exists('$(WindowsKitsRoot)bin\10.0.18362.0\')">$(WindowsKitsRoot)bin\10.0.18362.0\$(Platform)\</SignToolPath>
    <SignToolPath Condition="'$(WindowsKitsRoot)' != '' And '$(SignToolPath)' == '' And exists('$(WindowsKitsRoot)bin\10.0.18362.0\')">$(WindowsKitsRoot)bin\10.0.17763.0\$(Platform)\</SignToolPath>
    <SignToolPath Condition="'$(WindowsKitsRoot)' != '' And '$(SignToolPath)' == '' And exists('$(WindowsKitsRoot)bin\10.0.18362.0\')">$(WindowsKitsRoot)bin\10.0.17134.0\$(Platform)\</SignToolPath>
    <SignToolPath Condition="'$(WindowsKitsRoot)' != '' And '$(SignToolPath)' == '' And exists('$(WindowsKitsRoot)bin\10.0.18362.0\')">$(WindowsKitsRoot)bin\10.0.16299.0\$(Platform)\</SignToolPath>

    <!-- Windows Kits 8 and older -->
    <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>

1
根据Leo的回答,不受Windows Kits版本影响,但使用目标文件。$(SignToolPath)将包含signtool.exe的路径。 主要思想是在MSBuild中使用标准排序顺序,并将SignToolPaths项组的最后一项设置为SignToolPath属性。
<Target Name="ResolveSignToolPath" BeforeTargets="SignFile">
    <ItemGroup>
        <KitsRegKeys Include="KitsRoot" />
        <KitsRegKeys Include="KitsRoot81" />
        <KitsRegKeys Include="KitsRoot10" />
        <KitsRegKeyValues Include="@(KitsRegKeys)">
            <Value>$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots', '%(KitsRegKeys.Identity)', null, RegistryView.Registry32, RegistryView.Default))</Value>
        </KitsRegKeyValues>
    </ItemGroup>
    <PropertyGroup>
        <WindowsKitsRoot>%(KitsRegKeyValues.Value)</WindowsKitsRoot>
        <SignToolPlatform Condition="'$(SignToolPlatform)'=='' And '$(Platform)'!='AnyCPU'">$(Platform)</SignToolPlatform>
        <SignToolPlatform Condition="'$(SignToolPlatform)'==''">x86</SignToolPlatform>
    </PropertyGroup>
    <ItemGroup>         
        <SignToolPaths Include="$(WindowsKitsRoot)bin\**\$(SignToolPlatform)\signtool.exe"/>
    </ItemGroup>
    <PropertyGroup>
        <SignToolPath>%(SignToolPaths.Identity)</SignToolPath>
    </PropertyGroup>        
    <Error Condition="'$(SignToolPath)'=='' Or !Exists('$(SignToolPath)')"
       Text="In order to sign file, this package requires access to the signtool.exe tool from the Windows Kits, which was not found. Please either: 1) Supply a correct path to your Windows Kits bin directory containing signtool.exe by setting %24(SignToolPath) OR 2) Install Windows Kits" />
    <!-- <Message Text="Signing $(SignToolPath)" Importance="high" />        -->
</Target>

这就是方法。 - altso

0

我最近发现了一个注册表键,其中包含signtool.exe所需的路径。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Kits\Installed Roots] "WdkBinRootVersioned" = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\"

因此,这对我有效:

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

我猜只有安装了 WDK 才能获得那个密钥。 - ceztko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接