2010-06-29 16 views
7

Ich brauche Postbuildereignis zu erstellen, um Folgendes auszuführen:Auto-Eingabe Passwort In Sn.exe

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

Wenn das Visual Studio die erste Anweisung führt sie ein Passwort erforderlich ist und wartet, bis der Benutzer es gibt und schlägt fehl.

Microsoft (R) .NET Framework Strong Namen Utility Version 2.0.50727.42 Copyright (c) Microsoft Corporation. Alle Rechte vorbehalten.

Geben Sie das Kennwort für die PKCS # 12 Schlüssel Datei: Fehler der PKCS # 12 Blob in mykey.pfx analysieren - Der Griff ist ungültig.

Ich habe versucht, das Passwort mit sn Befehlszeilenargumente anzugeben, aber ich sah keinen Weg, es zu tun.

Bitte helfen.

Grüße, Hilmi.

+2

Gibt es einen Grund, warum Sie nicht die eigene Funktion zur Signierung von Signaturen von Visual Studio verwenden können? (Überprüfen Sie die Eigenschaften für das Projekt.) –

Antwort

3

wenn Sie wie ich, Sie verwenden TFS oder MSBUILD nicht zu bauen, dann gibt es mindestens zwei andere Möglichkeiten:

a) laufen sn.exe aus einem Skript, und das Passwort schreiben stdin

siehe here für ein C# Beispiel:

Anmerkung: mit der .NET4 Version von sn.exe es als externem Prozess unmöglich zu sein scheint (zumindest unter Windows XP), und schreiben sie das Passwort zur Ausführung stdin (Ich versuchte mit Python + mit C#, und sn.exe scheint nur zu beenden, ohne auf das Kennwort zu warten Eingang).

b) Verwenden Sie sn.exe, um das Passwort erneut zu signieren, indem Sie eine bereits installierte pfx verwenden.

Wenn Sie bereits die PFX-Datei installiert haben, dann könnten Sie den Container Namen kennen (in der Regel von Visual Studio verwendet einen Namen wie VS_KEY_ABAB1234ABAB1234)

Wenn, wie ich, Sie nicht den Containernamen kennen oder denken Sie daran, dann nur die pfx Datei neu installieren:

sn -i myPfxFile VS_KEY_ABAB1234ABAB1234 

sn.exe werden Sie nach einem Passwort gefragt, wie sie das Zertifikat in der pfx Datei installiert.

Sie können dann sn.exe wieder anmelden, um Montage machen, ohne Eingabeaufforderung für Kennwort:

sn -Rca myAssembly.dll myVSkey 

Das Obige kann in einem Build-Skript verwendet werden, da keine Wechselwirkung :-)

erforderlich ist erinnern

NB zu überprüfen, dass die Unterzeichnung tatsächlich funktioniert:

sn -v myAssembly.dll 
2

ich hatte dieses Problem heute kommt, mit einem C++ DLL, die ich in einem Clickonce-C# app verwenden.

stelle ich Verzögerung Unterzeichnung auf der DLL-up, verwendet dann ein Postbuildereignis SN zu laufen wie folgt:

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

Muss ich die Old-School-Batch-Verfahren lieben. ECHO <your-password-here> druckt Ihr Passwort, die Pipe | Pipes, die Ausgabe an SN.exe, die das Passwort übernimmt.

Sie werden wahrscheinlich keine Verzögerung Unterzeichnung und die -R-Schalter wie ich, aber Sie bekommen die Idee.

EDIT: Das funktioniert wahrscheinlich nicht mehr - meine Antwort war von 2013 und ich war VS2010 damals.

+0

Eine andere sehr wichtige Sache zu wissen, die ich nur jetzt gerade erinnerte: Wenn Sie diesen Befehl in eine Batch-Datei und Ihr Passwort enthält ein '%' Symbol, müssen Sie benutze zwei von ihnen. Wenn Ihr Passwort "super% cool% guy" lautet, müssen Sie 'super %% cool %% guy' nur in der Batch-Datei * verwenden *. –

+4

Die Idee ist großartig, aber funktioniert nicht auf einer Batch-Datei. 'sn.exe' akzeptiert keine Umleitung von Konsoleneingaben und beschwert sich darüber wie folgt:' Die Konsoleneingabe wird möglicherweise nicht zur Kennworteingabe umgeleitet. Irgendwelche Ideen wie man das in einer Batch-Datei erreichen kann? –

+0

Ich hatte kein Problem damit. Können Sie den Inhalt Ihrer Batchdatei posten? (Ich habe dies ein paar Jahre zurück und vielleicht die neueste SN.exe erlaubt es nicht) –

1

Ich habe das seit fast zwei Tagen recherchiert. Ich habe versucht, ältere Versionen von sn.exe (bis 2.0 zurück!), Aber ich konnte den echo PASSWORD | Trick nicht funktionieren.

Am Ende habe ich dies:

[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() Schlüssel zum aktuellen aktivierten Fenster sendet. Da wir sn.exe mit Start-Process mit dem Modifikator -NoNewWindow starten, ist unser Fenster bereits fokussiert.
  • ~ ist ein Sonderzeichen, das den ENTER-Knopf darstellt. {ENTER} ist auch möglich, aber das ist für die Enter-Taste in der Nähe des Nummernblocks auf Ihrer Tastatur. Wahrscheinlich macht das keinen Unterschied, aber ich wollte nur sicher sein.

Quelle I verwendet: https://technet.microsoft.com/en-us/library/ff731008.aspx

I AppActivate() von Visual Basic müssen nicht wegen -NoNewWindow am Ende.

Update: Funktioniert noch besser mit -Wait Argument!