PowerShell 2 如何仅查询本地禁用用户账户
适配PowerShell 2的本地禁用用户账户查询方法
原命令的核心问题是未对账户的归属做过滤:Win32_UserAccount类在域环境下默认会枚举当前主机可关联的所有域内账户条目,不增加筛选规则的话,自然会把域用户和本地用户混在结果里返回。
最高效的改造方案
直接在WMI查询层完成本地账户、禁用状态的双重筛选,完全适配PowerShell 2原生环境,没有任何额外依赖:
Get-WmiObject Win32_UserAccount -Filter "LocalAccount = True AND Disabled = True" | Select-Object Name, Disabled, Domain
- 该写法直接把筛选规则传给WMI引擎,不需要把全量的本地+域账户条目全部拉回PowerShell pipeline 做二次过滤,查询速度远高于原写法,哪怕域环境下关联的用户条目数量很多也能快速返回结果
LocalAccount = True是Win32_UserAccount类的原生属性,专门标记存储在本地SAM数据库中的账户,会自动排除所有来自域控制器的域用户条目- 筛选逻辑直接在WMI层做布尔值判断,避免了原写法把Disabled属性和字符串"True"比较的类型转换隐患
老旧系统兜底方案
如果遇到个别低版本Windows上WMI属性异常的情况,可以用本机计算机名匹配的规则做本地端筛选,逻辑可靠性拉满:
Get-WmiObject Win32_UserAccount | Where-Object { # 仅保留Domain字段匹配当前主机名的本地账户,再叠加禁用状态判断 $_.Domain -eq $env:COMPUTERNAME -and $_.Disabled -eq $true } | Select-Object Name, Disabled
注意事项
- 整个流程用到的
Get-WmiObject、Where-Object、Select-Object都是PowerShell 2自带的原生cmdlet,不需要安装RSAT工具、AD模块,也不依赖更高版本PowerShell才新增的CIM相关命令,在受限环境下可以直接运行 - 不要混用PowerShell 3.0以上才引入的
Get-CimInstance命令,否则在PowerShell 2环境下会直接报“找不到命令”的错误
内容的提问来源于stack exchange,提问作者Help
相关产品推荐
相关产品推荐

