Как получить память (частный рабочий набор) для пользователей в powershell - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь получить использование памяти процессом для пользователя (например, диспетчер задач), эта информация поступает в память (частный рабочий набор), если мы конвертируем эти значения в МБ, мы должны получить использование памяти, как у пользователей просмотр в диспетчере задач ...

Может быть, я что-то упустил, если кто-то знает об этом, пожалуйста, скажите мне.

А это мой сценарий

Get-WmiObject Win32_Process | Sort-Object -Property privatememorysize -Descending | 
Select processname, @{Name="Mem Usage(MB)";Expression={[math]::round($_.privatememorysize/ 1mb,2)}},@{Name="UserID";Expression={$_.getowner().Domain+"\"+$_.getowner().user}} | fl *

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Проблема в том, что класс Win32_Process не имеет свойства с именем 'privatememorysize'. Замена на 'privatepagecount' вместо этого делает эту работу ожидаемой.

Get-WmiObject Win32_Process | Sort-Object -Property privatepagecount -Descending | 
    Select processname, @{Name="Mem Usage(MB)";Expression={[math]::round($_.privatepagecount/ 1mb,2)}},@{Name="UserID";Expression={$_.getowner().Domain+"\"+$_.getowner().user}}

Я вижу, что это не то же самое, поэтому у нас есть проблема, когда объект WMI недать частный рабочий набор и другие методы, которые включают пользователя, у которого нет пользователя.Поэтому мы можем использовать Get-Process для получения каждого процесса и частного рабочего набора, а также Get-WMIObject, чтобы связать пользователя с каждым объектом, а затем сопоставить их.Вероятно, лучше всего создать хеш-таблицу из одной ссылки, а затем использовать ее для добавления свойства к другому объекту.Итак, давайте сделаем это!

#Get WMI Process objects
$WMIProcs = Get-WmiObject Win32_Process
#Get Get-Process object
$GPProcs = Get-Process
#Convert Get-Process objects to a hashtable for easy lookup
$GPHT = @{}
$GPProcs | ForEach-Object {$GPHT.Add($_.ID.ToString(),$_)}
#Add PrivateWorkingSet and UserID to WMI objects
$WMIProcs|ForEach-Object{ 
    $_ | Add-Member "Mem Usage(MB)" $([math]::round($GPHT[$_.ProcessId.ToString()].PrivateMemorySize64/1mb,2))
    $_ | Add-Member "UserID" $($_.getowner().Domain+"\"+$_.getowner().user)
}
#Output to screen
$WMIProcs | Format-Table ProcessName, "Mem Usage(MB)", UserID
0 голосов
/ 28 мая 2019

Попробуйте использовать WorkingSetSize вместо PrivateMemorySize.

Get-WmiObject Win32_Process | Sort-Object -Property WorkingSetSize -Descending | 
Select processname, @{Name="Mem Usage(MB)";Expression={[math]::round($_.WorkingSetSize / 1mb,2)}},@{Name="UserID";Expression={$_.getowner().Domain+"\"+$_.getowner().user}} | FL
...