如何通过编程获取Windows任务管理器「用户」标签页数据?
用PowerShell获取任务管理器「用户」标签页的资源数据
当然可以,你之前用Get-Process求和不对,核心是两个逻辑差异:
Get-Process的CPU属性是进程启动以来的累计CPU时间,不是任务管理器显示的实时使用率百分比- 任务管理器「用户」标签是按用户会话维度统计,要包含该会话下所有进程的实时资源占用,而非简单按用户名分组求和累计值
下面是匹配任务管理器展示逻辑的PowerShell实现:
核心思路
- 两次采样进程数据,通过时间差计算每个进程的实时CPU使用率
- 按用户名分组,统计每个用户的CPU使用率总和、内存占用总和
- 关联用户会话状态,还原任务管理器的展示字段
完整代码
# 第一次采样进程数据(记录初始CPU累计时间和内存) $initialProcesses = Get-Process -IncludeUserName | Select-Object Id, UserName, CPU, WorkingSet64 # 等待0.5秒,让CPU累计时间产生可计算的差值 Start-Sleep -Milliseconds 500 # 第二次采样进程数据 $finalProcesses = Get-Process -IncludeUserName | Select-Object Id, UserName, CPU, WorkingSet64 # 获取系统逻辑CPU核心数,用于换算CPU使用率百分比 $totalLogicalCores = (Get-CimInstance Win32_Processor).NumberOfLogicalProcessors | Measure-Object -Sum | Select-Object -ExpandProperty Sum # 计算每个进程的实时CPU使用率和内存占用 $processUsageData = foreach ($finalProc in $finalProcesses) { $initialProc = $initialProcesses | Where-Object { $_.Id -eq $finalProc.Id } if ($initialProc -and $finalProc.UserName) { # CPU使用率公式:(两次CPU时间差 / 时间间隔) / 总核心数 * 100 $cpuTimeDiff = $finalProc.CPU - $initialProc.CPU $cpuUsagePercent = ($cpuTimeDiff / 0.5) / $totalLogicalCores * 100 [PSCustomObject]@{ UserName = $finalProc.UserName CPUUsage = [Math]::Round($cpuUsagePercent, 2) MemoryMB = [Math]::Round($finalProc.WorkingSet64 / 1MB, 2) } } } # 按用户名分组统计,并补充会话状态 $userResourceStats = $processUsageData | Group-Object UserName | ForEach-Object { # 获取用户会话状态 $sessionState = (Get-CimInstance Win32_LogonSession | Where-Object { $_.UserName -eq $_.Name } | Select-Object -ExpandProperty Status -First 1) ?? "Unknown" [PSCustomObject]@{ 用户名 = $_.Name 会话状态 = $sessionState 总CPU使用率(%) = [Math]::Round(($_.Group.CPUUsage | Measure-Object -Sum).Sum, 2) 总内存使用率(MB) = [Math]::Round(($_.Group.MemoryMB | Measure-Object -Sum).Sum, 2) } } # 格式化输出,和任务管理器展示逻辑一致 $userResourceStats | Format-Table 用户名, 会话状态, 总CPU使用率(%), 总内存使用率(MB) -AutoSize
补充说明
- 内存统计用
WorkingSet64,对应任务管理器的「内存(工作集)」;如果要匹配其他内存维度,可替换为PrivateMemorySize64(私有工作集)或VirtualMemorySize64(虚拟内存) - 两次采样的时间间隔可调整(比如改成1秒),间隔越长CPU使用率计算越稳定,但实时性会降低
- 会话状态通过
Win32_LogonSession获取,和任务管理器的「会话状态」字段匹配
内容的提问来源于stack exchange,提问作者tjlds
相关产品推荐
相关产品推荐

