Wer kennt nicht die Situation in der ein oder mehrere Prozesse eines Benutzers beendet werden müssen. Als Beispiel soll hier eine Teminal Server Sitzung eines Benutzers herhalten.
Situation:
Der Benutzer ist bereits abgemeldet, die entsprechenden Benutzerpozesse aber noch geöffnet. Die Terminal Server Sitzung wird nicht sauber getrennt. Natürlich können die Prozesse über den Task Manager beendet werden. Doch kann der Administrator sich natürlich auch der PowerShell bedienen.
Die Ausführung des folgenden Skriptes beendet z.B. alle „Notepad.exe“ Prozesse des angebenen Benutzers:
Get-Process -IncludeUserName | ? {$_.username -eq „<Benutzername>“ -AND $_.ProcessName -eq „notepad.exe“} | % {kill -ID $_.ID -Force}
Anmerkung:
Der aufgeführte Befehl kann erst ab PowerShell 4.x ausgeführt werden. Unter PowerShell 3.x ist der Parameter „-IncludeUserName“ in „Get-Process“ nicht verfügbar. PowerShell 4.x steht jedoch auch für Windows 7 zum Download zur Verfügung. Hat nicht die Möglichkeit die PowerShell zu aktualisieren kann der Benutzer eines Prozesses unter PowerShell 3.x mit „Get-WmiObject“ ausgelesen werden (Beispiel: Get-WmiObject win32_process | foreach {$_.getowner().user}
win32_process -Filter „name = ’notepad.exe'“). Um unter PowerShell 3.x das gleiche Ergebnis zu erzielen wie oben kann das folgede Skript genutzt werden.
$processes = Get-WmiObject win32_process | Select-Object ProcessID,Name,@{n=’Owner‘;e={$_.GetOwner().User}}
foreach ($p in $processes)
{
if ($p.Owner -eq „<Benutzername>“)
{
if ($p.Name -eq „notepad.exe“)
{
stop-process -id $p.ProcessID -Force
}
}
}
Interessanter ist es jedoch mehrere bzw. alle verbliebenen Prozesse eines Benutzers zu beenden:
$processes = Get-WmiObject win32_process | Select-Object ProcessID,Name,@{n=’Owner‘;e={$_.GetOwner().User}}
foreach ($p in $processes)
{
if ($p.Owner -eq „<Benutzername>“)
{
stop-process -id $p.ProcessID -Force
{
}