我有一个具有以下结构的.Net解决方案:
我希望Authenticode只签署我自己的二进制文件(a.exe和b.dll)。
我目前在csproj文件上有一个针对a.exe的后期构建事件:
"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /t http://timestamp.globalsign.com/scripts/timestamp.dll /a $(TargetPath)
for %%f in ("$(ProjectDir)$(OutDir)*.dll") do "C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /t http://timestamp.globalsign.com/scripts/timestamp.dll /a $(TargetPath) %%f
然而,这将签署所有dll,包括thirdParty.dll,并且还冒着尝试签署任何未管理的DLL的风险。
现在最简单的解决方案是在bsp的csproj文件上放置一个post-build事件,并删除上面显示的for循环。但是,实际上我们有很多组件,可能会增加更多。我不想依赖其他开发人员记得在Authenticode上添加一个构建后的步骤来签署任何新的程序集。
我可以使用描述here的PowerShell脚本仅对托管程序集进行签名,但在上面的示例中仍然会签署thirdParty.dll。
如何枚举和签署包含我自己代码的程序集?
答案 0 :(得分:0)
如何枚举和签署包含我自己代码的程序集?
您可以使用" if..else if
"在循环语句中排除thirdParty.dll
:
为了测试这个,我用以下构建后事件创建了测试样本:
for %%f in ("$(ProjectDir)$(OutDir)*.dll") do ( if not "%%~nf"=="thirdParty" (echo %%~nf))
您可以使用您的签名命令:
"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /t http://timestamp.globalsign.com/scripts/timestamp.dll /a $(TargetPath)
而不是测试命令echo %%~nf
。
此外,如果您有多个需要排除的thirdParty.dll文件,则可以使用叠加的if
语句:
for %%f in ("$(ProjectDir)$(OutDir)*.dll") do ( if not "%%~nf"=="thirdParty1" (if not "%%~nf"=="thirdParty2" ( echo %%~nf)))
希望这有帮助。