PowerShell查询AD已启用且密码未过期用户筛选异常解决方法
问题原因
筛选完全失效的核心是类型匹配错误:PasswordExpired是AD返回的原生布尔(Boolean)类型属性,取值只能是PowerShell布尔常量$true/$false,你在筛选时给判断值加了双引号,写成了字符串类型的"True"/"False"。
PowerShell做相等判断时会优先按左侧值的类型做隐式转换:当布尔值和非空字符串做比较时,无论字符串内容是什么,都会被转换为$true,相当于你的筛选条件恒成立,所以不管写"True"还是"False",返回结果都完全一致。
另外你命令中用-properties *拉取用户所有属性的写法效率极低,用户量大时查询会非常慢,只需要声明实际用到的属性即可。
正确查询命令
筛选「账户启用、密码未过期」用户的正确命令如下:
Get-ADUser -Filter { Enabled -eq $true } -Properties DisplayName, EmailAddress, PasswordExpired, PasswordNeverExpires | Where-Object { $_.PasswordExpired -eq $false } | Select-Object DisplayName, EmailAddress, PasswordExpired | Sort-Object DisplayName
补充说明
- 如果你希望把设置了密码永不过期的用户也排除在结果外,就在
Where-Object的判断条件里加一条-and $_.PasswordNeverExpires -eq $false即可;如果需要包含这类用户,保留现有写法就行。 - 所有布尔值判断不要给
$true/$false加引号,否则会再次触发类型不匹配的筛选失效问题。 - 只在
-Properties参数后声明你需要用到的非默认属性,不要拉取全量属性,能大幅提升查询速度。 - 如果需要限制返回结果数量,加上
-ResultSetSize 数量参数即可,要返回全部符合条件的用户直接删掉这个参数。
内容的提问来源于stack exchange,提问作者jaludn
相关产品推荐
相关产品推荐

