2014-12-16 24 views
9

Wir haben eine Business-App, die über clickonce bereitgestellt wird. Ich kann die Anwendung ohne Probleme bauen und veröffentlichen, aber wenn ich versuche, Continuous Integration zu verwenden (Build jeden Check-in) bekomme ich folgende Fehlermeldung:Die Task "SignFile" hat keinen Wert für den erforderlichen Parameter "CertificateThumbprint" erhalten.

2>C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5): 

error MSB4044: The "SignFile" task was not given a value for the required parameter "CertificateThumbprint".

[C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj]

Done executing task "SignFile" -- FAILED.

Wir unterzeichnen die Anwendung (um genauer zu sein: die Clickonce Manifest) unter Verwendung eines Codesignaturzertifikats, das im AD als Trusted Publisher registriert ist.

Das Zertifikat wird im Zertifikatspeicher auf meiner lokalen Arbeitsstation gespeichert. Das Zertifikat befindet sich auch im Zertifikatspeicher des Buildservers (1. Im persönlichen Speicher, 2. im persönlichen Speicher des TFSBuildServiceHost-Dienstkontos und 3. im persönlichen Speicher des tfs/build-Servers).

Wo sind mit Visual Studio 2013 Update 4, C#, .NET 4.5 und TFS 2013 Update 4

Ich habe keine Ahnung, was diesen Fehler verursacht, wird jede Hilfe dankbar.


EDIT:

Ich vergaß zu erwähnen, dass die tfs build Fein vor ein paar Wochen gearbeitet. Ich habe nichts geändert, ich habe überprüft, dass sich die Projektdatei (Pulse.csproj) nicht geändert hat, und ich hatte auch ein paar erfolgreiche Builds mit dieser genauen Pulse.csproj-Datei/Build-Definition. Ich bin mir ziemlich sicher, dass es etwas auf dem tfs-Server sein muss. Ich erinnere mich, dass Microsoft einige Probleme mit einigen Updates bezüglich der Zertifikatsinfrastruktur hatte.


EDIT 2: Ich habe versucht, das Projekt über die Kommandozeile mit folgendem Befehl zu bauen:

"C:\Program Files (x86)\MSBuild\12.0\bin\amd64\MSBuild.exe" C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln

Der Build mit der folgenden Meldung fehlschlägt:

CleanPublishFolder: Removing directory "bin\Debug\app.publish\". _DeploymentComputeClickOnceManifestInfo: Creating directory "bin\Debug\app.publish".
Copying file from "obj\Debug\Pulse.exe" to "bin\Debug\app.publish\Pulse.exe". C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5): error MSB3482: An error occurred while signi ng: SignTool.exe not found. [C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj] Done Building Project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (default targets) -- FAILED.

Done Building Project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln" (default targets) -- FAILED.

Build FAILED.

"C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln" (default target) (1) -> "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (default target) (2) -> (_DeploymentComputeClickOnceManifestInfo target) -> C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5): error MSB3482: An error occurred while sig ning: SignTool.exe not found. [C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj]

0 Warning(s) 
1 Error(s) 

Das Signtool auf jeden Fall existiert auf dem Server. Der Pfad zum signtool lautet: "C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v7.1A \ Bin \ signtool.exe" und "C: \ Programme \ Microsoft SDKs \ Windows \ v7.1 \ Bin" \ signtool.exe "

Der interessanteste Teil ist, dass ich die Lösung mit einem anderen Msbuild-Tool erstellen kann.

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln


EDIT 3:

Ich installierte die Windows Software Development Kit (SDK) for Windows 8 und jetzt kann ich die Lösung über die Befehlszeile erstellen. Somit ist das Codesignaturzertifikat installiert & verfügbar.

Aber der TFS-Build schlägt fehl.

