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

求助:通过PowerShell远程获取本地用户及其所属组信息

高效远程获取目标计算机本地用户及其所属组信息

我之前帮别人处理过类似的问题,你用Get-LocalUser、Get-LocalGroupMember或者直接调用WMI逐个查询的方式,确实会因为频繁建立远程连接、冗余数据返回导致速度拖沓,而且信息整理起来也麻烦。这里有个优化方案,通过CIM会话复用+关联查询的方式,大幅提升效率,同时输出你需要的格式:

优化后的PowerShell脚本

param(
    [Parameter(Mandatory=$true)]
    [string]$ComputerName
)

# 建立持久化CIM会话,减少重复远程连接开销
try {
    $cimSession = New-CimSession -ComputerName $ComputerName -ErrorAction Stop
    
    # 只查询启用的本地用户(可根据需求调整过滤条件)
    $localUsers = Get-CimInstance -CimSession $cimSession -ClassName Win32_UserAccount `
        -Filter "LocalAccount='True' AND Disabled='False'"
    
    # 一次性获取所有用户-组关联关系
    $userGroupLinks = Get-CimInstance -CimSession $cimSession -ClassName Win32_GroupUser
    
    # 获取所有本地组信息
    $localGroups = Get-CimInstance -CimSession $cimSession -ClassName Win32_Group `
        -Filter "LocalAccount='True'"
    
    # 构建用户与所属组的映射表
    $userGroupMap = @{}
    foreach ($link in $userGroupLinks) {
        # 从WMI路径中提取用户名和组名
        $userName = ($link.PartComponent -split '="')[1].TrimEnd('"')
        $groupName = ($link.GroupComponent -split '="')[1].TrimEnd('"')
        
        # 确保用户是我们要查询的本地用户
        if ($localUsers.Name -contains $userName) {
            if (-not $userGroupMap.ContainsKey($userName)) {
                $userGroupMap[$userName] = @()
            }
            $userGroupMap[$userName] += $groupName
        }
    }
    
    # 格式化输出为指定表格样式
    $result = $userGroupMap.GetEnumerator() | ForEach-Object {
        [PSCustomObject]@{
            User = $_.Key
            Memberof = $_.Value -join ', '
        }
    }
    
    # 显示结果,如需导出可追加 | Export-Csv -Path "LocalUserGroups.csv" -NoTypeInformation
    $result | Format-Table -AutoSize
}
catch {
    Write-Error "远程连接或查询失败:$_"
}
finally {
    # 清理CIM会话
    if ($cimSession) {
        Remove-CimSession -CimSession $cimSession
    }
}

为什么这个脚本更快?

  • 复用CIM会话:New-CimSession建立一次远程连接后,所有查询都复用这个连接,避免了每次查询都重新握手的开销
  • 关联查询减少调用:通过Win32_GroupUser直接获取用户和组的绑定关系,不需要循环遍历每个用户再查询其所属组,减少了N次远程调用
  • 过滤冗余数据:通过Filter只获取启用的本地用户,避免返回系统内置的特殊用户(比如Guest、默认Administrator,可根据需求修改Filter)

使用说明

  1. 确保目标计算机已启用WinRM:如果未启用,可在目标机执行Enable-PSRemoting -Force(需要管理员权限)
  2. 运行脚本时指定目标计算机名:.\Get-RemoteLocalUserGroups.ps1 -ComputerName "TargetPC01"
  3. 如果需要导出结果到CSV,在Format-Table前追加| Export-Csv -Path "你的文件路径.csv" -NoTypeInformation

内容的提问来源于stack exchange,提问作者Uddhav Ghanekar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:28:52