Windows Server 2016多远程用户CPU与内存统计脚本优化求助
优化Windows Server多用户资源统计PowerShell脚本
核心需求实现
- 按用户汇总内存使用总量
- 添加CPU资源使用统计(进程级及用户级汇总)
- 记录统计时间戳
- 输出结构化CSV文件
优化后的PowerShell脚本
# 记录统计时间 $statsTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss" # 获取进程信息及所有者,计算核心资源指标 $processData = Get-CimInstance Win32_Process | ForEach-Object { $owner = $_.GetOwner() [PSCustomObject]@{ DateTime = $statsTime UserID = "$($owner.Domain)\$($owner.User)" ProcessName = $_.Name "Mem Usage(MB)" = [math]::Round($_.PrivateWorkingSetSize / 1MB, 2) "CPU Time(Seconds)"= [math]::Round(($_.UserModeTime + $_.KernelModeTime)/10000000, 2) } } | Where-Object { $_.UserID -ne "\" } # 过滤无有效用户的进程 # 计算每个用户的总内存和总CPU $userTotals = $processData | Group-Object UserID | ForEach-Object { [PSCustomObject]@{ UserID = $_.Name "Total Used Memory(MB)" = [math]::Round(($_.Group | Measure-Object "Mem Usage(MB)" -Sum).Sum, 2) "Total CPU Time(Seconds)" = [math]::Round(($_.Group | Measure-Object "CPU Time(Seconds)" -Sum).Sum, 2) } } # 按用户+进程分组汇总,关联用户总资源 $finalData = $processData | Group-Object UserID, ProcessName | ForEach-Object { $user = ($_.Name -split ", ")[0] $userTotal = $userTotals | Where-Object { $_.UserID -eq $user } [PSCustomObject]@{ DateTime = $statsTime ProcessName = ($_.Name -split ", ")[1] "Mem Usage(MB)" = [math]::Round(($_.Group | Measure-Object "Mem Usage(MB)" -Sum).Sum, 2) "CPU Time(Seconds)" = [math]::Round(($_.Group | Measure-Object "CPU Time(Seconds)" -Sum).Sum, 2) UserID = $user "Total Used Memory(MB)" = $userTotal."Total Used Memory(MB)" "Total CPU Time(Seconds)" = $userTotal."Total CPU Time(Seconds)" } } # 输出到CSV(-Append参数可实现追加记录,若需覆盖则移除) $finalData | Export-Csv -Path "C:\users\abc\Music\user_resource_stats.csv" -NoTypeInformation -Append -Encoding UTF8
关键优化说明
- 替换WMI为CIM:使用
Get-CimInstance替代Get-WmiObject,符合PowerShell现代规范,兼容性更强 - 资源指标计算:
- 内存直接从CIM对象的
PrivateWorkingSetSize读取,无需额外关联Get-Process - CPU时间通过用户态+内核态时间总和计算,转为秒级单位
- 内存直接从CIM对象的
- 分组汇总逻辑:
- 先按用户分组计算总资源占用
- 再按用户+进程分组,汇总单用户下各进程的资源消耗
- 将用户总资源关联到每条进程记录中
- 时间戳记录:新增
DateTime列,记录统计执行的具体时间 - 数据过滤:移除无有效用户的系统进程,避免无效数据干扰
示例输出格式
"DateTime","ProcessName","Mem Usage(MB)","CPU Time(Seconds)","UserID","Total Used Memory(MB)","Total CPU Time(Seconds)" "2024-05-20 14:30:00","chrome.exe","160.69","12.45","abc\Administrator","165.07","14.64" "2024-05-20 14:30:00","kavtray.exe","4.38","2.19","abc\Administrator","165.07","14.64" "2024-05-20 14:30:00","chrome.exe","544.55","36.21","abc\bms","604.98","45.72" "2024-05-20 14:30:00","MFAUClient.exe","60.43","9.51","abc\bms","604.98","45.72"
内容的提问来源于stack exchange,提问作者sajjad muslim
相关产品推荐
相关产品推荐

