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

求助: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:52:52