Hier ist die Fehlerausgabe aus dem tfsbuild Logfile gesammelt:

 Task "AL" 
     C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64\AL.exe /culture:de /out:obj\Debug\de\Pulse.resources.dll /platform:AnyCPU /template:obj\Debug\Pulse.exe /embed:obj\Debug\Pulse.View.Localization.CreditsView.de.resources /embed:obj\Debug\Pulse.View.Localization.PulseMainWindow.de.resources 
     Microsoft (R) Assembly Linker version 12.0.20806.33440 
     Copyright (C) Microsoft Corporation. All rights reserved. 

     Done executing task "AL". 
    2>Done building target "GenerateSatelliteAssemblies" in project "Pulse.csproj". 
    2>Target "CreateSatelliteAssemblies" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "CoreBuild" depends on it): 
    2>Done building target "CreateSatelliteAssemblies" in project "Pulse.csproj". 
     Target "SetWin32ManifestProperties" skipped. Previously built successfully. 
     Target "_DeploymentComputeNativeManifestInfo" skipped, due to false condition; ('$(GenerateClickOnceManifests)'!='true') was evaluated as ('true'!='true'). 
    2>Target "CleanPublishFolder" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "_DeploymentComputeClickOnceManifestInfo" depends on it): 
     Task "RemoveDir" skipped, due to false condition; ('$(PublishDir)'=='$(OutputPath)app.publish\' and Exists('$(PublishDir)')) was evaluated as ('bin\Debug\app.publish\'=='bin\Debug\app.publish\' and Exists('bin\Debug\app.publish\')). 
    2>Done building target "CleanPublishFolder" in project "Pulse.csproj". 
     Target "_DeploymentGenerateTrustInfo" skipped, due to false condition; ('$(TargetZone)'!='') was evaluated as (''!=''). 
    2>Target "_DeploymentComputeClickOnceManifestInfo" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "GenerateApplicationManifest" depends on it): 
     Task "Copy" 
     Creating directory "bin\Debug\app.publish". 
     Copying file from "obj\Debug\Pulse.exe" to "bin\Debug\app.publish\Pulse.exe". 
     Done executing task "Copy". 
     Using "SignFile" task from assembly "Microsoft.Build.Tasks.v12.0, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". 
     Task "SignFile" 
    2>C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5): error MSB4044: The "SignFile" task was not given a value for the required parameter "CertificateThumbprint". [C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj] 
     Done executing task "SignFile" -- FAILED. 
    2>Done building target "_DeploymentComputeClickOnceManifestInfo" in project "Pulse.csproj" -- FAILED. 
    2>Target "_CheckForCompileOutputs" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "_CleanGetCurrentAndPriorFileWrites" depends on it): 
    2>Done building target "_CheckForCompileOutputs" in project "Pulse.csproj". 
     Target "_SGenCheckForOutputs" skipped, due to false condition; ('$(_SGenGenerateSerializationAssembliesConfig)' == 'On' or ('@(WebReferenceUrl)'!='' and '$(_SGenGenerateSerializationAssembliesConfig)' == 'Auto')) was evaluated as ('Off' == 'On' or (''!='' and 'Off' == 'Auto')). 
    2>Target "_CleanGetCurrentAndPriorFileWrites" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "_CleanRecordFileWrites" depends on it): 
     Task "ReadLinesFromFile" 
     Done executing task "ReadLinesFromFile". 
     Task "ConvertToAbsolutePath" 
     Done executing task "ConvertToAbsolutePath". 
     Task "FindUnderPath" 
     Comparison path is "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse". 
     Done executing task "FindUnderPath". 
     Task "FindUnderPath" 
     Comparison path is "C:\Builds\1\Pulse\DefaultBuild\bin\". 
     Done executing task "FindUnderPath". 
     Task "FindUnderPath" 
     Comparison path is "obj\Debug\". 
     Done executing task "FindUnderPath". 
     Task "RemoveDuplicates" 
     Done executing task "RemoveDuplicates". 
    2>Done building target "_CleanGetCurrentAndPriorFileWrites" in project "Pulse.csproj". 
    2>Target "_CleanRecordFileWrites" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "CoreBuild" depends on it): 
     Task "RemoveDuplicates" 
     Done executing task "RemoveDuplicates". 
     Task "MakeDir" 
     Done executing task "MakeDir". 
     Task "WriteLinesToFile" 
     Done executing task "WriteLinesToFile". 
    2>Done building target "_CleanRecordFileWrites" in project "Pulse.csproj". 
    2>Done Building Project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (default targets) -- FAILED. 
    1>Done executing task "MSBuild" -- FAILED. 
    1>Done building target "Build" in project "Pulse.sln" -- FAILED. 
    1>Done Building Project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln" (default targets) -- FAILED. 

Build FAILED. 

     "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln" (default target) (1) -> 
     "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (default target) (2) -> 
     (_DeploymentComputeClickOnceManifestInfo target) -> 
     C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5): error MSB4044: The "SignFile" task was not given a value for the required parameter "CertificateThumbprint". [C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj] 

    0 Warning(s) 
    1 Error(s) 


EDIT 4:

Visual Studio 2013 auf unserem Build-Server nicht installiert. Ich habe die Protokolldatei bereits durchgesehen und festgestellt, dass der TFS-Build das in C: \ Programme (x86) \ MSBuild \ 12.0 \ bin \ amd64 \ gespeicherte MSBuild.exe verwendet.

Da ich das Projekt auf dem Buildserver mithilfe von MSBuild.exe als TFS Build erstellen kann, kann ich sicher sein, dass das Zertifikat selbst kein Problem ist.

Ich erstellte eine neue Builddefinition ohne Änderung der Einstellungen, aber ich bekomme immer noch die gleiche Fehlermeldung.

Ich reparierte auch die TFS-Installation auf dem Build-Server, aber kein Glück.

Ich habe alle * .targets-Dateien verglichen, die im Ordner C: \ Programme (x86) \ MSBuild \ 12.0 \ bin \ amd64 \ auf dem Server mit den * .targets-Dateien am selben Speicherort auf meinem Clientcomputer gespeichert sind. Dort 100% identisch.

Unnötig zu sagen, dass ich das Projekt ohne Probleme auf meinem Client-Rechner (über VS2013 und Befehlszeile) erstellen kann.

Ich löschte und neu registriert/erstellt den Build Service/Controller/Agent. Das Ergebnis ist immer noch dasselbe.

