在Sn.exe中自动输入密码
我需要创建post build事件来执行以下操作:
sn -i MyKey.pfx MyKeyContainerName tlbimp $(ConfigurationName)\MyCom.tlb /out:$(ConfigurationName)\NETMyCom.dll /keycontainer:MyKeyContainerName sn -d MyKeyContainerName
当Visual Studio执行第一个语句时,它需要一个密码并等待用户指定并失败。
Microsoft(R).NET Framework强名称实用程序版本2.0.50727.42版权所有(c)Microsoft Corporation。 版权所有。
输入PKCS#12密钥文件的密码:无法解析mykey.pfx中的PKCS#12 blob – 句柄无效。
我尝试使用sn命令行参数指定密码,但我看不到这样做的方法。
请帮忙。
此致,希尔米。
如果像我一样,你没有使用TFS或MSBUILD来构建,那么至少有两种方法:
a)从脚本运行sn.exe,并将密码写入stdin
在这里看一个C#示例:
注意:使用.NET4版本的sn.exe,似乎无法将其作为外部进程执行(至少在Windows XP上),并将密码写入stdin(我尝试使用带有C#的python +,sn.exe似乎只需退出而无需等待密码输入)。
b)使用已安装的pfx使用sn.exe重新签名密码。
如果您已经安装了pfx文件,那么您可能知道容器名称(通常Visual Studio使用类似VS_KEY_ABAB1234ABAB1234的名称)
如果像我一样,您不知道或记住容器名称,那么只需重新安装pfx文件:
sn -i myPfxFile VS_KEY_ABAB1234ABAB1234
sn.exe会提示您输入密码,因为它会在pfx文件中安装证书。
然后,您可以使sn.exe重新签名您的程序集,而不提示输入密码:
sn -Rca myAssembly.dll myVSkey
以上内容可以在构建脚本中使用,因为不需要交互:-)
请记住检查签名是否真的有效:
sn -v myAssembly.dll
我今天遇到了这个问题,我在ClickOnce C#应用程序中使用了一个C ++ DLL。
我在DLL上设置了延迟签名,然后使用post-build事件来运行SN,如下所示:
ECHO | sn.exe -R $(OutDir)$(TargetFileName) $(MSBuildProjectDirectory)
一定要喜欢老派的批量方法。 ECHO
打印您的密码,管道|
输出到SN.exe的管道,它接受密码。
你可能不会像我那样需要延迟签名和-R开关,但你明白了。
编辑:这可能没有更长的工作 – 我的答案是从2013年开始,当时我正在使用VS2010。
我已经研究了近两天了。 我尝试了旧版本的sn.exe(可以追溯到2.0!),但是我无法获得echo PASSWORD |
工作的伎俩。
最后,我这样做了:
[void] [System.Reflection.Assembly]::LoadWithPartialName("'System.Windows.Forms") Start-Process "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\sn.exe " -ArgumentList "-i `"Certificate.pfx`" VS_KEY_XXXXXXX" -NoNewWindow -Wait [System.Windows.Forms.SendKeys]::SendWait("PASSWORDHERE~")
-
SendWait()
将密钥发送到当前激活的窗口。 由于我们使用Start-Process
使用-NoNewWindow
修饰符启动sn.exe
,因此我们的窗口已经被聚焦。 -
~
是一个特殊字符,表示ENTER按钮。{ENTER}
也是可以的,但这是键盘上小键盘附近的Enter按钮。 可能没有任何区别,但我只想确定。
我使用的来源: https : //technet.microsoft.com/en-us/library/ff731008.aspx
由于-NoNewWindow
我最终不需要Visual Basic的AppActivate()
。
更新:使用-Wait
参数更好地工作!