背景
我有一台 Windows 7 VM,它有两个用户帐户(condor_usr1 和 condor_usr2),用于源代码编译。condor_usr[1|2] 帐户是管理员组的成员。我有一台 HTCondor 主 VM,它定期接收作业并将每个作业分配到其中一个 condor_usr[1|2] 帐户上运行。Win7 VM 上的 condor 服务作为本地系统帐户运行,但正在执行的作业实际上作为 condor_usr[1|2] 帐户运行。
我有一个新的需求,需要对已编译的可执行文件进行签名。我已将带有私钥的证书导入 Windows 证书存储中的当前用户\个人密钥存储中。
问题
如果我以其中一个 condor_usr 帐户的身份登录 Win7 VM(例如通过远程桌面),则以该帐户身份运行的编译将成功签署可执行文件,但以另一个帐户身份运行的编译将无法签署可执行文件。例如,如果我以 condor_usr2 身份登录,则在 condor_usr2 下运行的编译将成功签名,而在 condor_usr1 下运行的编译将无法签名。如果我注销,两个帐户都无法签名。
我收到的具体错误是:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets(264,9): error MSB3482: An error occurred while signing: The system cannot find the file specified.
打开了一些审计日志,发现与签名失败同时发生的日志如下。
目标
无论编译以哪个帐户运行,均可成功签名编译的可执行文件,且无需用户登录。
我目前了解到的情况
- 正在编译的代码/项目是 Visual Studio 2017 解决方案。
- 签名方法是ClickOnce清单签名(VS2017项目中的一个选项)。
- 当启动编译作业时,该作业以 condor_usr[1|2] 身份登录,使用登录类型 2(交互式登录)。 https://ss64.com/nt/syntax-logon-types.html
我尝试过的事情
除非另有说明,这些操作无效并且已被恢复。
- 将 condor_usr 帐户添加到加密操作员组。
- 将带有私钥的证书导入到本地计算机\个人密钥存储区。
- 用于
PsExec -h make.bat
获取账户的提升令牌。 https://docs.microsoft.com/en-us/sysinternals/downloads/psexec - 我认为用户帐户控制 (UAC) 可能会阻止系统帐户和/或 condor_usr 帐户访问证书存储(或证书存储中的私钥),但 UAC 已在 Win7 VM 上被禁用。
- 我将原始 .pfx 证书文件放在 VS2017 解决方案中,并将其作为目标,而不是密钥存储中的证书。这没有任何效果,这让我相信问题出在某种签名权限上,而不是(或许是除了)实际证书存储周围的纯粹权限。
- 我尝试在通过远程桌面登录时启动一项工作,然后在工作进行到签名部分之前退出远程桌面会话(实际注销,而不是断开连接)。签名失败。