PowerShell筛选AD用户疑问:两段脚本为何结果不同?
问题原因
两个脚本筛选结果不同,核心在于AD属性的返回类型和Select-Object的处理逻辑:
- 第一个脚本里,你明确指定要获取
uht-IdentityManagement-AccountType属性,AD模块会直接返回该属性的字符串值,用-ne "N"比较时能精准过滤掉N类型记录。 - 第二个脚本用
-Properties *拉取所有AD属性,这时候uht-IdentityManagement-AccountType会被返回成ADPropertyValueCollection对象(哪怕它是单值属性)。经过Select-Object提取后,你拿这个对象和字符串"N"做-ne比较,结果永远是$true——哪怕对象里的实际值是"N",也会被判定为不等于"N",所以筛选完全失效,两种类型的记录都留了下来。
修复方法
给你三个可行的修复方案:
方案1:强制转为字符串后比较
在Where-Object里把属性值转成字符串再做判断:
Get-Content "MembersMS.txt" | ForEach-Object {Get-ADUser -Identity $_ -Properties * | select name, uht-IdentityManagement-AccountType} | Where-Object {([string]$_['uht-IdentityManagement-AccountType'] -ne "N")}
方案2:明确指定所需属性(推荐)
既然你只需要name和uht-IdentityManagement-AccountType,直接指定属性列表既避免类型问题,又能提升脚本速度(拉所有属性会慢很多):
Get-Content "MembersMS.txt" | ForEach-Object {Get-ADUser -Identity $_ -Properties name, uht-IdentityManagement-AccountType | select name, uht-IdentityManagement-AccountType} | Where-Object {($_['uht-IdentityManagement-AccountType'] -ne "N")}
方案3:在Select时转成字符串
通过计算属性把AD属性对象直接转成字符串:
Get-Content "MembersMS.txt" | ForEach-Object { Get-ADUser -Identity $_ -Properties * | select name, @{Name='uht-IdentityManagement-AccountType'; Expression={[string]$_.uht-IdentityManagement-AccountType}} } | Where-Object {($_['uht-IdentityManagement-AccountType'] -ne "N")}
内容的提问来源于stack exchange,提问作者Don
相关产品推荐
相关产品推荐

