2010-06-29 15 views
7

Necesito crear evento posterior a la construcción para llevar a cabo lo siguiente:Auto-Introducción de la contraseña En Sn.exe

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

Cuando el Visual Studio ejecuta la primera instrucción que requiere una contraseña y espera hasta que el usuario especifica y falla

Microsoft (R) .NET Framework fuerte Nombre Utility Versión 2.0.50727.42 Derechos de autor (c) Microsoft Corporation. Todos los derechos reservados.

Introduzca la contraseña de la clave PKCS # 12 archivo: Error al analizar los PKCS # 12 burbuja en mykey.pfx - El mango es válido.

Intenté especificar la contraseña utilizando los argumentos de la línea de comandos sn, pero no pude ver la manera de hacerlo.

Por favor ayuda.

Saludos, Hilmi.

+2

¿Hay alguna razón por la que no puede usar la función de firma de teclas de Visual Studio? (Marque las Propiedades para el proyecto.) –

Respuesta

3

si como yo, que no está utilizando TFS o MSBUILD para construir, entonces hay al menos otras 2 formas:

a) sn.exe ejecución de un guión, y escribir la contraseña para la entrada estándar

ver here para un ejemplo de C#:

nota: con la versión de .NET4 sn.exe parece ser imposible ejecutar como proceso externo (por lo menos en Windows XP), y escribir la contraseña para la entrada estándar (Intenté con python + con C#, y sn.exe parece simplemente salir sin esperar la contraseña entrada).

b) utilice sn.exe para volver a firmar la contraseña, utilizando un pfx que ya se haya instalado.

Si ya ha instalado el archivo PFX, entonces es posible saber el nombre del contenedor (por lo general de Visual Studio utiliza un nombre como VS_KEY_ABAB1234ABAB1234)

Si, como yo, usted no sabe o no recuerda el nombre del contenedor, a continuación, sólo volver a instalar el archivo PFX:

sn -i myPfxFile VS_KEY_ABAB1234ABAB1234 

sn.exe le pedirá una contraseña, ya que se instala el certificado en el archivo PFX.

entonces usted puede hacer sn.exe re-firmar el ensamblado, sin preguntar por el password:

sn -Rca myAssembly.dll myVSkey 

Lo anterior se puede utilizar en un script de construcción, ya que se requiere ninguna interacción :-)

NB recuerde verificar que la firma realmente funciona:

sn -v myAssembly.dll 
2

que había llegado este problema hasta hoy, con una C++ DLL que yo uso en una aplicación ClickOnce # C.

puedo configurar la firma de retardo en el DLL, a continuación, utiliza un evento posterior a la generación de ejecutar SN así:

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

Me encanta que los procedimientos discontinuos de la vieja escuela. ECHO <your-password-here> imprime su contraseña, las tuberías | que salen a lo largo de SN.exe, que toma la contraseña.

Probablemente no necesite demorar la firma y el modificador -R como lo hice, pero ya entendió la idea.

EDITAR: ESTE PROBABLEMENTE NO FUNCIONA MÁS - mi respuesta fue de 2013 y estaba usando VS2010 en aquel entonces.

+0

Otra cosa muy importante que debe saber, que acabo de recordar: si está poniendo este comando en un archivo por lotes, y su contraseña contiene un símbolo '%', necesita usa dos de ellos Si su contraseña es 'super% cool% guy', necesita usar' super %% cool %% guy' en el archivo por lotes * solo *. –

+4

La idea es genial, pero no funciona en un archivo por lotes. 'sn.exe' no acepta la redirección de entrada de la consola y se queja de esta manera:' La entrada de la consola no puede ser redirigida para ingresar la contraseña'. ¿Alguna idea de cómo lograr esto en un archivo por lotes? –

+0

No tuve un problema con eso. ¿Puedes publicar tus contenidos de archivo por lotes? (Lo hice hace unos años y tal vez el último SN.exe no lo permite) –

1

He estado investigando esto durante casi dos días. Probé versiones anteriores de sn.exe (¡hasta 2.0!), Pero no pude hacer funcionar el truco echo PASSWORD |.

Al final, lo hice:

[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() envía teclas a la ventana activa actual. Dado que estamos comenzando sn.exe usando Start-Process con el modificador -NoNewWindow, nuestra ventana ya está enfocada.
  • ~ es un carácter especial que representa el botón ENTER. {ENTER} también es posible, pero eso es para el botón Entrar cerca del teclado numérico de su teclado. Probablemente no haga ninguna diferencia, pero solo quería estar seguro.

Fuente he utilizado: https://technet.microsoft.com/en-us/library/ff731008.aspx

no tenía necesidad de Visual Basic de AppActivate() al final porque de -NoNewWindow.

Actualización: Funciona incluso mejor con -Wait argumento!

Cuestiones relacionadas