提问人:Nate 提问时间:10/27/2023 更新时间:10/27/2023 访问量:45
我在尝试使用 PowerShell 在服务器列表中远程安装证书时遇到问题
I'm having issues trying to remotely install certificates on a list of servers using PowerShell
问:
我的任务是更新一些远程服务器上的一些证书。我们有大量的服务器,但并非所有服务器都安装了这些证书。
让一个短篇小说变得很长......
我正在寻找 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
谁能从这里为我指出正确的方向?有什么想法吗?
答: 暂无答案
评论