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

编写PowerShell脚本批量收集多台本地PC的远程桌面用户

批量收集多台本地PC的Remote Desktop Users组成员并导出CSV

原脚本存在几个影响功能和输出的问题:

  • Get-LocalGroupMember在普通Windows客户端(如Win10/11)远程调用时,需要目标PC开启WinRM且当前用户有足够权限,原脚本未处理连接失败等异常情况。
  • 函数返回值混合了对象和字符串,无法直接导出为结构化的CSV格式。
  • 仅在控制台打印结果,未实现导出到文件的需求。

以下是修正后的脚本,支持批量收集并导出规范的CSV报告:

function Get-RemoteDesktopUsers {
    param (
        [Parameter(Mandatory=$true)]
        [string]$ComputerName
    )

    # 初始化统一结构的结果对象
    $baseResult = [PSCustomObject]@{
        ComputerName = $ComputerName
        UserName     = $null
        UserType     = $null
        Status       = "Success"
    }

    try {
        # 获取Remote Desktop Users组成员,严格捕获错误
        $groupMembers = Get-LocalGroupMember -Group "Remote Desktop Users" -ComputerName $ComputerName -ErrorAction Stop

        if ($groupMembers) {
            foreach ($member in $groupMembers) {
                # 复制基础对象并填充用户信息
                $userResult = $baseResult.PSObject.Copy()
                $userResult.UserName = $member.Name
                # 区分用户/组类型
                $userResult.UserType = switch ($member.ObjectClass) {
                    "User" {
                        if ($member.Name -match "\\") { "Domain User" }
                        else { "Local User" }
                    }
                    "Group" { "Nested Group" }
                    default { $member.ObjectClass }
                }
                $userResult
            }
        }
        else {
            # 组存在但无成员
            $baseResult.UserName = "No members in group"
            $baseResult
        }
    }
    catch [Microsoft.PowerShell.Commands.GroupNotFoundException] {
        # 处理组不存在的情况
        $baseResult.Status = "Error"
        $baseResult.UserName = "Remote Desktop Users group not found"
        $baseResult
    }
    catch {
        # 处理连接失败、权限不足等其他错误
        $baseResult.Status = "Error"
        $baseResult.UserName = $_.Exception.Message
        $baseResult
    }
}

# 读取目标计算机列表(CSV需包含ComputerName列)
$csvFilePath = "C:\computers.csv"
$computerNames = Import-Csv -Path $csvFilePath | Select-Object -ExpandProperty ComputerName

# 批量收集所有结果
$allResults = @()
foreach ($computer in $computerNames) {
    Write-Host "Processing $computer..."
    $allResults += Get-RemoteDesktopUsers -ComputerName $computer
}

# 导出为UTF-8编码的CSV
$outputPath = "C:\RDUsers_Report.csv"
$allResults | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8

Write-Host "Report exported to $outputPath"

关键改进说明:

  • 结构化输出:所有结果统一为自定义对象,包含计算机名、用户名、用户类型、状态字段,确保CSV格式规范易读。
  • 全面错误处理:覆盖组不存在、远程连接失败、权限不足等多种异常,在报告中明确标记错误状态和原因。
  • 用户类型区分:自动识别本地用户、域用户和嵌套组,让报告信息更清晰。
  • 高效批量处理:统一收集结果后导出,避免逐行写入文件的性能损耗。

使用前准备:

  • 目标PC需开启WinRM服务,可在目标机执行Enable-PSRemoting -Force开启。
  • 执行脚本的用户需拥有目标PC的管理员权限,才能读取本地组信息。
  • computers.csv文件需包含ComputerName列,每行填写目标PC的名称或IP地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:00:13