2010-06-29 26 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爭執更好!