Автоматический ввод пароля в Sn.exe - PullRequest
7 голосов
/ 29 июня 2010

Мне нужно создать событие после сборки, чтобы выполнить следующее:

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

Когда Visual Studio выполняет 1-й оператор, он требует пароль и ждет, пока пользователь его не укажет, и произойдет сбой.

Microsoft (R) .NET Framework Сильный Имя Утилита Версия 2.0.50727.42 Авторские права (c) Корпорация Microsoft. Все права защищены.

Введите пароль для ключа PKCS # 12 файл: не удалось проанализировать PKCS # 12 BLOB-объект в mykey.pfx - дескриптор недействительный.

Я пытался указать пароль, используя аргументы командной строки sn, но не смог найти способ сделать это.

Пожалуйста, помогите.

С уважением, Хильми.

Ответы [ 5 ]

3 голосов
/ 01 июня 2012

если, как и я, вы не используете TFS или MSBUILD для сборки, то есть как минимум 2 других способа:

а) запустить sn.exe из скрипта и записать пароль в stdin

см. здесь для примера C #:

примечание: в версии sn.exe для .NET4 кажется невозможным выполнить его как внешний процесс (по крайней мере, в Windows XP) и записать пароль в stdin (я пробовал с python + с C # и 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 голосов
/ 22 декабря 2017

Я исследовал это почти два дня. Я пробовал старые версии 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() отправляет ключи в текущее активированное окно. Поскольку мы начинаем sn.exe, используя Start-Process с модификатором -NoNewWindow, наше окно уже сфокусировано.
  • ~ - это специальный символ, представляющий кнопку ENTER. {ENTER} также возможно, но это для кнопки Enter рядом с цифровой клавиатурой на клавиатуре. Возможно, это не имеет значения, но я просто хотел быть уверен.

Источник, который я использовал: https://technet.microsoft.com/en-us/library/ff731008.aspx

В итоге мне не понадобилось AppActivate() Visual Basic из-за -NoNewWindow.

Обновление: работает даже лучше с аргументом -Wait!

2 голосов
/ 02 февраля 2013

Я столкнулся с этой проблемой сегодня, с 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 голосов
/ 01 июля 2019

После долгих исследований я могу запустить sn.ex для различных автоматизированных сред, таких как devure для Azure.Мой код здесь:

Start-Process cmd.exe 
Sleep 3
$WshShell = New-Object -ComObject WScript.Shell
Sleep 3
$WshShell.sendkeys(".\sn.exe -i  $PfxCertificatePath  VS_KEY_10D1C85C6387479B{Enter}");
Sleep 3;
$WshShell.sendkeys("**password**{Enter}");
Sleep 3;
$WshShell.sendkeys("{Enter}");
0 голосов
/ 30 ноября 2018

Мне нужно было это автоматизировать, и я нашел этот вопрос.После этого ответа (большое спасибо @Thomas Rijsewijk) я написал свою версию этого:

# Start the sn.exe process
Start-Process $SnExePath -ArgumentList "-i $PfxCertificatePath $LocalContainerName" -NoNewWindow
# Wait for the process to start
Start-Sleep 2
# This workaround allows to forward the password to the standard input
[void] [System.Reflection.Assembly]::LoadWithPartialName("'System.Windows.Forms")
[System.Windows.Forms.SendKeys]::SendWait("$($PfxCertificatePassword){ENTER}")
Start-Sleep 2
# This ENTER is to return from the sn.exe process
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")

Использование переключателя -Wait команды Start-process не помоглопроблема в том, что сценарий PS ожидал завершения процесса sn.exe, прежде чем передать ему пароль.

...