我一直在绕着自动化方式执行此任务:
我们为客户部署Windows Server 2008 R2映像。我们使用PowerShell(版本2)部署我们的专有软件,并在发货前对系统进行各种其他更改。此PowerShell进程在本地管理员帐户下运行,直到完成并禁用本地管理员帐户为止。
现在,针对这个问题 - 我尝试将.PFX客户端证书安装到SEPARATE用户的CurrentUser \ My证书存储区。让我们称之为用户" SQL"。
目前,证书已安装在LocalMachine \ My证书存储区下,但我们的一个开发团队对该位置有疑虑,并希望复制原始设置。
现在,我知道如何通过在我们的部署脚本中添加重启步骤并在" SQL"下执行此操作来完成此操作。用户,但我想避免这种情况,因为似乎必须有一种方法可以在另一个帐户下完成此操作。这是我们现在用于将证书安装到LocalMachine \ My商店的基本代码。假设$ 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 :(得分: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
查看)。