Проблема в том, что класс 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