Ich stecke hier fest. Irgendwelche Ideen?

+0

tun Sie einen privaten Schlüssel auf Build-Server als auch installiert? – avs099

+0

Ja ist es. Das Zertifikat befindet sich auch im Zertifikatspeicher des Buildservers (1. Im persönlichen Speicher, 2. im persönlichen Speicher des TFSBuildServiceHost-Dienstkontos und 3. im persönlichen Speicher des tfs/build-Servers). – Joel

+0

Das Zertifikat auf dem Build-Server bedeutet nicht, dass der private Schlüssel installiert ist. Wenn Sie versuchen, es vom Build-Server zu exportieren, erhalten Sie eine Option "Export mit privatem Schlüssel"? – avs099

Antwort

4

Dies ist wie ich das Problem gelöst habe:

Unsere Build-Dienste wurde konfiguriert, um als NT AUTHORITY\NetworkService ausgeführt, ich habe dies einfach zu meinem eigenen Benutzerkonto geändert. Beachten Sie, dass ich die * .pfx-Datei bereits im persönlichen Zertifikatspeicher installiert hatte.

Ich vermute das Problem war, dass der Benutzer NT AUTHORITY\NetworkService nicht das erforderliche Zertifikat im Zertifikatspeicher hat. Ich habe immer noch keine Ahnung, wie ich Zertifikate in den persönlichen Speicher von Systemkonten hinzufügen kann. Nichtsdestoweniger ist mein Problem für jetzt verschwunden, obwohl ich nicht die Tatsache mag, dass der Build-Dienst mit meinen Anmeldeinformationen ausgeführt wird.

+1

Ich denke, es wird empfohlen, die Build-Prozesse als Benutzer auszuführen. Wir verwenden unseren "domain \ TfsBuild" -Benutzer. So kann ich mich mit diesem Account am Build-Server anmelden und das Zertifikat installieren. – gReX

+0

Ich verwende TfsBuildService, da der Name beschreibender ist. – AMissico

2

Versuch das Zertifikat in der Unterzeichnung Registerkarte der Projekteigenschaften, indem Sie „Wählen Sie aus Speicher“ hinzufügen

oder

Versuchen Sie eine „Test-Zertifikat erstellen“ ...

-1

Ich hatte das gleiche Problem. Ich habe es auf ziemlich seltsame Weise sortiert. Ich ging zu den Projekteigenschaften und wählte dann die Option "Signieren". Darunter habe ich die SignOn ClickOnce-Manifeste deaktiviert und die Option "Die Assembly signieren" deaktiviert. Das Projekt lief danach.

Dies ist eine gefährliche Lösung und wird nicht als permanente Lösung angeboten. In meinem Fall habe ich es nur verwendet, weil ich an einer lokalen Kopie arbeitete und einige Korrekturen vornehmen musste, damit ich das Projekt ausführen musste. In einem realen Bereitstellungsszenario tun Sie dies nicht.

+4

Aber dann ist das Projekt nicht mehr unterzeichnet. Unterschreiben müssen wir in unserer Kooperationsumgebung. – Joel

+0

Ich bin mir nicht sicher, was genau das verursacht hat, seit wir mit der Quellcodeverwaltung arbeiten.Ich habe wahrscheinlich nicht alle benötigten Dateien bekommen oder die Person, die die Sign-Datei erstellt hat, hat vergessen, alle notwendigen Dateien einzubinden. Deshalb habe ich meine Antwort als schnelle Lösung hinzugefügt und würde sie nicht als dauerhafte Lösung empfehlen. Sie müssen überprüfen, ob alle Dateien vorhanden und nicht beschädigt sind. – Bryida

+0

Ist es nicht gefährlich, nicht zu unterschreiben? – Eniola

1

Ein weiterer Grund, warum Sie dies erhalten könnten, ist, wenn sich der Fingerabdruck des Zertifikats geändert hat (d. H. Wenn er erneuert wurde, weil das alte Zertifikat abgelaufen ist) und Sie das alte Zertifikat nicht mehr installiert haben. Das ist mir gerade passiert.

Lösung: Öffnen Sie das Projekt in Visual Studio, gehen Sie auf die Registerkarte Signieren, klicken Sie auf aus dem Speicher auswählen, und stellen Sie sicher, dass das richtige (neue) Zertifikat installiert ist. Das hat das Problem für mich gelöst.

10

Hinweis: Wenn Sie eine schnelle Lösung suchen und it is okay for your project to not be signed dann können Sie dies tun. Ich begegne diesem Problem, wenn ich für einen Beispielcode suchen und using this quick fix solves my problem instantly.

  1. Zum den Projekteigenschaften
  2. Wählen Signaturoptionen
  3. Deaktivieren Sie das Kontroll `Zeichen der Clickonce
  4. speichern
  5. Re manifestiert -run it
  6. (Optional) In einigen Fällen müssen Sie es neu erstellen.

enter image description here

Wenn es bitte versuchen die enable ClickOnce security settings nicht funktioniert zu deaktivieren, die auf Security Registerkarte angeordnet werden kann.

enter image description here