【问题标题】:Import PFX Certificate into separate CurrentUser - Personal store (PowerShell)将 PFX 证书导入单独的 CurrentUser - 个人存储 (PowerShell)
【发布时间】:2015-04-01 18:05:48
【问题描述】:

我一直在想办法自动执行这项任务:

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

现在,关于问题 - 我正在尝试将 .PFX 客户端证书安装到单独用户的 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()
}    

【问题讨论】:

  • 我认为您必须以 用户身份运行此代码,以便在其下添加证书。那么下一个问题是,你有没有用户的凭据?
  • 如果您查看该 x509 证书类的定义,您会发现除了当前用户和本地计算机之外,甚至没有支持任何内容的枚举。我相信实现这一点的唯一方法是模拟其他用户 - 或者在 powershell 中更简单的方法是使用他们的凭据创建一个 new-pssession,但它需要用户名/密码(在任何一种情况下)加载他们的会话
  • Briantist/Bill - 是的,我有凭据并且我了解如何正确传递凭据。我也明白我需要将“LocalMachine”更改为“CurrentUser”,这很简单。但是,如果你们中的任何一个人可以帮助举个例子,例如使用上面的脚本并让它在新的 PSSession 下运行,或者通过使用带有 ScriptBlock 的 Start-Job,那将是有帮助的。几天前,我尝试让 Start-Job with ScriptBlock 工作,但我不断收到有关无效参数的不同错误消息。

标签: powershell certificate


【解决方案1】:

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

回到其他代码 sn-p,Wait-Job 等待它完成。 Receive-Job 是可选的,以防您从函数中返回任何有用的信息。

Remove-Job 将其从工作列表中删除(否则它会一直存在,您可以通过 Get-Job 看到)。

【讨论】:

  • 我使用您的技术从另一个用户的个人商店中的证书中获取序列号。效果很好,谢谢!
猜你喜欢
  • 2016-01-28
  • 2011-07-07
  • 2012-02-26
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多