Get-ADUser -Filter参数异常:符合条件的AD用户查询结果为0
AD用户统计命令Filter参数问题排查
问题根源
Get-ADUser的-Filter参数采用LDAP过滤语法,而非PowerShell原生的正则/通配符规则。你写的*[0-9][0-9]在LDAP过滤逻辑中,不会被解析为“以两位数字结尾”,而是被当作字面字符匹配(即匹配包含[0-9][0-9]字符串的账号),自然无法命中目标用户。
解决方法
方法1:移至Where-Object做精确匹配(推荐)
将SamAccountName的匹配逻辑放到PowerShell的Where-Object中,用正则表达式实现“两位数字结尾”的判断,同时保留UserParameters的空值筛选:
$var1 = Get-ADUser -Filter * -SearchBase "OU=xxxxxxxxxxxxxx,DC=xxxxxxx,DC=xx" | Where-Object { $_.SamAccountName -match '\d{2}$' -and $_.UserParameters -eq $null } $var1.Count
其中\d{2}$是PowerShell正则表达式,精准匹配“以两位数字结尾”的字符串。
方法2:使用LDAP原生过滤语法(繁琐但精准)
如果必须在AD层面过滤,可通过LDAP的多OR条件枚举00-99的结尾组合:
# 构建包含00-99所有结尾的LDAP过滤规则 $ldapFilter = "(|" + (0..99 | ForEach-Object { "(SamAccountName=*$($_ -as [string].PadLeft(2,'0')))" }) + ")" $var1 = Get-ADUser -LDAPFilter $ldapFilter -SearchBase "OU=xxxxxxxxxxxxxx,DC=xxxxxxx,DC=xx" | Where-Object { $_.UserParameters -eq $null } $var1.Count
性能优化版
若担心全量查询性能,可先用LDAP过滤缩小范围(比如筛选账号长度至少为2位),再用正则做精确匹配:
$var1 = Get-ADUser -Filter { SamAccountName -like "*??" } -SearchBase "OU=xxxxxxxxxxxxxx,DC=xxxxxxx,DC=xx" | Where-Object { $_.SamAccountName -match '\d{2}$' -and $_.UserParameters -eq $null } $var1.Count
内容的提问来源于stack exchange,提问作者cosmo_
相关产品推荐
相关产品推荐

