2016-03-24 4 views
1

Ich versuche gleiche Liste von Prozess zu erhalten, wie in der Task-Manager in Windows 2008 ServerGet Liste der Prozesse gleichen wie in der Task-Managern in Powershell-Konsole

enter image description here

ich einige Werte nicht einmal bekommen kann B. von WMI-Objekten wie CPU-Zeit, UAC-Virtualisierung, Benutzername (z. B. Prozesseigner), Benutzerobjekten, CPU-Auslastung, allen Speicherspalten, Handles und Threads.

Hier einige Stück Code ich es

Clear-Host 

$Processes = Get-Process 
foreach ($Process in $Processes) { 
$PIDN = $Process.Id 
$NAMEProcess = $Process.Name 
$NAME = (Get-WmiObject Win32_Process | where {$_.Name -match $NAMEProcess}).Name 
$PATH = (Get-WmiObject Win32_Process | where {$_.Name -match $NAMEProcess}).Path 
$CMD = (Get-WmiObject Win32_Process | where {$_.Name -match $NAMEProcess}).CommandLine 

$OWNER = (Get-WmiObject win32_process | where {$_.Name -match $NAMEProcess}).getowner().user 
$SESSIONID = (Get-WmiObject Win32_Process | where {$_.Name -match $NAMEProcess}).SessionId 
$CPU = $Process.CPU 
$WORKINGSET64 = $Process.WorkingSet64 
$PEAKWORKINGSET64 = $Process.PeakWorkingSet64 
$THREADS = $Process.Threads.Count 
$HANDLES = $Process.Handles 
$DESCRIPTION = $Process.Description 

$obj = new-object psobject 
$obj | add-member noteproperty "PID" ($PIDN) 
$obj | add-member noteproperty "NAME" ($NAME) 
$obj | add-member noteproperty "OWNER" ($OWNER) 
$obj | add-member noteproperty "PATH" ($PATH) 
$obj | add-member noteproperty "Command Line" ($CMD) 
$obj | Add-Member noteproperty "SessionID" ($SESSIONID) 
$obj | Add-Member noteproperty "CPU" ($CPU) 
$obj | Add-Member noteproperty "WorkingSet64" ($WORKINGSET64) 
$obj | Add-Member noteproperty "Peak Working Set64" ($PEAKWORKINGSET64) 
$obj | Add-Member noteproperty "HANDLES" ($HANDLES) 
$obj | Add-Member noteproperty "THREADS" ($THREADS) 
$obj | Add-Member noteproperty "DESCRIPTION" ($DESCRIPTION) 

write-output $obj | Format-Table 
# $obj | Format-Table $PIDN, $NAME 
} 

auch arbeiten zu machen gemacht versucht, es nicht zur Ausgabe in der richtigen Tabelle machen könnte. Könnten Sie mir bitte dabei helfen? Vielen Dank.

Antwort

1

Haben Sie sich Leistungsindikatoren angesehen?

Get-Counter "\Process(*)\Working Set - Private" 
Get-Counter "\Process(*)\Handle Count" 

Für weitere Dokumentation auf Get-Counter verwendet

get-help get-counter -Full 

oder goto: https://technet.microsoft.com/en-us/library/hh849685.aspx

+0

Lieber Nickolai, ich danke Ihnen sehr für Get-Counter Hinweis, es hat mir wirklich geholfen, ich einige Daten von dort verwendet – Senator14

3

Zuerst müssen Sie die Daten aus einer einzigen Verwendung von Get-WMIObject (gwmi) zu verwenden .

Wenn Sie mehrere Aufrufe mit GWMI ausführen, erstellen Sie jedes Mal einen anderen Snapshot der Daten und verwenden für jede Eigenschaft ein anderes Beispiel. Sie werden mit einer Tabelle von Daten enden, die zu einem kubistischen Picasso-Gemälde passen ... es wird nicht die ganze Liste ausrichten oder darstellen. Es dauert auch viel mehr Zeit, um die Prozessliste immer wieder zu erfassen und dann greifen nur eine einzelne Eigenschaft aus jeder verschiedenen Liste, so lohnt es sich, die Zeit zu nehmen, um eine einzige Reihe von Daten zu ändern, vor allem, wenn Sie am Ende neu zu verwenden Ihr Skript in einem umfangreichen Remote-Operations-Skript, das eine Datenbank mit Aufgaben kompiliert.

Es gibt verschiedene Möglichkeiten, nur die gewünschten Eigenschaften in Form von benutzerdefinierten PS-Objekten zu erfassen.Ich benutze Hash-Tabellen, um den Code kurz und einfach zu machen, und den Code zu machen efficient-- Sie bereits die verbage ausgeführt Sie für eine Hash-Tabelle getan hätten, in Form von:

$CPU = $Process.CPU 
$WORKINGSET64 = $Process.WorkingSet64 
$PEAKWORKINGSET64 = $Process.PeakWorkingSet64 
$THREADS = $Process.Threads.Count 
$HANDLES = $Process.Handles 
$DESCRIPTION = $Process.Description 

Also statt, nur

$taskProps = @{ 
    'SID'=$task.SessionId 
    'Name'=$task.ProcessName 
    'PID'=$task.ProcessId 
    # add more properties here. 
} 

tun und stattdessen ein leeres benutzerdefiniertes Objekt zu schaffen, und dann ‚Schreiben‘, um es mehrmals mit

