求助:PowerShell使用Get-ADUser排除Health前缀AD用户失效问题
问题排查与解决
你的代码无法过滤掉名称以Health开头的用户,核心原因是**-notin运算符只支持精确匹配,不识别通配符***。你定义的$ADExcludedUser = 'Health*'是带通配符的字符串,-notin会把它当作完整字符串去比对,自然匹配不到目标用户。
修正方案
方案1:使用-notlike匹配通配符
-like/-notlike是PowerShell原生支持通配符的匹配运算符,直接用它过滤名称前缀即可:
$DaysInactive = 180 $Time = (Get-Date).Adddays(-$DaysInactive) # 只获取需要的属性,避免用-Properties *浪费性能 $AllUsers = Get-ADUser -Filter { LastLogonTimeStamp -lt $Time -and enabled -eq $true } -Properties LastLogonDate | Select-Object Name, LastLogonDate | Sort-Object Name $AllUsersExceptExcluded = $AllUsers | Where-Object { $_.Name -notlike 'Health*' } | Out-GridView
方案2:正则表达式匹配(适配多排除规则)
如果后续需要排除多个前缀的用户,用-notmatch结合正则表达式更灵活,比如同时排除Health和Test开头的用户:
$DaysInactive = 180 $Time = (Get-Date).Adddays(-$DaysInactive) $AllUsers = Get-ADUser -Filter { LastLogonTimeStamp -lt $Time -and enabled -eq $true } -Properties LastLogonDate | Select-Object Name, LastLogonDate | Sort-Object Name # 正则^表示字符串开头,|表示逻辑或 $AllUsersExceptExcluded = $AllUsers | Where-Object { $_.Name -notmatch '^(Health|Test)' } | Out-GridView
额外优化建议
- 避免使用
-Properties *,明确指定需要的属性(比如这里的LastLogonDate),能大幅提升查询效率,降低AD服务器负载。 - 如果排除前缀较多,可存入数组循环判断:
$excludedPrefixes = 'Health*', 'Test*' $AllUsersExceptExcluded = $AllUsers | Where-Object { $userName = $_.Name # 检查是否匹配任何排除前缀,取反输出 -not ($excludedPrefixes | Where-Object { $userName -like $_ }) } | Out-GridView
内容的提问来源于stack exchange,提问作者chkdsk
相关产品推荐
相关产品推荐

