如何在使用PowerShell的远程计算机上安装证书?

如何在使用PowerShell的远程计算机上安装证书?,powershell,certificate,powershell-5.0,Powershell,Certificate,Powershell 5.0,我正在尝试使用PowerShell安装证书。我正在用自己的计算机创建远程会话来测试安装。我知道该命令是正确的,因为它在远程会话之外成功安装了证书。当我对自己的计算机进行远程会话时,我收到错误: 访问被拒绝。0x80070005(WIN32:5错误\u访问被拒绝)。这可能是远程计算机上需要用户凭据的结果。看见 Enable WSManCredSSP Cmdlet帮助,了解如何通过PowerShell远程处理为委派启用和使用CredSSP 如果我在没有远程会话的情况下运行此命令,它将正常工作: Im

我正在尝试使用PowerShell安装证书。我正在用自己的计算机创建远程会话来测试安装。我知道该命令是正确的,因为它在远程会话之外成功安装了证书。当我对自己的计算机进行远程会话时,我收到错误:

访问被拒绝。0x80070005(WIN32:5错误\u访问被拒绝)。这可能是远程计算机上需要用户凭据的结果。看见 Enable WSManCredSSP Cmdlet帮助,了解如何通过PowerShell远程处理为委派启用和使用CredSSP

如果我在没有远程会话的情况下运行此命令,它将正常工作:

Import-PfxCertificate -FilePath "\\network\storage\site.com.pfx" -CertStoreLocation "Cert:\\LocalMachine\\WebHosting" -Password (ConvertTo-SecureString -String "foobar" -AsPlainText -Force)
当我通过远程会话执行命令(通过
调用命令
)时,我会收到上面提到的错误:

$session = New-PSSession $Env:ComputerName
Invoke-Command -Session $session -ScriptBlock { Import-PfxCertificate -FilePath "\\network\storage\site.com.pfx" -CertStoreLocation "Cert:\\LocalMachine\\WebHosting" -Password (ConvertTo-SecureString -String "foobar" -AsPlainText -Force) }

如何解决此权限问题?

您遇到了所谓的双跳身份验证问题。如果使用普通身份验证,您将无法从正在调用命令的计算机向第二台计算机进行身份验证

要解决这个问题,可以使用CredSSP

要在被调用的计算机上启用CredSSP,请执行以下操作:

Enable-WSManCredSSP -Role Server -force
要在客户端上启用CredSSP,请执行以下操作:

Enable-WSManCredSSP -Role Client -DelegateComputer server.domain.com -force
-delegateComputer
参数需要FQDN,但也需要通配符


启用CredSSP后,您可以使用它调用您的命令,并使用参数
-authentication CredSSP

我花了很长时间试图绕过权限问题,最后转向了另一个方向。修改权限时存在缺陷\ bug。无法记住所有详细信息,但ACL属性会尝试访问您试图更改的密钥的所有权。这可能不适合所有人,但它可以为NLA RDP将证书部署到我们的所有系统

Set-Location "c:\windows\system32"
#if certificate is missing, will install wild card certificate into the store
icacls 'C:\ProgramData\Microsoft\Crypto\Keys' /save C:\ProgramData\Microsoft\Crypto\Keys\ACLfile_for_Keys_Dir /T
takeown /f C:\ProgramData\Microsoft\Crypto\Keys\*.*
icacls 'C:\ProgramData\Microsoft\Crypto\Keys\*.*' /grant 'Network Service:(R)'
#icacls C:\ProgramData\Microsoft\Crypto /restore  C:\ProgramData\Microsoft\Crypto\Keys\ACLfile_for_Keys_Dir #(restores original ACL for recovery)
icacls 'C:\ProgramData\Microsoft\Crypto\keys' /setowner system
icacls 'C:\ProgramData\Microsoft\Crypto\keys\*.*' /setowner system

注释掉的这两行是我的退避计划,以防出现问题。

作为此答案的补充,如果您想知道如何以及为什么这样做,请在此处查看“Powershell远程处理的秘密”,特别是最后两部分。感谢Paul的回复。我假设我不能通过远程会话运行enable命令(我想是鸡和蛋的问题吧)?我们正在寻找服务器和应用程序设置的完全自动化,因此我可能必须通过组策略或其他方式来实现这一点。@JustinHelgerson不是100%确定,但我认为您的假设是正确的;)集团政策似乎是一条可行之路: