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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:15:48