PowerShell 2环境下获取本地组内本地用户并排除DC域用户的咨询
PowerShell 2.0 本地组内本地账户查询实现方案
原命令的问题根因
原命令通过GetRelated('Win32_UserAccount')获取管理员组成员时,未对账户的归属域做校验,会自动把被添加到本地管理员组的域账户、域组一并返回,无法匹配仅统计本地内置账户的需求。
可落地实现方法
方法1:基于Win32_GroupUser关联类精准过滤(原生WMI能力,无额外依赖)
Win32_GroupUser是记录本地组与成员关联关系的专用WMI类,可通过成员路径中的域标识字段,直接过滤掉域侧账户,完全适配PowerShell 2.0的语法兼容性。
可直接执行的命令如下:
# 获取本机计算机名作为本地账户的唯一域标识 $localMachineName = $env:COMPUTERNAME # 匹配本地管理员组的关联成员记录 gwmi Win32_GroupUser -Filter "GroupComponent=""Win32_Group.Domain='$localMachineName',Name='Administrators'""" | ForEach-Object { # 解析成员路径,识别是否为用户类型(自动排除嵌套的本地组、域组) if ($_.PartComponent -match "Win32_UserAccount\.Domain='(?<domain>[^']+)',Name='(?<name>[^']+)'") { # 仅保留域标识与本机一致的本地账户,过滤所有域侧同步的账户 if ($matches.domain -eq $localMachineName) { $resultObj = New-Object PSObject $resultObj | Add-Member NoteProperty 账户名 $matches.name $resultObj | Add-Member NoteProperty 账户归属 $matches.domain $resultObj } } } | Select-Object 账户名
方法2:基于系统原生命令解析(执行更轻量,无WMI服务依赖)
PowerShell 2.0可直接调用系统自带的net localgroup命令获取本地组列表,通过文本规则分割筛选本地账户,不受WMI服务异常的影响。
可直接执行的命令如下:
# 提取net命令输出的成员段落,剔除标题、分隔线等无效行 net localgroup Administrators | Select-Object -Skip 4 | Where-Object { $_.Trim() -ne '' } | ForEach-Object { # 按输出格式匹配纯本地账户行(域账户会标注域名/NetBIOS路径,带斜杠标识,本地账户为纯名称格式) if ($_.Trim() -match '^(?<accountName>[a-zA-Z0-9_\-\.]+)$') { $resultObj = New-Object PSObject $resultObj | Add-Member NoteProperty 账户名 $matches.accountName $resultObj } } | Select-Object 账户名
注意事项
- 两种方法的过滤逻辑都会严格校验账户的归属域是否等于本机计算机名,不会返回域控侧的域用户、域组账户
- 方法1的结构稳定性更强,不受系统语言版本对net命令输出文本格式的影响;方法2的执行速度更快,WMI权限不足的场景下也能正常使用
- 如需查询其他本地组(如Users、Power Users),仅需将命令中的
Administrators替换为对应本地组的名称即可
内容的提问来源于stack exchange,提问作者Help
相关产品推荐
相关产品推荐

