如何程序化提取Windows Server 2022各用户的资源使用数据?
解决方案
PowerShell 脚本方案
Windows下可以用PowerShell实现程序化提取所需数据,以下是可直接运行的脚本(需管理员权限执行):
核心脚本(含30秒自动更新)
while ($true) { # 获取总物理内存(单位:GB) $totalPhysicalRAM = (Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB # 获取用户会话信息(用户名、UserID、状态) $userSessions = quser | Select-Object -Skip 1 | ForEach-Object { $fields = $_ -split '\s+' | Where-Object { $_ -ne '' } [PSCustomObject]@{ Username = $fields[0] UserID = $fields[1] State = $fields[2] } } # 采样两次计算实时CPU占用 $firstProcSample = Get-Process -IncludeUserName | Select-Object UserName, CPU, Id Start-Sleep -Seconds 1 $secondProcSample = Get-Process -IncludeUserName | Select-Object UserName, CPU, Id $cpuUsageData = Compare-Object $firstProcSample $secondProcSample -Property Id, CPU -PassThru | Group-Object -Property UserName | ForEach-Object { $totalCpuDelta = ($_.Group | ForEach-Object { $firstProc = $firstProcSample | Where-Object { $_.Id -eq $_.Id } $_.CPU - $firstProc.CPU } | Measure-Object -Sum).Sum $logicalCores = (Get-CimInstance Win32_Processor).NumberOfLogicalProcessors $cpuPercent = ($totalCpuDelta / $logicalCores) * 100 [PSCustomObject]@{ Username = $_.Name CPUUsagePercent = [math]::Round($cpuPercent, 2) } } # 计算用户内存占用并合并所有数据 $userResourceData = foreach ($session in $userSessions) { $userProcesses = Get-Process -IncludeUserName | Where-Object { $_.UserName -eq $session.Username } $totalRAMBytes = ($userProcesses | Measure-Object WorkingSet -Sum).Sum $ramUsageMB = [math]::Round($totalRAMBytes / 1MB, 2) $ramUsagePercent = [math]::Round(($totalRAMBytes / ($totalPhysicalRAM * 1GB)) * 100, 2) $cpuPercent = ($cpuUsageData | Where-Object { $_.Username -eq $session.Username }).CPUUsagePercent ?? 0 [PSCustomObject]@{ Username = $session.Username UserID = $session.UserID State = $session.State RAM占用量(MB) = $ramUsageMB RAM占用百分比(%) = $ramUsagePercent CPU占用百分比(%) = $cpuPercent } } # 输出格式化表格 Clear-Host Write-Host "用户资源使用情况(每30秒更新)" -ForegroundColor Cyan $userResourceData | Format-Table -AutoSize Start-Sleep -Seconds 29 # 加上之前的1秒采样,总间隔30秒 }
说明
quser:获取用户会话的基本信息(UserID、状态等)Get-Process -IncludeUserName:获取所有进程及所属用户,需管理员权限- 实时CPU计算:通过1秒间隔的两次采样差值,换算为CPU占用百分比
- 循环+
Start-Sleep:实现每30秒自动更新数据
替代方案
1. WMI/CIM 命令行
可直接调用WMI类获取更底层的数据,适合整合到自动化脚本:
# 获取用户会话 Get-CimInstance Win32_LogonSession | Where-Object { $_.LogonType -eq 2 -or $_.LogonType -eq 10 } | ForEach-Object { $user = Get-CimAssociatedInstance -InputObject $_ -ResultClassName Win32_UserAccount [PSCustomObject]@{ Username = $user.Name UserID = $_.LogonId State = if ($_.Status -eq "OK") { "活跃" } else { "断开" } } }
后续可关联Win32_Process类计算资源占用,逻辑和PowerShell脚本类似。
2. 自定义.NET程序
如果需要更灵活的集成(比如直接对接仪表盘),可以用C#编写小工具:
- 用
System.Diagnostics.Process类获取进程资源数据 - 用
System.DirectoryServices.AccountManagement类关联用户会话 - 定时任务触发数据采集,输出为JSON/CSV格式供仪表盘读取
3. Windows性能监视器(PerfMon)
- 创建数据收集器集,添加
Process类下的% Processor Time、Working Set计数器,按用户分组 - 设置每30秒采样,将数据导出到CSV文件
- 仪表盘程序定时读取CSV文件展示数据
内容的提问来源于stack exchange,提问作者LucasMation
相关产品推荐
相关产品推荐

