将PFX证书导入单独的CurrentUser - 个人存储(PowerShell)

时间:2015-02-02 17:54:16

标签: powershell certificate

我一直在绕着自动化方式执行此任务:

我们为客户部署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()
}    

1 个答案:

答案 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查看)。