PowerShell AD筛选器-or过多导致结果异常的问题求助
AD未登录计算机筛选异常问题分析与优化方案
异常原因
问题出在逻辑运算符优先级上:PowerShell中-and的优先级高于-or,你原本的脚本逻辑会被解析为:
(LastLogonTimeStamp ≤ 90天前) 且 (名称匹配第一个like规则) 或者 (名称匹配后续任意一个like规则)
这就导致只要设备名称匹配任意一个Name -like条件,无论它的登录时间是否超过90天,都会被纳入结果,这就是为什么会混入近2周登录的设备。
优化方案
方案1:修正Filter的逻辑括号
把所有名称匹配的-or条件用括号包裹,确保和时间条件是-and的关系:
$LastLogonDate = (Get-Date).AddDays(-90) Get-ADComputer -Filter {(LastLogonTimeStamp -le $LastLogonDate) -and (Name -like "office-*" -or Name -like "branch-*" -or Name -like "retail-*" ...)} ` -Properties LastLogonTimeStamp, Name, OperatingSystem | Export-Csv "c:\LastLogOn90Days.csv" -NoTypeInformation
方案2:拆分筛选逻辑(更直观不易出错)
先获取所有90天未登录的设备,再用Where-Object过滤名称,避免运算符优先级陷阱:
$LastLogonDate = (Get-Date).AddDays(-90) # 将所有需要保留的名称规则存入数组 $targetNamePatterns = @("office-*", "branch-*", "shop-*", ...) Get-ADComputer -Filter {LastLogonTimeStamp -le $LastLogonDate} ` -Properties LastLogonTimeStamp, Name, OperatingSystem | Where-Object { # 检查名称是否匹配任意一个规则 $targetNamePatterns | ForEach-Object { if ($_.Name -like $_) { return $true } } return $false } | Export-Csv "c:\LastLogOn90Days.csv" -NoTypeInformation
额外建议:更可靠的服务器排除方式
如果目标是排除服务器,相比名称筛选,通过操作系统属性判断更准确,可在Where-Object中添加:
$_.OperatingSystem -notlike "*Server*"
内容的提问来源于stack exchange,提问作者Chad Smith
相关产品推荐
相关产品推荐

