筛选mail属性已填写且proxyAddresses为空的AD用户
问题:筛选AD中mail已填写且proxyAddresses为空的用户
需求
获取所有mail属性已填写且proxyAddresses属性为空的AD用户列表。
最初尝试的实现步骤
- 先筛选mail属性不为空、且samAccountName符合特定命名规则的AD用户:
$ADUser = get-adUser -Properties Name,Mail,proxyAddresses -Filter {mail -like '*'} | Where {$_.samAccountname -match "(our naming scheme)"}
- 通过foreach循环结合if语句,进一步筛选proxyAddresses为空的用户:
foreach ($User in $ADUser) { if(($User).mail -ne $null -and ($User).proxyAddresses -eq $null) { $Users += $_.Name } }
遇到的问题
执行上述代码后,$Users变量始终无内容,即便循环内可以正常输出$User对象,也无法通过该逻辑筛选出proxyAddresses为空的用户。
可行的替代方案
调整筛选顺序,先获取proxyAddresses为空的用户,再检查mail属性是否非空:
- 先筛选proxyAddresses为空的AD用户:
$ADUser = Get-ADUser -Properties Name,Mail,proxyAddresses -Filter {-not(proxyAddresses -like '*')}
- 循环筛选mail属性非空的用户,并将结果导出到文件:
$result = foreach ($User in $ADUser) { if($User.mail -ne $null) { Write-Output($User).Name } } $result | Out-File -FilePath 'C:\temp\proxAddressesFilter.csv'
最初方案失败的原因
- proxyAddresses属性的特性:AD中的
proxyAddresses是多值属性,即便未设置任何值,它返回的也不是$null,而是一个空数组(@())。用-eq $null无法匹配空数组,正确的判断方式应为$User.proxyAddresses.Count -eq 0或-not $User.proxyAddresses。 - 循环内变量引用错误:在foreach循环中,代码使用了
$_.Name,但此处的$_并未指向当前循环的$User对象,正确的写法应为$User.Name,这也是$Users无法收集到内容的直接原因之一。
内容的提问来源于stack exchange,提问作者Trippin
相关产品推荐
相关产品推荐

