2010-06-29 15 views
7

Ho bisogno di creare post evento generazione per eseguire le seguenti operazioni:Auto-inserimento password nel Sn.exe

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

Quando il Visual Studio esegue la prima dichiarazione che richiede una password e attende che l'utente specifica e non riesce.

Microsoft (R) .NET Framework Strong Nome Utility Versione 2.0.50727.42 Copyright (c) Microsoft Corporation. Tutti i diritti riservati.

inserire la password per il PKCS # 12 chiave di file: Impossibile analizzare PKCS # 12 blob in mykey.pfx - La maniglia è valido.

Ho provato a specificare la password utilizzando gli argomenti della riga di comando sn, ma non sono riuscito a vedere un modo per farlo.

Per favore aiuto.

Cordiali saluti, Hilmi.

+2

C'è qualche ragione per cui non è possibile utilizzare la funzionalità di firma delle chiavi di Visual Studio? (Controlla le proprietà per il progetto.) –

risposta

3

se, come me, non si sta utilizzando TFS o MSBUILD per costruire, poi ci sono almeno 2 altri modi:

a) sn.exe corsa da uno script, e scrivere la password per stdin

vedono here per un C# esempio:

nota: con la versione .NET4 di sn.exe sembra essere impossibile eseguire come processo esterno (almeno su Windows XP), e scrivere la password per stdin (Ho provato con python + con C# e sn.exe sembra uscire senza attendere la password ingresso).

b) utilizzare sn.exe per ri-firmare la password, utilizzando un pfx che è già stato installato.

Se è già stato installato il file pfx, allora si potrebbe conoscere il nome del contenitore (di solito Visual Studio utilizza un nome come VS_KEY_ABAB1234ABAB1234)

Se, come me, non si conosce o ricorda il nome del contenitore, poi basta reinstallare il file pfx:

sn -i myPfxFile VS_KEY_ABAB1234ABAB1234 

sn.exe vi chiederà di inserire una password, come si installa il certificato nel file pfx.

È possibile poi fare sn.exe ri-firmare il montaggio, senza alcuna richiesta di password:

sn -Rca myAssembly.dll myVSkey 

Quanto sopra può essere utilizzato in uno script di build, in quanto non è richiesta l'interazione :-)

NB ricordarsi di verificare che la firma funziona realmente:

sn -v myAssembly.dll 
2

ho avuto questo problema venire oggi, con una DLL C++ che uso in un ClickOnce C# app.

ho istituito ritardo firma sul DLL, quindi utilizzato un evento post-generazione per eseguire SN in questo modo:

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

Gotta love metodi lotti vecchia scuola. ECHO <your-password-here> stampa la password, la pipe | pipe che viene inviata insieme a SN.exe, che accetta la password.

Probabilmente non avrai bisogno di firmare il ritardo e l'interruttore -R come ho fatto, ma hai capito.

MODIFICA: QUESTO PROBABILMENTE NON FUNZIONA PIÙ ALCUNA - la mia risposta era del 2013 e stavo usando VS2010 a quei tempi.

+0

Un'altra cosa molto importante da sapere, che ora ho solo ricordato: se stai mettendo questo comando in un file batch e la tua password contiene un simbolo '%', devi usarne due. Se la tua password è 'super% cool% guy', devi usare' super %% cool %% guy' nel file batch * only *. –

+4

L'idea è ottima, ma non funziona su un file batch. 'sn.exe' non accetta il reindirizzamento dell'input della console e si lamenta in questo modo:' L'input della console potrebbe non essere reindirizzato per l'inserimento della password'. Qualche idea su come ottenere questo risultato in un file batch? –

+0

Non ho avuto un problema con esso. Puoi pubblicare i contenuti del tuo file batch? (L'ho fatto qualche anno fa e forse l'ultimo SN.exe non lo consente) –

1

Ho fatto ricerche per quasi due giorni. Ho provato versioni precedenti di sn.exe (risalendo fino a 2.0!), Ma non ho potuto ottenere il trucco echo PASSWORD | per funzionare.

Alla fine, ho fatto questo:

[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() invia le chiavi per la finestra attiva corrente. Poiché stiamo iniziando a sn.exe utilizzando Start-Process con il modificatore -NoNewWindow, la nostra finestra è già focalizzata.
  • ~ è un carattere speciale che rappresenta il pulsante INVIO. {ENTER} è anche possibile, ma questo è per il pulsante Invio vicino al tastierino numerico sulla tastiera. Probabilmente non fa alcuna differenza, ma volevo solo essere sicuro.

Fonte ho usato: https://technet.microsoft.com/en-us/library/ff731008.aspx

non avevo bisogno di Visual Basic di AppActivate() alla fine a causa di -NoNewWindow.

Aggiornamento: Funziona ancora meglio con argomento -Wait!

Problemi correlati