2017-10-03 5 views
1

Ich versuche, von einem Terminal-Server die suspendierten Aufgaben alle zu erhalten Windows Server 2012Powershell: Get alle ausgesetzten Aufgaben

Ich habe versucht Powershell wie so mit wmi-Objekt ausgeführt haben:

Get-WmiObject -Class Win32_Process -ComputerName computername -Property status 

Aber die status Eigenschaft aller Prozesse ist leer, aber es zeigt in der Detailansicht des Task-Manager nach oben wie folgt:

enter image description here

Ich habe auch versucht, den folgenden Code den Status der laufenden Threads zu versuchen und zu erhalten:

$processes = Get-Process * -ComputerName ppivts | select name,threads 

foreach ($process in $processes) 
{ 
    foreach ($thread in $process.Threads) 
    { 
     if($thread.ThreadState -ne "Wait"){ 
      $process.Name 
      $thread.ThreadState 
     } 
    } 

} 

Dies funktioniert auch nicht. Wie bekomme ich den Status des Prozesses und insbesondere der suspendierten?

+0

@ Persistent13 Ich habe schaute auf t Hut Lösung und wie Sie aus dem obigen Code sehen können, dass es die suspendierten oder laufenden Aufgaben nicht zurückgibt. Es spiegelt nicht wider, was im Aufgabenmanager angezeigt wird. – CEvans

+0

@ Persistent13 Ich entschuldige mich, ich konnte den Suspend-Mitgliedsnamen in der Waittreason-Enumeration finden. Also sollte ich in der Lage sein, danach zu fragen. Vielen Dank. – CEvans

Antwort

0

Sie könnten den letzteren Code-Schnipsel verbessern, wie folgt:

$processes = Get-Process * 
$processHt = @{}         # empty hash table 
foreach ($process in $processes) { 
    foreach ($thread in $process.Threads) { 
    if($thread.ThreadState -eq "Wait") { 
     if ($processHt.Containskey($process.Name)) { 
     if ($processHt[$process.Name] -match $($thread.WaitReason.ToString())) { 
     } else { 
      $processHt[$process.Name] += ",$($thread.WaitReason.ToString())" 
     } 
     } else { 
     $processHt.Add($process.Name , $thread.WaitReason.ToString()) 
     } 
    } 
    } 
} 

"`n=== all threads suspended ===" 
$processHt.Keys | Where-Object { $processHt[$_] -eq 'Suspended' } 
"`n=== some thread suspended ===" 
$processHt.Keys | Where-Object { $processHt[$_] -match 'Suspended' } | 
    ForEach-Object { @{ $_ = $processHt[$_] } } | 
    Format-Table -AutoSize -HideTableHeaders  # merely for simple output look 

Beispielausgabe:

PS D:\PShell> D:\PShell\SO\46546587.ps1 

=== all threads suspended === 
WWAHost 

=== some thread suspended === 

System FreePage,Executive,EventPairLow,Suspended,VirtualMemory,LpcReceive,ExecutionDelay 
WWAHost Suspended                   
explorer UserRequest,Executive,EventPairLow,Suspended          



PS D:\PShell> 

Entsprechende Task-Manager Screenshot:

Corresponding Task Manager screenshot