You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:22:25