PowerShell脚本问题:检查计算机是否属于指定OU并执行对应操作
问题原因及修正方案
你的代码问题出在Select Name返回的是带Name属性的对象数组,不是纯字符串数组。-contains运算符在这里是检查数组中是否包含某个对象,而不是匹配对象的属性值,所以即使计算机名存在,条件也始终不成立。
修正方法(三种可选)
方法1:展开Name属性为字符串数组
把Select Name替换成Select -ExpandProperty Name,这样$pccheck就变成纯计算机名字符串数组,-contains可以正常匹配:
$pccheck = Get-ADComputer -Filter * -SearchBase "OU=Test,OU=Computers,DC=TESTENV,DC=local" | Select -ExpandProperty Name $wshell = New-Object -ComObject Wscript.Shell if ($pccheck -contains $env:computername) { $Output = $wshell.Popup("Pc is eligible") } else { $Output = $wshell.Popup("Not eligible") }
方法2:直接检查对象的Name属性
不修改$pccheck的赋值,而是在if条件中检查对象集合的Name属性数组:
$pccheck = Get-ADComputer -Filter * -SearchBase "OU=Test,OU=Computers,DC=TESTENV,DC=local" | Select Name $wshell = New-Object -ComObject Wscript.Shell if ($pccheck.Name -contains $env:computername) { $Output = $wshell.Popup("Pc is eligible") } else { $Output = $wshell.Popup("Not eligible") }
方法3:更高效的AD查询(推荐)
直接用AD过滤器查询当前计算机是否在目标OU中,避免获取所有计算机再匹配,性能更优:
$targetOU = "OU=Test,OU=Computers,DC=TESTENV,DC=local" $currentPC = Get-ADComputer -Filter "Name -eq '$env:computername'" -SearchBase $targetOU -ErrorAction SilentlyContinue $wshell = New-Object -ComObject Wscript.Shell if ($currentPC) { $Output = $wshell.Popup("Pc is eligible") } else { $Output = $wshell.Popup("Not eligible") }
额外修正点
原代码中else分支的$wshell未定义,会导致报错,所以把$wshell = New-Object -ComObject Wscript.Shell移到if语句外面,确保两个分支都能调用。
内容的提问来源于stack exchange,提问作者Coder2510
相关产品推荐
相关产品推荐

