![验证证书是否安装在 OU 中的所有计算机上 - Powershell](https://linux22.com/image/762991/%E9%AA%8C%E8%AF%81%E8%AF%81%E4%B9%A6%E6%98%AF%E5%90%A6%E5%AE%89%E8%A3%85%E5%9C%A8%20OU%20%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8A%20-%20Powershell.png)
我正在尝试确认受信任的根证书颁发机构文件夹中的所有计算机上都安装了某个证书。这是我目前所得到的:
$Computers = Get-ADComputer -Filter {Enabled -eq $True} -searchbase "OU=xyz,DC=xyz,DC=xyz,DC=com" | select name
foreach($Computer in $Computers){
If (Get-ChildItem -Path Cert:\LocalMachine\Root | Where-Object {$_.Thumbprint -eq "xyz thumbprint"})
{
Write-Host "$computer.Installed"
}
else
{
Write-Host "$computer.Not Installed"
}
}
如果我在本地计算机上运行 if 语句,它会说已安装。如果我在整个 OU 上运行它,它会说未安装。我在这里做错了什么?
答案1
$Computer
您实际上并没有在命令中使用变量Get-ChildItem
;因此您的foreach
循环仅在本地计算机上多次运行相同的命令。
请注意,变量$Computer
只是 LDAP 搜索的结果;它与真实计算机没有任何关系,也不提供任何在其上运行命令的方法。
您不能直接Get-ChildItem
在远程计算机上运行,因为它不以目标计算机名称作为参数;但您可以使用Invoke-Command
它来解决这个问题并在远程系统上运行任何命令(前提是您可以访问它)。
这应该可以完成这项工作:
$Computers = Get-ADComputer -Filter {Enabled -eq $True} -searchbase "OU=xyz,DC=xyz,DC=xyz,DC=com"
foreach ($Computer in $Computers) {
$Cert = Invoke-Command -ComputerName $Computer.Name {
Get-ChildItem -Path Cert:\LocalMachine\Root | Where-Object {$_.Thumbprint -eq "xyz thumbprint"}
}
if($cert -ne $null)
{
Write-Host $Computer.Name "- Installed"
}
else
{
Write-Host $Computer.Name "- Not Installed"
}
}
我还建议在对Test-Connection
计算机进行运行之前先检查它是否真正处于活动状态且可访问Invoke-Command
;这将节省相当多的时间。