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

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

关键优化说明

  1. 替换WMI为CIM:使用Get-CimInstance替代Get-WmiObject,符合PowerShell现代规范,兼容性更强
  2. 资源指标计算:
    • 内存直接从CIM对象的PrivateWorkingSetSize读取,无需额外关联Get-Process
    • CPU时间通过用户态+内核态时间总和计算,转为秒级单位
  3. 分组汇总逻辑:
    • 先按用户分组计算总资源占用
    • 再按用户+进程分组,汇总单用户下各进程的资源消耗
    • 将用户总资源关联到每条进程记录中
  4. 时间戳记录:新增DateTime列,记录统计执行的具体时间
  5. 数据过滤:移除无有效用户的系统进程,避免无效数据干扰

示例输出格式

"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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:10:33