2015-02-02 6 views
1

Я оберточной мою голову вокруг автоматизации способа выполнить эту задачу:Импорт PFX Сертификат в отдельный CurrentUser - Личный магазин (PowerShell)

Мы используем Windows Server 2008 R2 изображений для наших клиентов. Мы используем PowerShell (версия 2) для развертывания нашего проприетарного программного обеспечения и внесения различных изменений в систему перед отправкой. Этот процесс PowerShell запускается под учетной записью локального администратора, пока он не завершит работу и не отключит локальную учетную запись администратора.

Теперь о проблеме - я пытаюсь установить сертификат клиента .PFX в хранилище сертификатов CurrentUser \ My хранилища SEPARATE. Назовем этого пользователя «SQL».

В настоящий момент сертификат устанавливается в хранилище сертификатов LocalMachine \ My, но одна из наших групп разработчиков обеспокоена этой позицией и хотела бы воспроизвести первоначальную настройку.

Теперь я знаю, как сделать это грязным, добавив в перезагрузочный шаг наш сценарий развертывания и выполнив его под пользователем SQL, но я хотел бы избежать этого, поскольку кажется, что должно быть способ сделать это в другой учетной записи. Вот базовый код, который мы используем сейчас, чтобы установить сертификат в LocalMachine \ My store. Предположим, что $ certPath - это путь к .pfx, а $ pfxPass - пароль .pfx.

function Import-PfxCertificate { 
param([string] $certPath, [string]$pfxPass) 

$pfx = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 
$pfx.Import([string]$certPath, [string]$pfxPass, "Exportable,PersistKeySet") 

$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My", "LocalMachine") 
$store.open("MaxAllowed") 
$store.add($pfx) 
$store.close() 
}  
+0

Я думаю, что вам нужно будет запустить этот код * как * пользователя, которому вы хотите добавить сертификаты. Итак, следующий вопрос: у вас есть учетные данные пользователя или нет? – briantist

+0

Если вы посмотрите на определение для этого класса сертификатов x509, вы увидите, что нет даже перечисления для поддержки чего-либо помимо текущего пользователя и локального компьютера. Я считаю, что единственным способом добиться этого было бы олицетворять другого пользователя - или в powershell гораздо более простой способ - просто создать новый-pssession с их учетными данными, но для этого потребуется имя пользователя/пароль (в любом случае) для загрузить свою сессию –

+0

Briantist/Bill - Да, у меня есть учетные данные, и я понимаю, как правильно передать учетные данные.Я также понимаю, что мне нужно будет изменить «LocalMachine» на «CurrentUser», который достаточно прост. Однако, если кто-либо из вас может помочь с примером взятия сценария выше и его запуска под новой PSSession или с помощью Start-Job с ScriptBlock, это было бы полезно. Я попытался получить Start-Job с ScriptBlock, чтобы работать пару дней назад, но я продолжал получать разные сообщения об ошибках о недопустимых аргументах. –

ответ

0

Поскольку у вас есть полномочия, я хотел бы начать использовать Start-Job, чтобы сделать это. Вы можете использовать параметр -Credential для управления тем, с каким пользователем выполняется задание.

$cred = Get-Credential 

$scriptBlock = [ScriptBlock]::Create((Get-Item Function:\Import-PfxCertificate).Definition) 

$job = Start-Job -ScriptBlock $scriptBlock -ArgumentList $path,$password -Credential $cred 
$job | Wait-Job 
$job | Receive-Job # if you want the output 
$job | Remove-Job 

Поскольку вы уже определили функцию, которая делает то, что вы хотите, я создаю блок скрипта из функции и использовать это для Start-Job. -ArgumentList - это то, как вы передаете параметры для пути PFX и пароля PFX. Я использую Get-Credential, чтобы запросить у пользователя runas, но вы можете предоставить объект учетных данных, как хотите.

Я думаю, что самый простой способ запустить что-то вроде этого:

Get-Credential | Export-Clixml -Path C:\path\to\credentials.xml 

Это будет хранить объект учетных данных таким образом, что шифруется и может быть расшифрована только одним и тем же пользователем на том же компьютере, зашифровал его. Чтобы прочитать его обратно в:

$cred = Import-Clixml -Path C:\path\to\credentials.xml 

Назад к другому фрагменту кода, Wait-Job ждет его завершения. Receive-Job не является обязательным, если вы возвращаете что-нибудь полезное из своей функции.

Remove-Job удаляет его из списка заданий (в противном случае он заходит вокруг, что вы можете видеть с помощью Get-Job).

Смежные вопросы