编写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
相关产品推荐
相关产品推荐

