PowerShell脚本问题:Get-LocalGroupMember用户名带计算机名致匹配失败
管理员组用户匹配与脚本执行错误解决
问题场景
需要实现脚本逻辑:遍历本地管理员组的所有用户,若用户存在于指定文本文件或排除列表中则跳过,否则将其从管理员组移除。但Get-LocalGroupMember返回的用户名带计算机名前缀(如DESKTOP-XXX\user1),无法与文本文件中的纯用户名(如user1)直接匹配。尝试通过截取字符串去除前缀后,脚本抛出系统错误。
原脚本
$GroupName = "Administrators" $Exclude = "Administrator","$env:UserName" $AuthorizedAdmins = Get-Content C:\Users\$env:UserName\admins.txt Get-LocalGroupMember $GroupName | ForEach-Object{ if ($_.ObjectClass -eq 'User'){ if ($AuthorizedAdmins -contains $_.Name -or $Exclude -contains $_.Name){ Continue } else{ Remove-LocalGroupMember -Group $GroupName -Member $_.Name -Confirm } } }
修改后报错的脚本及错误信息
修改后的脚本
$GroupName = "Administrators" $Exclude = "Administrator","$env:UserName" $AuthorizedAdmins = Get-Content C:\Users\$env:UserName\admins.txt Get-LocalGroupMember $GroupName | ForEach-Object{ $User = $_.Name $length = $env:ComputerName.Length+1 $ShortUser = $User.Remove(0,$length) if ($_.ObjectClass -eq 'User'){ #ignore groups and select only users if ($AuthorizedAdmins -contains $ShortUser -or $Exclude -contains $ShortUser){ Continue } else{ Remove-LocalGroupMember -Group $GroupName -Member $_.Name -Confirm } } }
错误信息
Get-LocalGroupMember : System error. At users.ps1:6 char:1 + Get-LocalGroupMember $GroupName | + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Get-LocalGroupMember], ContinueException + FullyQualifiedErrorId : An unspecified error occurred.,Microsoft.PowerShell.Commands.GetLocalGroupMemberCommand
问题原因及修复方案
错误根源
- 字符串截取逻辑不可靠:依赖
$env:ComputerName.Length+1计算截取长度,但如果用户是域用户(格式为DOMAIN\user),或者本地用户名前缀并非当前计算机名,会导致截取长度错误,抛出字符串操作异常。 Continue命令误用:在ForEach-Object的脚本块中使用Continue会触发ContinueException,进而中断Get-LocalGroupMember的执行流程。
修复后的脚本
$GroupName = "Administrators" $Exclude = "Administrator", $env:UserName $AuthorizedAdmins = Get-Content C:\Users\$env:UserName\admins.txt # 先过滤出管理员组中的用户对象,再遍历处理 Get-LocalGroupMember -Group $GroupName | Where-Object { $_.ObjectClass -eq 'User' } | ForEach-Object { # 提取纯用户名:通过反斜杠分割,取最后一段 $pureUserName = $_.Name.Split('\')[-1] # 检查是否在授权列表或排除列表中 if ($AuthorizedAdmins -contains $pureUserName -or $Exclude -contains $pureUserName) { # 使用return跳过当前对象,替代Continue避免异常 return } # 移除未授权用户,-Confirm可根据需求改为-Confirm:$false取消确认提示 Remove-LocalGroupMember -Group $GroupName -Member $_.Name -Confirm }
关键修改说明
- 可靠提取用户名:使用
Split('\')[-1]分割用户名,无论前缀是计算机名还是域名,都能准确获取纯用户名,避免因格式变化导致的截取错误。 - 替换
Continue为return:在ForEach-Object中用return跳过当前迭代对象,不会触发异常,保证脚本流程稳定。 - 提前过滤用户对象:通过
Where-Object先筛选出ObjectClass为User的成员,减少后续逻辑嵌套,提升可读性。
内容的提问来源于stack exchange,提问作者Pupstrr
相关产品推荐
相关产品推荐

