"SignFile"任务没有为必需参数"CertificateThumbprint"赋值

Joe*_*oel 10 msbuild clickonce code-signing certificate tfs2013

我们有一个业务应用程序,通过clickonce部署.我可以毫无问题地构建和发布应用程序,但是当我尝试使用持续集成(构建每个签入)时,我收到以下错误:

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

错误MSB4044:"SignFile"任务未获得所需参数"CertificateThumbprint"的值.

[C:\构建\ 1 \脉冲\ DefaultBuild\SRC \脉冲\脉冲\ Pulse.csproj]

完成执行任务"SignFile" - 失败.

我们使用代码签名证书签署应用程序(更具体地说:ClickOnce清单),该证书在AD中注册为Trusted Publisher.

证书存储在我本地工作站的证书存储中.证书也位于构建服务器的证书存储区中(1.在个人存储中,2.在TFSBuildServiceHost服务帐户的个人存储中,以及3.在tfs /构建服务器本身的个人存储中).

哪里使用Visual Studio 2013 Update 4,C#,.Net 4.5和TFS 2013 Update 4.

我不知道导致此错误的原因,任何帮助表示赞赏.


编辑:

我忘了提到几周前tfs构建工作正常.我没有更改任何东西,我验证了项目文件(Pulse.csproj)没有改变,我也有一些成功的构建与精确的Pulse.csproj文件/构建定义.我很确定它必须是tfs服务器上的东西.我记得微软在证书基础设施的一些更新方面有些问题吗?


编辑2: 我尝试使用此命令通过命令行构建项目:

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

构建失败,并显示以下消息:

CleanPublishFolder:删除目录"bin\Debug\app.publish \"._DeploymentComputeClickOnceManifestInfo:创建目录"bin\Debug\app.publish".
将文件从"obj\Debug\Pulse.exe"复制到"bin\Debug\app.publish\Pulse.exe".C:\ Program Files(x86)\ MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5):错误MSB3482:注册时发生错误:找不到SignTool.exe.[C:\ Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj]完成构建项目"C:\ Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj"(默认目标) ) - 失败.

完成构建项目"C:\ Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln"(默认目标) - 失败.

建立失败.

"C:\ Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln"(默认目标)(1) - >"C:\ Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj "(默认目标)(2) - >(_ DeploymentComputeClickOnceManifestInfo target) - > C:\ Program Files(x86)\ MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5):错误MSB3482:An sig ning时发生错误:找不到SignTool.exe.[C:\构建\ 1 \脉冲\ DefaultBuild\SRC \脉冲\脉冲\ Pulse.csproj]

0 Warning(s)
1 Error(s)
Run Code Online (Sandbox Code Playgroud)

Signtool肯定存在于服务器上.signtool的路径是:"C:\ Program Files(x86)\ Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe"和"C:\ Program Files\Microsoft SDKs\Windows\v7.1\Bin\signtool.exe"

最有趣的部分是我可以使用不同的msbuild工具构建解决方案.

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


编辑3:

为Windows 8安装了 Windows软件开发工具包(SDK),现在我可以通过命令行构建解决方案.因此,代码签名证书已安装并可用.

但是TFS Build失败了.

以下是从tfsbuild日志文件收集的错误输出:

      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)
Run Code Online (Sandbox Code Playgroud)


编辑4:

我们的构建服务器上未安装Visual Studio 2013.我已经浏览过日志文件,发现TFS Build使用存储在C:\ Program Files(x86)\ MSBuild\12.0\bin\amd64 \中的MSBuild.exe.

由于我可以使用MSBuild.exe而不是TFS Build在构建服务器上构建项目,因此我可以确定证书本身不是问题.

我创建了一个新的构建定义而没有修改任何设置,但我仍然得到相同的错误消息.

我还在构建服务器上修复了TFS安装,但没有运气.

我将存储在服务器上的C:\ Program Files(x86)\ MSBuild\12.0\bin\amd64\Folder中的所有*.targets文件与客户端计算机上相同位置的*.targets文件进行了比较.有100%相同.

毋庸置疑,我可以在我的客户机上(通过VS2013和命令行)没有任何问题地构建项目.

我删除并重新注册/创建了构建服务/控制器/代理.结果仍然相同.

我被困在这里 有任何想法吗?

Car*_*doc 11

注意:如果您正在寻找快速修复,it is okay for your project to not be signed那么您可以执行此操作.当我在寻找示例代码时,我遇到了这个问题using this quick fix solves my problem instantly.

  1. 转到项目属性
  2. 选择签名选项
  3. 取消选中"签署ClickOnce清单"
  4. 保存
  5. 重新运行它
  6. (可选)在某些情况下,您需要重建它.

在此输入图像描述

如果它不起作用,请尝试取消选中enable ClickOnce security settings哪个可以位于Security选项卡上.

在此输入图像描述


Joe*_*oel 6

这就是我解决问题的方法:

我们将构建服务配置为运行,因为NT AUTHORITY\NetworkService我只是将其更改为自己的用户帐户。请注意,我已经将* .pfx文件安装到个人证书存储中。

我猜问题是用户NT AUTHORITY\NetworkService在证书存储区中没有所需的证书。我仍然不知道如何将证书添加到系统帐户的个人存储中。不过,尽管我不喜欢构建服务使用我的凭据运行这一事实,但我的问题暂时消失了。