在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参数更好地工作!