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

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

问题原因及修复方案

错误根源

  1. 字符串截取逻辑不可靠:依赖$env:ComputerName.Length+1计算截取长度,但如果用户是域用户(格式为DOMAIN\user),或者本地用户名前缀并非当前计算机名,会导致截取长度错误,抛出字符串操作异常。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:10:38