Inhaltsverzeichnis
Grafische Oberfläche (GUI) für PowerShell-Scripts erstellen
PowerShell ist sicher nicht das bevorzugte Werkzeug, um komplexe grafische Oberflächen zu entwickeln. Hin und wieder dürfte es aber hilfreich sein, wenn Benutzer ein Script über eine GUI steuern können. Das gilt etwa dann, wenn Anwender nicht mit PowerShell vertraut sind oder für Parameter zahlreiche Werte aus einer Abfrage erhalten.
Die Interaktion mit Cmdlets oder Scripts spielt sich normalerweise auf der Kommandozeile ab. Eine der wenigen Ausnahmen ist Out-GridView, das Daten in tabellarischer Form auf der GUI ausgibt. Dieses Cmdlet lässt sich auch einsetzen, um ein einfaches Auswahlmenü zu präsentieren oder um Elemente aus einer längeren Liste auszuwählen.
Dialog mit .NET-Klassen entwickeln
Wenn die begrenzten Möglichkeiten von Out-GridView nicht reichen oder man einfach eine individuelle Oberfläche haben möchte, dann kann man dafür auf .NET-Klassen zurückgreifen. In diesem Artikel zeige ich, wie sich in wenigen Schritten eine PowerShell-GUI erstellen lässt. Zusatzprogramme sind hierzu nicht erforderlich, die PowerShell ISE reicht.
Benötigte .Net-Assemblies laden
Die ersten beiden Befehle laden die .NET-Erweiterungen (Assemblies) für die Gestaltung der grafischen Oberfläche in den Arbeitsspeicher:
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
Elemente definieren
Fenster
Ein Fenster wird danach wie folgt erzeugt und hier im Beispiel als Objekt in der Variablen $objForm gespeichert:
## Fenster definieren ##
$objForm = New-Object System.Windows.Forms.Form # Fenster erzeugen
#$objForm.BackgroundImageLayout = 2 # Hintergrundbild für Fenster
#$objForm.BackgroundImage =[System.Drawing.Image]::FromFile('C:\programdata\skripte\etc\vbw-logo.png') # Hintergrundbild auswählen
$objForm.Backcolor="white" # Hintergrundfarbe des Fensters
$objForm.StartPosition = "CenterScreen" # Fensterposition
$objForm.Size = New-Object System.Drawing.Size(800,500) # Fenstergröße (Breite x Höhe)
$objForm.Text = "Mein neues Fenster" # Fenster-Titel
Fensterelemente werden ähnlich als Objekte erzeugt und in Variablen gespeichert. Nach Erzeugung können sie dem Fenster-Objekt (Beispiel $objForm) zugefügt werden.
Das Fenster selbst wird nach seiner Gestaltung und dem Hinzufügen der benötigten Elemente über den folgenden Aufruf angezeigt:
[void] $objForm.ShowDialog()
Lable
Lable = Etikett, dient zur Anzeige eines passiven Schriftfelds.
$objLabel = New-Object System.Windows.Forms.Label # Lable erzeugen $objLabel.Location = New-Object System.Drawing.Size(50,60) # Position des Lables $objLabel.Size = New-Object System.Drawing.Size(200,20) # Größe des Lables $objLabel.Text = "Bitte geben sie einen Text ein:" # Inhalt des Lables $objForm.Controls.Add($objLabel) # Lable dem Fenster hinzufügen
Textbox
Textbox, dient als Eingabefeld
$objTextBox = New-Object System.Windows.Forms.TextBox # Eingabefeld erzeugen $objTextBox.Location = New-Object System.Drawing.Size(50,80) # Position des Eingabefeldes $objTextBox.Size = New-Object System.Drawing.Size(200,20) # Größe des Eingabefeldes $objForm.Controls.Add($objTextBox) # Eingabefeld dem Fenster hinzufügen
Listbox
Listet vorgegebene Elemente zur Auswahl in einem statischen Fenster auf.
$objListbox = New-Object System.Windows.Forms.Listbox
$objListbox.Location = New-Object System.Drawing.Size(300,80)
$objListbox.Size = New-Object System.Drawing.Size(260,20)
$objListbox.SelectionMode = "MultiExtended"
[void] $objListbox.Items.Add("1. User")
[void] $objListbox.Items.Add("2. Computer")
[void] $objListbox.Items.Add("3. E-Mail")
$objListbox.Height = 70
$objForm.Controls.Add($objListbox)
ComboBox
Listet vorgegebene Elemente zur Auswahl in einem DropDown-Feld auf.
$objCombobox = New-Object System.Windows.Forms.Combobox
# Die nächsten beiden Zeilen legen die Position und die Größe des Buttons fest
$objCombobox.Location = New-Object System.Drawing.Size(300,200)
$objCombobox.Size = New-Object System.Drawing.Size(200,20)
$objCombobox.Height = 70
$objForm.Controls.Add($objCombobox)
$objForm.Topmost = $True
[void] $objCombobox.Items.Add("1. User")
[void] $objCombobox.Items.Add("2. Computer")
[void] $objCombobox.Items.Add("3. Email")
$objCombobox.Add_SelectedIndexChanged({ })
Buttons
Zeigt einen Knopf mit einer vordefinierten Funktion. Beispiel „Cancel-Button“
$CancelButton = New-Object System.Windows.Forms.Button
# Die nächsten beiden Zeilen legen die Position und die Größe des Buttons fest
$CancelButton.Location = New-Object System.Drawing.Size(600,420)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Abbrechen"
$CancelButton.Name = "Abbrechen"
$CancelButton.DialogResult = "Cancel"
#Die folgende Zeile ordnet dem Click-Event die Schließen-Funktion für das Formular zu
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)
Einen OK-Button erzeugt man nach dem gleichen Muster, wobei man dann für das Klick-Ereignis jene Funktion einträgt, für die der Dialog letztlich dient. Das könnte eine WMI-Abfrage, das Löschen von Dateien oder das Öffnen einer Remote-Session mit einem Computer aus der Listbox sein.
Beispiel-Script für Uptime
Das Beispiel-Skript liest auf Basis der hier beschriebenen GUI-Elemente, alle Computer aus dem Active Directory aus und fügt sie in ein Listenfeld ein. Wählt man von dort einen Namen aus, dann zeigt das Script die Uptime des betreffenden Rechners an.
- Get-GuiUptime.ps1
# Load ActiveDirectory module Import-Module ActiveDirectory 'Programm wird ausgeführt bitte warten bis Eingabe erscheint.' # Die ersten beiden Befehle holen sich die .NET-Erweiterungen (sog. Assemblies) für die grafische Gestaltung in den RAM. [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") # Die nächste Zeile erstellt aus der Formsbibliothek das Fensterobjekt. $objForm = New-Object System.Windows.Forms.Form # Hintergrundfarbe für das Fenster festlegen $objForm.Backcolor=“white“ # Icon in die Titelleiste setzen # $objForm.Icon="C:\Powershell\XXX.ico" #kann selbst definiert werden # Hintergrundbild mit Formatierung Zentral = 2 #$objForm.BackgroundImageLayout = 2 #$objForm.BackgroundImage = [System.Drawing.Image]::FromFile('C:\Powershell\xxxx.jpg') #kann selbst definiert werden # Position des Fensters festlegen $objForm.StartPosition = "CenterScreen" # Fenstergröße festlegen $objForm.Size = New-Object System.Drawing.Size(800,500) # Titelleiste festlegen $objForm.Text = "Windows Uptime anzeigen lassen" ############################################################################################################# # Vorhandene Computer auslesen $Computer = Get-ADComputer -Filter * -Properties * | select * -ExpandProperty name ############################################################################################################# #Computer aus dem Ad anzeigen $objLabel = New-Object System.Windows.Forms.Label $objLabel.Location = New-Object System.Drawing.Size(300,60) $objLabel.Size = New-Object System.Drawing.Size(1000,20) $objLabel.Text = "Bitte Computernamen wählen:" $objForm.Controls.Add($objLabel) $objCombobox = New-Object System.Windows.Forms.Combobox $objCombobox.Location = New-Object System.Drawing.Size(300,80) $objCombobox.Size = New-Object System.Drawing.Size(200,20) $objCombobox.Height = 70 $objForm.Controls.Add($objCombobox) $objForm.Topmost = $True $objForm.Add_Shown({$objForm.Activate()}) $objCombobox.Items.AddRange($computer) #Computer werden aus der Variable geladen und angezeigt $objCombobox.SelectedItem #ausgewählter Computername wird übernommen $objCombobox.Add_SelectedIndexChanged({ }) #OK Button anzeigen lassen $OKButton = New-Object System.Windows.Forms.Button $OKButton.Location = New-Object System.Drawing.Size(500,420) $OKButton.Size = New-Object System.Drawing.Size(75,23) $OKButton.Text = "OK" $OKButton.Name = "OK" #$OKButton.DialogResult = "OK" # Ansonsten wird Fenster geschlossen $OKButton.Add_Click ({ $wmi=Get-WmiObject -computername $objCombobox.SelectedItem -Class Win32_OperatingSystem $wmi2 = $wmi.converttodatetime($wmi.lastbootuptime) [void] [Windows.Forms.MessageBox]::Show($wmi2) }) $objForm.Controls.Add($OKButton) #Abbrechen Button $CancelButton = New-Object System.Windows.Forms.Button $CancelButton.Location = New-Object System.Drawing.Size(600,420) $CancelButton.Size = New-Object System.Drawing.Size(75,23) $CancelButton.Text = "Abbrechen" $CancelButton.Name = "Abbrechen" $CancelButton.DialogResult = "Cancel" $CancelButton.Add_Click({$objForm.Close()}) $objForm.Controls.Add($CancelButton) ###################################################################################################### # Die letzte Zeile sorgt dafür, dass unser Fensterobjekt auf dem Bildschirm angezeigt wird. [void] $objForm.ShowDialog()