$obj = new-object psobject 
$obj | add-member noteproperty "PID" ($PIDN) 
$obj | add-member noteproperty "NAME" ($NAME) 
$obj | add-member noteproperty "OWNER" ($OWNER) 
$obj | add-member noteproperty "PATH" ($PATH) 
$obj | add-member noteproperty "Command Line" ($CMD) 
$obj | Add-Member noteproperty "SessionID" ($SESSIONID) 
$obj | Add-Member noteproperty "CPU" ($CPU) 
$obj | Add-Member noteproperty "WorkingSet64" ($WORKINGSET64) 
$obj | Add-Member noteproperty "Peak Working Set64" ($PEAKWORKINGSET64) 
$obj | Add-Member noteproperty "HANDLES" ($HANDLES) 
$obj | Add-Member noteproperty "THREADS" ($THREADS) 
$obj | Add-Member noteproperty "DESCRIPTION" ($DESCRIPTION) 

können Sie die Eigenschaft hashtable verpacken und cr eate einen einzigen Schuss in das benutzerdefinierte Objekt am Ende:

$taskObject = New-Object -TypeName PSObject -Property $taskProps 

Dann speichern Sie es in einem Arraylist mit

$taskList += $taskObject 

Sie meinem Beispiel hier sehen können:

# Generates a collection of "System.Management.ManagementObject#root\cimv2\Win32_Process" 
# Only do this once. Every time gwmi is used, it makes another RPC call if used remotely. 
# If you do multiple GWMIs you'll be working with differing data samples. 
$taskSnapshot = Get-WMIObject -ComputerName [machine name] -Class Win32_Process 

# Initialize, nullify, and declare your list as an empty ArrayList. 
$taskList = @() 

# Begin formatting in prep of Format-Table or similar usage 
# This is where you'd define each property you want to see, manipulation, etc. 
foreach ($task in $taskSnapshot){ 

# Create the hash table which will temporarily store all information for each task naming/assigning only 
# properties you want to display. 
    $taskProps = @{ 
     'SID'=$task.SessionId 
     'Name'=$task.ProcessName 
     'PID'=$task.ProcessId 
      # additional properties here. 
    } 

# "Packages" the new custom object in a variable that stores the object 
    $taskObject = New-Object -TypeName PSObject -Property $taskProps 

# append (addition) operation on formerly defined arraylist to store 
# the packaged object to an arraylist. 
    $taskList += $taskObject 
} 

# Displays the list of task "objects" in a table, other formatting options are available online. 
$taskList | Format-Table -AutoSize 

Format Befehle zum Ändern der Ausgabe Ansicht:

Windows Powershell: Die vielen Möglichkeiten, um ein benutzerdefiniertes Objekt:

https://technet.microsoft.com/en-us/magazine/hh750381.aspx

ich auch Out-Gridview Auschecken würde empfehlen, da es eine GUI-Tabelle der Daten schaffen Sie können die Größe ändern und einfach darin herumklicken.

Der wichtige Teil ist GWMI einmal zu verwenden. Es wäre besser, die rohen Informationen in einer einzelnen Variablen zu erfassen und dann die Select-String/where/if-/Bearbeitungs- und Formatierungsoperationen für das Dataset in Ihrer foreach-Anweisung auszuführen.

Hier ist die saubere Kopie des Beispiels mit meinen ausgewählten Aliase.

$taskSnapshot = gwmi -cn localhost -class win32_process 
$taskList = @() 
foreach ($task in $taskSnapshot){ 
    $taskProps = @{ 
     'SID'=$task.SessionId 
     'Name'=$task.ProcessName 
     'PID'=$task.ProcessId 
    } 
    $taskObject = New-Object -TypeName PSObject -Property $taskProps 
    $taskList += $taskObject 
} 

$taskList | Out-GridView 

Eine andere Sache, jemand erwähnt ist die Min-/Max-Eigenschaften Workingset ...

Sie können alle Eigenschaften von Win32_Process sehen von

tun
Get-WMIObject -Class Win32_Process | Get-Member 

oder

gwmi -cl win32_process | gm 
+0

Lieber Chris, vielen Dank für Ihre ausführliche Antwort, es half mir wirklich viel – Senator14

0

Um auf Chris Kuperstein zu antworten:

Ich mag es nicht, dass PowerShell meine Eigenschaften entsprechend der Standardsortierung der Keys-Auflistung in der HashTable neu anordnet; Ich habe meine Immobilien aus einem bestimmten Grund in eine bestimmte Reihenfolge gebracht. Um dem entgegenzuwirken, können Sie Property Sets verwenden. Beachten Sie, dass Sie auch Select-Object verwenden können, um dies zu erreichen.

$taskObject = New-Object -TypeName PSObject -Property $taskProps 

$taskObject.PSObject.TypeNames.Insert(0, "xTask") 
$taskObject | Add-Member -MemberType ScriptMethod -Name "ToString" -Force -Value { 
    Write-Output "Name: $($this.Name) [$($this.PID)] - CPU: $($this.CPU)" 
} 
$defaultDisplaySet = @('SID', 'PID', 'Name', 'CPU', 'Threads', 'Handles', 'WorkingSet64', 'Owner', 'Description', 'Path') 
$defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet("DefaultDisplayPropertySet",[string[]]$defaultDisplaySet) 
$PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet) 
$taskObject | Add-Member MemberSet PSStandardMembers $PSStandardMembers 
Verwandte Themen