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-Key: 254441

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

Printed on: April 16, 2024 at 09:04 o'clock

Member: colinardo
colinardo Nov 11, 2014 updated at 10:18:16 (UTC)
Goto Top
Member: Bugger
Bugger Nov 11, 2014 at 09:36:24 (UTC)
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?
Member: colinardo
colinardo Nov 11, 2014 updated at 10:00:20 (UTC)
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
Member: colinardo
colinardo Nov 11, 2014 updated at 10:22:25 (UTC)
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.
Member: Bugger
Bugger Nov 11, 2014 updated at 10:25:11 (UTC)
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.
Member: colinardo
Solution colinardo Nov 11, 2014, updated at Nov 20, 2014 at 07:18:54 (UTC)
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.
Member: Bugger
Bugger Nov 11, 2014 at 10:38:16 (UTC)
Goto Top
Ja, so funktioniert es, vielen Dank! Der andere "Taskmanager" ist aber auch klasse.^^

Hast du noch eine Idee bzgl. der Vordergrund Problematik?
Member: colinardo
colinardo Nov 11, 2014 updated at 10:45:41 (UTC)
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
Member: Bugger
Bugger Nov 11, 2014 at 11:11:58 (UTC)
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
Member: colinardo
colinardo Nov 11, 2014 updated at 14:49:31 (UTC)
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
Member: Bugger
Bugger Nov 11, 2014 at 15:02:30 (UTC)
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.