用于计算每个用户的内存使用量的PowerShell脚本

时间:2017-10-27 03:51:40

标签: powershell

我们拥有240个虚拟机的环境。客户端使用ICA / RDP连接来连接这些服务器。有时用户会占用内存并导致特定服务器的速度减慢和崩溃。

我希望有一个PowerShell脚本来计算连接到服务器的每个用户的内存使用情况。我花了几个小时搜索并尝试不同的脚本,但没有成功。

一些脚本使用Get-WmiObject Win32_ProcessGetOwner()为我提供工作集值。但计算不正确。

我需要的是我可以在任务管理器的用户选项卡中看到的格式。我需要的主要信息是内存使用情况,但是每个用户的磁盘和CPU使用率也会很高。

这是我正在使用的代码。当我在一两分钟后运行这个脚本它返回一个错误,表示找不到$ .GetOwner()而在另一行中它给了我一个用户名,它比其他用户名更多,但计算不正确时我将它与TaskManager用户的标签进行比较。

$h = @{}
get-wmiobject win32_process | foreach { 
    $u = $_.getowner().user;
    if ( $u -ne $null)
    {
        if ( !$h.ContainsKey($u)  )
        {
            $h.add( $u, $_.WS);
        } 
        else 
        { 
            $h.item($u) = $h.item($u) + $_.WS;
        } 
    }
}  
$h.GetEnumerator() | sort value -desc

2 个答案:

答案 0 :(得分:0)

试试这个:

get-wmiobject win32_process | 
    select @{N='User';E={$_.getowner().user}}, WorkingSetSize  |
        group user | 
            select Name, @{N='CPU';E={($_.Group.WorkingSetSize  | Measure-Object -Sum).Sum / 1Mb  }}

答案 1 :(得分:0)

gwmi win32_process | 
    select @{N='User';E={$_.getowner().user}},WorkingSetSize | 
        group User | select Name,@{N='RAM';E={[math]::Round(($_.Group.WorkingSetSize | Measure-Object -Sum).Sum/1MB) }} | 
            sort RAM -Descending | select -first 1 ;