web-dev-qa-db-fra.com

Chemin d'accès au répertoire SignTool.exe ou «Kits Windows» lors de l'utilisation de Visual Studio 2012

Comment obtenir le chemin d'accès à SignTool.exe lors de l'utilisation de Visual Studio 2012?

Dans Visual Studio 2010, vous pouvez utiliser

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

$(FrameworkSDKDir) est

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

Mais dans Visual Studio 2012, $(FrameworkSDKDir) est

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

et SignTool est en

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

Existe-t-il un moyen d'obtenir le chemin d'accès à ce répertoire autre que le codage en dur (j'ai essayé FrameworkSDKDir et WindowsSDKDir, mais les deux pointent vers le répertoire v8.0A).

(Je connais la tâche SignFileMSBuild , mais je ne peux pas l'utiliser car elle n'accepte pas les mots de passe des certificats.)

40
Ryan

Je suis juste tombé sur le même problème. L'exécution de la génération à partir d'une invite de commandes Visual Studio 2012 a fonctionné, mais elle échouait dans l'EDI. La recherche d'un journal détaillé ou de diagnostic m'a conduit à Quel est l'emplacement par défaut pour les journaux MSBuild? , ce qui m'a dit que Visual Studio ne pouvait pas fournir les informations de diagnostic dont j'avais vraiment besoin.

Voici ce que j'ai finalement fait pour le réparer.

Ouvrez une invite de commandes normale (pas l'invite de commandes Visual Studio) et exécutez msbuild à partir de celle-ci en qualifiant complètement le chemin d'accès à MSBuild (% SystemRoot%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe). Cela m'a finalement donné le même message d'erreur (code d'erreur 9009) que j'avais reçu dans Visual Studio 2012.

Ensuite, exécutez la même génération à l'aide de la journalisation "diagnostic" (qui affiche toutes les valeurs de propriété et d'élément) en ajoutant le commutateur/v: diag.

De cette sortie, j'ai appris qu'il a de nouvelles propriétés que je pourrais utiliser pour obtenir l'emplacement de signtool.exe (extrait ci-dessous):

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\

Ainsi, ma solution à ce problème a été d'ajouter ce qui suit à mon fichier * .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>

J'espère que ça va t'aider aussi. J'ai inclus le préambule de la façon dont je suis arrivé à ce point car il existe d'autres propriétés disponibles qui peuvent être mieux adaptées à vos besoins.

42
M. Shawn Dillon

Ok, car c'était le premier hit sur google pour "SignTool.exe introuvable sur buildserver", j'ajouterai des informations supplémentaires pour VisualStudio 2015 et Windows 10 Enterprise 64bit.

J'ai dû ajouter les outils de publication ClickOnce dans la configuration de VisualStudio: Visual Studio 2015 Setup where you can add ClickOnce

Après cela, vous trouverez signtool.exe dans

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

Avec Visual Studio 2017 installé, il se trouve dans

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

Et avec Visual Studio 2017 15.7.4 , le chemin a de nouveau changé en fonction du kit Windows 10 sélectionné que vous installez.

Vous obtiendrez le chemin d'accès générique en démarrant l'invite de commande développeur pour Visual Studio 2017 enter image description here

et tapez where signtool.exe

15
gReX

Voici une approche plus générique qui peut être utilisée pour rechercher et définir la variable SignToolPath en fonction de la configuration spécifique de la machine de génération; en lisant le registre:

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

Cela suppose que $(Platform) se résout en arm, x86 Ou x64. Sinon, remplacez la macro $(Platform) par le répertoire approprié.

MODIFIER (2017.07.05):
Voici un <PropertyGroup> Mis à jour qui diffère du nouveau kit Windows 10 et contraint le ($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"

Sortie:

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