web-dev-qa-db-de.com

Pfad zum Verzeichnis "SignTool.exe" oder "Windows Kits", wenn Visual Studio 2012 verwendet wird

Wie erhalten Sie den Pfad zu SignTool.exe, wenn Sie Visual Studio 2012 verwenden?

In Visual Studio 2010 könnten Sie verwenden

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

Wobei $(FrameworkSDKDir) ist

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

In Visual Studio 2012 ist $(FrameworkSDKDir)

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

und SignTool ist in

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

Gibt es eine andere Möglichkeit, den Pfad zu diesem Verzeichnis als die Hardcodierung zu ermitteln (ich habe FrameworkSDKDir und WindowsSDKDir ausprobiert, aber beide verweisen auf das Verzeichnis v8.0A).

(Mir ist die Aufgabe SignFileMSBuild bekannt, aber ich kann sie nicht verwenden, da Zertifikatskennwörter nicht akzeptiert werden.)

40
Ryan

Ich bin auf dasselbe Problem gestoßen. Das Ausführen des Builds über eine Visual Studio 2012-Eingabeaufforderung funktionierte, schlug jedoch in der IDE fehl. Nach einem detaillierten oder Diagnoseprotokoll zu suchen, führte mich zu Was ist der Standardspeicherort für MSBuild-Protokolle? , was mir sagte, dass Visual Studio nicht die Diagnoseinformationen liefern kann, die ich wirklich brauchte.

Folgendes habe ich endlich getan, um das Problem zu beheben.

Öffnen Sie eine normale Eingabeaufforderung (nicht die Visual Studio-Eingabeaufforderung), und führen Sie msbuild aus, indem Sie den Pfad zu MSBuild (% SystemRoot%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe) vollständig qualifizieren. Dies gab mir schließlich die gleiche Fehlermeldung (Fehlercode 9009), die ich in Visual Studio 2012 erhalten hatte.

Führen Sie dann denselben Build mithilfe der "Diagnose" -Protokollierung aus (in der alle Eigenschaften- und Elementwerte angezeigt werden), indem Sie den Schalter/v: diag anhängen.

Aus dieser Ausgabe habe ich erfahren, dass es einige neue Eigenschaften gibt, mit denen ich den Speicherort von signtool.exe ermitteln kann (Auszug unten):

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\

Daher bestand meine Lösung für dieses Problem darin, meiner * .targets-Datei Folgendes hinzuzufügen:

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

Hoffe das hilft dir auch. Ich habe die Präambel dazu beigefügt, wie ich zu diesem Punkt gekommen bin, da andere Eigenschaften verfügbar sind, die möglicherweise besser für Ihre Zwecke geeignet sind.

42
M. Shawn Dillon

Ok, da dies der erste Treffer auf Google für "SignTool.exe nicht auf Buildserver gefunden" war, werde ich zusätzliche Informationen für VisualStudio 2015 und Windows 10 Enterprise 64bit hinzufügen.

Ich musste die ClickOnce Publishing Tools im VisualStudio-Setup hinzufügen: Visual Studio 2015 Setup where you can add ClickOnce

Danach finden Sie signtool.exe in

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

Mit installiertem Visual Studio 2017 befindet es sich in

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

Und mit Visual Studio 2017 15.7.4 wurde der Pfad entsprechend dem ausgewählten Windows 10-Kit, das Sie installieren, erneut geändert.

Sie erhalten den generischen Pfad, indem Sie die Developer-Eingabeaufforderung für Visual Studio 2017 starten enter image description here

und tippe where signtool.exe

15
gReX

Das Folgende ist ein allgemeinerer Ansatz, mit dem die Variable SignToolPath basierend auf der spezifischen Konfiguration der Erstellungsmaschine gesucht und festgelegt werden kann. durch Lesen der Registrierung:

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

Dies setzt voraus, dass $(Platform) in arm, x86 Oder x64 Aufgelöst wird. Ersetzen Sie andernfalls das Makro $(Platform) durch das entsprechende Verzeichnis.

EDIT (2017.07.05):
Hier ist ein aktualisierter <PropertyGroup>, Der sich auf das neue Windows 10 Kit bezieht und den ($Platform)=='AnyCPU' Zu x86 Zwingt:

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

Ausgabe:

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