Подтвердить что ты не робот

Путь к SignTool.exe или директории "Windows Kits" при использовании Visual Studio 2012

Как вы получаете путь к SignTool.exe при использовании Visual Studio 2012?

В 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\"

Есть ли способ получить путь к этому каталогу, кроме жесткого кодирования (я пробовал FrameworkSDKDir и WindowsSDKDir, но оба указывают на каталог v8.0A).

(Я знаю SignFile MSBuild, но я не могу использовать это, поскольку он не принимает пароли сертификата.)

4b9b3361

Ответ 1

Я просто столкнулся с той же проблемой. Запуск сборки из командной строки Visual Studio 2012 работал, но в среде IDE она не срабатывала. Поиск подробного или диагностического журнала привел меня к Какое местоположение по умолчанию для журналов MSBuild?, в котором говорилось, что Visual Studio не может предоставить диагностическую информацию, которая мне действительно нужна.

Вот что я, наконец, сделал, чтобы исправить это.

Откройте обычную командную строку (а не командную строку Visual Studio) и запустите msbuild из нее, полностью определяя путь к MSBuild (% SystemRoot%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe). Это, наконец, дало мне то же сообщение об ошибке (код ошибки 9009), которое я получил в Visual Studio 2012.

Затем запустите ту же сборку, используя "диагностический" журнал (который показывает все значения свойств и элементов), добавив переключатель /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>

Надеюсь, это вам тоже поможет. Я включил преамбулу того, как я дошел до этого момента, потому что есть другие доступные свойства, которые могут быть лучше подходят для ваших целей.

Ответ 2

Хорошо, потому что это был первый хит в google для "SignTool.exe, который не найден на buildserver", я добавлю дополнительную информацию для VisualStudio 2015 и Windows 10 Enterprise 64bit.

Мне пришлось добавить инструменты публикации ClickOnce в VisualStudio Setup: Установка 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\ рука\

Ответ 3

Ниже приведен более общий подход, который можно использовать для поиска и установки переменной 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) разрешается одному из arm, x86 или x64. Вместо этого замените макрос $(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>

Ответ 4

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