将 PFX 证书导入单独的当前用户 - 个人存储 (PowerShell)



我一直在思考自动化执行此任务的方法:

我们为客户部署 Windows Server 2008 R2 映像。我们使用PowerShell(版本2)部署我们的专有软件,并在发货前对系统进行各种其他更改。此 PowerShell 进程在本地管理员帐户下运行,直到它完成并禁用本地管理员帐户。

现在,对于问题 - 我正在尝试安装.PFX 客户端证书到单独用户的当前用户\我的证书存储。我们称该用户为"SQL"。

现在,证书正在 LocalMachine\My 证书存储下安装,但我们的一个开发团队对此位置有顾虑,并希望复制原始设置。

现在,我知道如何通过向我们的部署脚本添加重新启动步骤并在"SQL"用户下执行此操作来完成此操作,但我想避免这种情况,因为似乎必须有一种方法可以在另一个帐户下完成此操作。下面是我们现在用于将证书安装到本地计算机\我的存储的基本代码。假设$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()
}    

既然你有凭据,我会开始使用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:pathtocredentials.xml

这将以加密的方式存储凭据对象,并且只能由加密它的同一台计算机上的同一用户解密。要重新阅读:

$cred = Import-Clixml -Path C:pathtocredentials.xml

回到另一个代码片段,Wait-Job等待它完成。 Receive-Job是可选的,以防您从函数中返回任何有用的内容。

Remove-Job将其从作业列表中删除(否则它会保留,您可以在Get-Job中看到)。

最新更新