我在尝试使用 PowerShell 在服务器列表中远程安装证书时遇到问题

I'm having issues trying to remotely install certificates on a list of servers using PowerShell

提问人:Nate 提问时间:10/27/2023 更新时间:10/27/2023 访问量:45

问:

我的任务是更新一些远程服务器上的一些证书。我们有大量的服务器,但并非所有服务器都安装了这些证书。

让一个短篇小说变得很长......

我正在寻找 2 个不同的证书,我们称之为 DevCert 和 CertCert。我在远程服务器上的.csv文件中列出了所有服务器。我有一个脚本,它将遍历所有服务器,并检查是否安装了 Dev Cert 或 Cert Cert。我让它工作到它会吐出 3 个不同的输出文件:Results.csv、Dev.csv 和 Cert.csv。这些输出文件有 3 列,即“服务器名称”、“证书”和“开发”,结果列出了每台服务器,并在安装了证书的列中显示“是”,如果该服务器上未安装任何证书,则在两列中都显示“--”。dev.csv仅列出具有开发人员证书的服务器,Cert.csv仅列出安装了证书证书的服务器。这一切都很完美。

然后,我开始添加仅更新证书证书的功能,从远程服务器导入证书证书,并将其安装在Cert.csv列表中的所有服务器上。这是我的代码:

$credential = Get-Credential -UserName MyUserName -Message 'Enter Password'

$Servers = Invoke-Command -ComputerName ServerName5000.domain -Credential $Credential -ScriptBlock { Get-Content -Path "E:\Temp\Servers.csv" } | Select-Object -Skip 1

$devThumbprint =  "ThumbPrint"
$certThumbprint = "ThumbPrint"

Write-Host "Processing..."

$results = foreach ($Server in $Servers) {
   $devCertExists = Invoke-Command -ComputerName $Server -Credential $credential -ScriptBlock { Test-Path Cert:\LocalMachine\My\$using:devThumbprint }
   $certCertExists = Invoke-Command -ComputerName $Server -Credential $credential -ScriptBlock { Test-Path Cert:\LocalMachine\My\$using:certThumbprint }
   
   if ($devCertExists -and $certCertExists) {
      [PSCustomObject]@{
         ServerName = $Server
         DevCert = "Yes"
         CertCert = "Yes"
      }
   } elseif ($devCertExists) {
      [PSCustomObject]@{
         ServerName = $Server
         DevCert = "Yes"
         CertCert = "--"
      }
   } elseif ($certCertExists) {
      [PSCustomObject]@{
         ServerName = $Server
         DevCert = "--"
         CertCert = "Yes"
      }
   } else {
      [PSCustomObject]@{
         ServerName = $Server
         DevCert = "---"
         CertCert = "---"
      }
   }
   
   Write-Progress `
      -Activity "Processing servers..." `
      -Status "Processing server: $Server" `
      -PercentComplete (($Servers.IndexOf($s) + 1) / $Servers.Count * 100)
}


$certServers = $results | Where-Object { $_.CertCert -eq "Yes" }
foreach ($server in $certServers) {
   Invoke-Command -ComputerName ServerName5000.domain -Credential $credential -ScriptBlock {
      Import-PfxCertificate -FilePath "E:\Installs\Certcert.pfx" -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString -String 'WATERMELON' -AsPlainText -Force)
   }
}

这段代码似乎有效,它检查了我所有的服务器,并对那些有旧证书的服务器进行了排序,但事实证明,它只将证书的更新版本安装到 ServerName5000.domain 上,这是我希望服务器列表从中导入新证书的地方。因此,通过做一些研究,我编辑了这个块:

$certServers = $results | Where-Object { $_.CertCert -eq "Yes" }
foreach ($server in $certServers) {
   Invoke-Command -ComputerName ServerName5000.domain -Credential $credential -ScriptBlock {
      Import-PfxCertificate -FilePath "E:\Installs\Certcert.pfx" -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString -String 'WATERMELON' -AsPlainText -Force)
   }
}

$certServers = $results | Where-Object { $_.CertCert -eq "Yes" }
foreach ($server in $certServers) {
   Invoke-Command -ComputerName $server -Credential $credential -ScriptBlock {
     Import-Certificate -FilePath "E:\Installs\WildCardCert\wildcard2024Entrust.cert.sc.egov.usda.gov.pfx" -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString -String 'BIGFOOT' -AsPlainText -Force)
   }
}

现在,它仍然在原始列表中对我的所有服务器进行排序,并告诉我在哪个服务器上安装了哪些证书,但它抛出一个错误,而不是安装新证书:

invoke-Command:一个或多个计算机名称无效。如果尝试传递 URI,请使用 -ConnectionUri 参数,或传递 URI 对象而不是字符串。 在 C:\Users\script.ps1:49 字符:4

  • invoke-command -computerName $server -credential $credential -scri ...
+ CategoryInfo          : InvalidArgument: (System.String[]:String[]) [Invoke-Command], ArgumentException
+ FullyQualifiedErrorId : PSSessionInvalidComputerName,Microsoft.PowerShell.Commands.InvokeCommandCommand

谁能从这里为我指出正确的方向?有什么想法吗?

powershell csv ssl-certificate remote-server invoke-command

评论

0赞 jdweng 10/27/2023
所有服务器是否都在同一个域中?我认为您会得到并且计算机名称无效的唯一原因是,如果您有多个域,或者您使用的 ADMIN 帐户并非在所有域上都有效。
0赞 Nate 10/27/2023
都在同一个域上。它仍然会检查每个服务器的证书,所以这对我来说也很奇怪。
0赞 jdweng 10/27/2023
尝试将冒号替换为美元符号并使用单引号:-FilePath 'E$\.................
0赞 Nate 10/27/2023
我得到同样的结果。
0赞 jdweng 10/28/2023
计算机名称中可能有空格。所以试试:-ComputerName ($server)。Trim() 另请参阅:forums.powershell.org/t/...

答: 暂无答案