bugger
Goto Top

Powershelle Prozess über Out-Grid-View stoppen

Hallo,

ich habe folgenden Code:

Get-WmiObject Win32_Process -computername $objListbox.SelectedItems -Filter "Name='firefox.exe' OR Name='AcroRd32.exe'" |  
select Name, Path, PSComputername, @{n="User";e={$_.GetOwner().user}} | sort PSComputername | ogv -title "Prozesse" -PassThru |  

Gibt es einen Kill Befehl sodass man im ogv Fenster die Prozesse auswählen kann die gestoppt werden sollen?

Im grunde möchte ich das gleiche wie das hier:

Get-Process |

Out-GridView -PassThru |

Stop-Process 

Nur ist das für meinen Code nicht wirklich anwendbar, da es nicht über WMI läuft. Danke im Voraus.

Content-ID: 254441

Url: https://administrator.de/contentid/254441

Ausgedruckt am: 04.12.2024 um 08:12 Uhr

colinardo
colinardo 11.11.2014 aktualisiert um 11:18:16 Uhr
Goto Top
Bugger
Bugger 11.11.2014 um 10:36:24 Uhr
Goto Top
Schade, dachte es wäre vielleicht so einfach wie mit dem anderen Befehl.

Der Befehl oben ist bereits bestandteil einer GUI. Wie müsste denn der Befehl lauten, damit er nach sort PSComputername | den Befehl an ein neues sich dann öffnentes GUI Fenster weiter gibt?
colinardo
colinardo 11.11.2014 aktualisiert um 11:00:20 Uhr
Goto Top
Hier eine Beispiel-Form zum Auflisten und Beenden von Prozessen. In der Demo werden die lokalen Prozesse aufgelistet, aber das kannst du ja in den Parametern von Get-WmiObject ändern.
function GenerateForm {

#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  
#endregion

#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$btnKill = New-Object System.Windows.Forms.Button
$dgv = New-Object System.Windows.Forms.DataGridView
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

#----------------------------------------------
# Event Script Blocks
#----------------------------------------------

$update_gridview = {
    $processes = gwmi Win32_Process -ComputerName localhost | select Name,Path,PSComputername,@{n="User";e={$_.GetOwner().user}},ProcessId  
    $arrList = New-Object System.Collections.ArrayList
    $arrList.AddRange($processes)
    $dgv.DataSource = $arrList

}

$btnKill_OnClick= 
{
    $sel_proc = $dgv.Rows[$dgv.SelectedRows[0].Index].Cells['ProcessId'].Value  
    [System.Windows.Forms.MessageBox]::Show("Killing Process wih ID: $sel_proc")  
    gwmi Win32_Process -ComputerName localhost -Filter "ProcessId='$sel_proc'" | %{$_.Terminate()}  
    &$update_gridview
}

$handler_form1_Load= 
{
   &$update_gridview
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
	$form1.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 307
$System_Drawing_Size.Width = 525
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Name = "form1"  
$form1.Text = "Prozesse"  
$form1.add_Load($handler_form1_Load)

$btnKill.Anchor = 10

$btnKill.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 419
$System_Drawing_Point.Y = 278
$btnKill.Location = $System_Drawing_Point
$btnKill.Name = "btnKill"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 94
$btnKill.Size = $System_Drawing_Size
$btnKill.TabIndex = 1
$btnKill.Text = "Kill process"  
$btnKill.UseVisualStyleBackColor = $True
$btnKill.add_Click($btnKill_OnClick)

$form1.Controls.Add($btnKill)

$dgv.AllowUserToAddRows = $False
$dgv.AllowUserToDeleteRows = $False
$dgv.AllowUserToResizeRows = $False
$dgv.Anchor = 15
$dgv.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 12
$dgv.Location = $System_Drawing_Point
$dgv.MultiSelect = $False
$dgv.Name = "dgv"  
$dgv.ReadOnly = $True
$dgv.RowHeadersVisible = $False
$dgv.RowHeadersWidth = 40
$dgv.SelectionMode = 1
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 260
$System_Drawing_Size.Width = 501
$dgv.Size = $System_Drawing_Size
$dgv.TabIndex = 0

$form1.Controls.Add($dgv)

#endregion Generated Form Code

#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null

} #End Function

#Call the Function
GenerateForm
Grüße Uwe
colinardo
colinardo 11.11.2014 aktualisiert um 11:22:25 Uhr
Goto Top
Ach jetzt weis ich was du meinst, sorry, war gerade auf dem falschen Dampfer face-wink Du kannst du es natürlich auch so mit Out-GridView machen:
.............. | sort PSComputername | ogv -title "Prozesse" -PassThru | %{$_.Terminate()}  
indem du dann einfach die Terminate()-Methode für jedes in der Pipe übergebene Objekt aufrufst.
Bugger
Bugger 11.11.2014 aktualisiert um 11:25:11 Uhr
Goto Top
Funktioniert perfekt! Habe es in mein Script eingetragen, Computername geändert und es funktioniert auch remote.

Habe allerdings noch ein kleines Problem mit meiner Haupt GUI und zwar bleibt diese immer im Vordergrund egal wo ich sonst hin klicke, dadurch habe ich zuerst garnicht das Fenster bzgl. der Prozess Kills gesehen. Weißt du welcher Befehl mir dafür fehlt oder wo das stehen könnte?

-edit-
Habe gerade noch deinen Nachtrag gesehen, also mit dem funktioniert es leider nicht. Den hatte ich bei meinen Recherchen auch schon gefunden, da bekomme ich immer:

Fehler beim Aufrufen der Methode, da [Selected.System.Management.ManagementObject] keine Methode mit dem Namen "Terminate" enthält.
colinardo
Lösung colinardo 11.11.2014, aktualisiert am 20.11.2014 um 08:18:54 Uhr
Goto Top
Zitat von @Bugger:
Fehler beim Aufrufen der Methode, da [Selected.System.Management.ManagementObject] keine Methode mit dem Namen
"Terminate" enthält.
ah ja stimmt, der geht so nur wenn keine Selects davor sitzen.
Alternativ geht es aber auch so:
........ | sort PSComputername | ogv -title "Prozesse" -PassThru | %{gwmi Win32_Process -Computername XYZ -Filter "Name='$($_.Name)'" | %{$_.Terminate()}}  
Den Computernamen natürlich anpassen.
Bugger
Bugger 11.11.2014 um 11:38:16 Uhr
Goto Top
Ja, so funktioniert es, vielen Dank! Der andere "Taskmanager" ist aber auch klasse.^^

Hast du noch eine Idee bzgl. der Vordergrund Problematik?
colinardo
colinardo 11.11.2014 aktualisiert um 11:45:41 Uhr
Goto Top
Zitat von @Bugger:
Ja, so funktioniert es, vielen Dank! Der andere "Taskmanager" ist aber auch klasse.^^
Hast du noch eine Idee bzgl. der Vordergrund Problematik?
Ohne zu wissen wie deinen Code aussieht, schwer zu sagen.

Hier hast du ein Beispiel mit 2 Forms, die HauptForm ruft den Taskmanager auf welcher im Vordergrund als Child-Form läuft.
function TaskmanagerForm {

#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  
#endregion

#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$btnKill = New-Object System.Windows.Forms.Button
$dgv = New-Object System.Windows.Forms.DataGridView
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------

$update_gridview = {
    $processes = gwmi Win32_Process -ComputerName localhost | select Name,Path,PSComputername,@{n="User";e={$_.GetOwner().user}},ProcessId  
    $arrList = New-Object System.Collections.ArrayList
    $arrList.AddRange($processes)
    $dgv.DataSource = $arrList

}

$btnKill_OnClick= 
{
    $sel_proc = $dgv.Rows[$dgv.SelectedRows[0].Index].Cells['ProcessId'].Value  
    [System.Windows.Forms.MessageBox]::Show("Killing Process wih ID: $sel_proc")  
    gwmi Win32_Process -ComputerName localhost -Filter "ProcessId='$sel_proc'" | %{$_.Terminate()}  
    &$update_gridview
}

$handler_form1_Load= 
{
   &$update_gridview
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
	$form1.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 307
$System_Drawing_Size.Width = 525
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Name = "form1"  
$form1.Text = "Prozesse"  
$form1.add_Load($handler_form1_Load)

$btnKill.Anchor = 10

$btnKill.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 419
$System_Drawing_Point.Y = 278
$btnKill.Location = $System_Drawing_Point
$btnKill.Name = "btnKill"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 94
$btnKill.Size = $System_Drawing_Size
$btnKill.TabIndex = 1
$btnKill.Text = "Kill process"  
$btnKill.UseVisualStyleBackColor = $True
$btnKill.add_Click($btnKill_OnClick)

$form1.Controls.Add($btnKill)

$dgv.AllowUserToAddRows = $False
$dgv.AllowUserToDeleteRows = $False
$dgv.AllowUserToResizeRows = $False
$dgv.Anchor = 15
$dgv.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 12
$dgv.Location = $System_Drawing_Point
$dgv.MultiSelect = $False
$dgv.Name = "dgv"  
$dgv.ReadOnly = $True
$dgv.RowHeadersVisible = $False
$dgv.RowHeadersWidth = 40
$dgv.SelectionMode = 1
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 260
$System_Drawing_Size.Width = 501
$dgv.Size = $System_Drawing_Size
$dgv.TabIndex = 0

$form1.Controls.Add($dgv)

#endregion Generated Form Code

#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null

} #End Function


# Main Form
function GenerateMainForm {


#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  
#endregion

#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$button1 = New-Object System.Windows.Forms.Button
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
#Provide Custom Code for events specified in PrimalForms.
$handler_button1_Click= 
{
    TaskmanagerForm
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
	$form1.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 272
$System_Drawing_Size.Width = 292
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Name = "form1"  
$form1.Text = "Primal Form"  


$button1.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 12
$button1.Location = $System_Drawing_Point
$button1.Name = "button1"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 75
$button1.Size = $System_Drawing_Size
$button1.TabIndex = 0
$button1.Text = "button1"  
$button1.UseVisualStyleBackColor = $True
$button1.add_Click($handler_button1_Click)

$form1.Controls.Add($button1)

#endregion Generated Form Code

#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null

} #End Function

GenerateMainForm
Bugger
Bugger 11.11.2014 um 12:11:58 Uhr
Goto Top
Mein Script basiert auf den Multi Select Box von Microsoft, wenn du da den Fehler findest, findest du ihn auch bei mir:

http://technet.microsoft.com/en-us/library/ff730950.aspx
colinardo
colinardo 11.11.2014 aktualisiert um 15:49:31 Uhr
Goto Top
Zitat von @Bugger:
Mein Script basiert auf den Multi Select Box von Microsoft, wenn du da den Fehler findest, findest du ihn auch bei mir:
http://technet.microsoft.com/en-us/library/ff730950.aspx
Na dann ist es klar. Dein Problem verursacht folgende Zeile im Script, die die Haupt-Form immer im Vordergrund darstellt
$objForm.Topmost = $True
Kommentiere oder lösche die Zeile, feddich face-smile

Grüße Uwe
Bugger
Bugger 11.11.2014 um 16:02:30 Uhr
Goto Top
Oh man, ich habe vorhin noch soviel geguckt und Zeilen rausgelöscht, keine Ahnung warum ich diese nicht gefunden habe.^^ Vielen Dank.

Du hast mir jetzt soviel geholfen, da weiß ich garnicht welche Antwort ich als Lösung markieren soll :D

Ich hätte da noch eine andere Frage, hast du dich mal mit der Remote Deinstallation von Programmen mit Powershell auseinander gesetzt?
Funktioniert mit win32_product aber der Befehl ist böse weil er die Konfig aller installierten Programme umschreibt sowie unmengen an Einträgen ins Ereignislog schreibt und die bislang beste Möglichkeit mit Registry auslesen habe ich nicht wirklich zum laufen bekommen.