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

如何程序化提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:36:04