我试图使用下面的脚本来测试AD中每台计算机与域控制器的信任关系。我使用的是powershell 2.0。当我测试这个脚本时,我没有得到任何输出。它是基于一个可以工作的 powershell 4.0 脚本。
$localCredential = Get-Credential
ForEach ($Name in Get-AdComputer -Filter *){
$output = { $Name = $_.Name }
if (-not (Test-Connection $Name $_.Name -Quiet -Count 1)) { $output.Status = 'Offline'
} else {
$trustStatus = Invoke-Command $Name $_.Name -ScriptBlock { Test-ComputerSecureChannel } -Credential $localCredential
$output.Status = $trustStatus
}
[pscustomobject]$output
}
以下是我试图转换的一个 powershell 4.0 脚本,因为 .ForEach 语法在 Powershell 2.0 中无效。
资料来源:Powershell 2.0。https:/adamtheautomator.comtrust-relationship-between-this-workstation-and-the-primary-domain-failed。
这里是我试图转换的工作脚本。
$localCredential = Get-Credential
@(Get-AdComputer -Filter *).foreach({
$output = @{ ComputerName = $_.Name }
if (-not (Test-Connection -ComputerName $_.Name -Quiet -Count 1)) { $output.Status = 'Offline'
} else {
$trustStatus = Invoke-Command -ComputerName $_.Name -ScriptBlock { Test-ComputerSecureChannel } -Credential $localCredential
$output.Status = $trustStatus
}
[pscustomobject]$output
})
有谁知道为什么我没有得到输出?我发布的第一个脚本是否有明显的问题?任何帮助将是非常感激的。
非常感谢您。
戴夫
在 foreach()
语句中声明迭代器变量 $Name
但在循环体中,你不一致地使用了 $_
也是。
你也在使用 [pscustomobject]@{}
,一个在PowerShell 3.0中引入的特殊对象分配语法--你需要使用 New-Object psobject -Property
在2.0版本中。
最后,你的 $output
变量需要是一个字典,而不是一个脚本块(请注意 @
在...面前 { Name = ... }
).
为了解决这一切。
ForEach ($Computer in Get-AdComputer -Filter *){
$output = @{ Name = $Computer.Name }
if (-not (Test-Connection $Computer.Name -Quiet -Count 1)) {
$output.Status = 'Offline'
} else {
$trustStatus = Invoke-Command -ComputerName $Computer.Name -ScriptBlock { Test-ComputerSecureChannel } -Credential $localCredential
$output.Status = $trustStatus
}
New-Object psobject -Property $output
}