2010-06-29 53 views
7

我需要创建后生成事件,以执行以下操作:自动进入密码在SN.EXE

sn -i MyKey.pfx MyKeyContainerName 
tlbimp $(ConfigurationName)\MyCom.tlb /out:$(ConfigurationName)\NETMyCom.dll /keycontainer:MyKeyContainerName 
sn -d MyKeyContainerName 

在Visual Studio中执行它需要一个密码,第一次发言,并等待用户指定并失败。

微软(R).NET Framework中的强 名称实用程序版本2.0.50727.42 版权所有(c)Microsoft公司。保留 所有权利。

输入的PKCS#12键 文件的密码:解析失败的PKCS在mykey.pfx#12 BLOB - 句柄 无效。

我试图使用sn命令行参数指定密码,但我看不到一种方法来做到这一点。

请帮忙。

Regards, Hilmi。

+2

是否有任何理由不能使用Visual Studio自己的密钥签名功能? (检查项目的属性。) – 2010-06-29 05:56:46

回答

3

如果像我一样,你不使用TFS或MSBUILD打造,那么至少有2种其他方法:从脚本

一)运行SN.EXE,并写入密码标准输入

看到here一个C#示例:

注:与SN.EXE的.NET4版本,它似乎是不可能执行它作为外部进程(至少在Windows XP),并写入密码标准输入(我用C#试着用python +,sn.exe似乎只是在不等密码的情况下退出输入)。

b)使用sn.exe重新签名密码,使用已安装的pfx。

如果您已经安装PFX文件,那么你可能知道的容器名称(通常是Visual Studio中使用像VS_KEY_ABAB1234ABAB1234名称)

如果像我一样,你不知道或记得容器名称,然后只需重新安装PFX文件:

sn -i myPfxFile VS_KEY_ABAB1234ABAB1234 

SN.EXE会提示你输入密码,因为它在安装PFX文件的证书。

然后,您可以让SN.EXE重新签署您的集会,没有任何提示密码:

sn -Rca myAssembly.dll myVSkey 

以上可以在构建脚本中使用,因为没有互动需要:-)

NB记得要检查签约的实际工作:

sn -v myAssembly.dll 
2

我今天上来这个问题,用C++ DLL,我在一个ClickOnce C#应用程序使用。

我成立了延迟签约的DLL,然后使用生成后事件来这样运行SN:

ECHO <your-password-here> | sn.exe -R $(OutDir)$(TargetFileName) $(MSBuildProjectDirectory)<path-to-pfx-file> 

爱是爱老学校批次方法。 ECHO <your-password-here>打印你的密码,管道|输出到SN.exe的管道,它取得密码。

您可能不需要像我那样延迟签名和-R开关,但您明白了。

编辑:这个可能没有更长的工作 - 我的答案是从2013年,我当时使用VS2010。

+0

另一个非常重要的事情要知道,我现在只记得:如果你把这个命令放在一个批处理文件中,并且你的密码包含一个'%'符号,你需要使用其中的两个。如果你的密码是'super%cool%guy',你需要在批处理文件* only *中使用'super %% cool %% guy'。 – 2014-12-11 19:24:00

+4

这个想法很好,但不适用于批处理文件。 'sn.exe'不接受控制台输入重定向,并像这样抱怨:'控制台输入可能不会被重定向为输入密码。任何想法如何在批处理文件中实现这一点? – 2015-05-04 08:02:48

+0

我没有问题。你能发布你的批处理文件内容吗? (我几年前做过这个,也许最新的SN.exe不允许它) – 2015-05-04 14:14:57

1

我已经研究了近两天了。我尝试了旧版本的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

我并不需要Visual Basic的AppActivate()在因为-NoNewWindow结束。

更新:与-Wait争执更好!