REDPIXEL - stock.adobe.com
Verwenden Sie Parameter für flexiblere PowerShell-Skripte
Mit Standartparametern können Sie Ihrer PowerShell-Skripte leichter auf anderen Computern nutzen und weitergeben, ohne dass Parameter dafür händisch angepasst werden müssen.
Hochgradig angepasster PowerShell-Code funktioniert super – bis er es eben nicht mehr tut.
Wenn Sie PowerShell lernen, geht es Ihnen vermutlich erst einmal darum, ein ganz bestimmtes Problem zu lösen. Wenn Sie dann erfahrener im Scripting werden, werden Sie bei der Nutzung Ihrer Funktion vielleicht die Idee bekommen, dass es eigentlich ganz praktisch wäre, wenn sie dasselbe Problem auch noch auf andere Art und Weise, unter anderen Begleitumständen oder für andere Situationen lösen könnte.
Die Standardparameter, um die es in diesem Artikel gehen soll, ermöglichen es Ihrem Code, sich an unterschiedliche Situationen anzupassen und erleichtert es außerdem anderen Personen und Ihnen selbst, ihn zu lesen.
Standardwerte erweitern die Nützlichkeit von Parametern
Angenommen, Sie haben auf Ihrem Windows-basierten Client oder Server ein VPN eingerichtet. Sie möchten eine Funktion, die eine Verbindung zu diesem VPN mit einer bestimmten Benutzeranmeldung herstellt, die im lokalen Windows hinterlegt sind.
So könnte diese Funktion aussehen:
Function Connect-ArbeitsVpn {
$cred = Get-StoredCredential -Target 'ArbeitsVPN'
$vpn = Get-VpnConnection -Name 'Arbeit'
if ($vpn.ConnectionStatus -ne 'Connected') {
rasdial.exe $($vpn.name) $($cred.username) $($cred.GetNetworkCredential().password)
}
}
Das Cmdlet Get-StoredCredential gehört zum Modul CredentialManager, das Anmeldedaten im Windows Credential Manager erzeugt und aus diesem bezieht. In diesem Szenario erspart Ihnen das Cmdlet, dass Sie bei jeder Verbindung den Benutzernamen und das Kennwort eingeben müssen, Sie können die Anmeldeinformationen aber trotzdem sicher speichern. Der Parameter Target ist der Name der abzurufenden Benutzerdaten.
Der Rest der Funktion ruft die VPN-Verbindung über Get-VpnConnection ab und stellt, falls noch nicht vorhanden, eine Verbindung über die Windows-Anwendung rasdial.exe her.
Sie verbinden Sie sich mit dem VPN, indem Sie folgende Funktion aufrufen:
Connect-ArbeitsVPN
Diese Funktion hat nur eine einzige Aufgabe: Sie verbindet sich mit dem VPN namens Arbeit unter Verwendung der Arbeits-VPN-Anmeldeinformationen, ohne irgendwelche Parameter anzunehmen. Wenn Sie weitere VPNs auf Ihrem System hinzufügen, können Sie diese Funktion in eine anpassungsfähigere Funktion mit mehr Funktionen umwandeln, während Sie die Standardparameterwerte verwenden, um sie möglichst einfach zu halten.
Die aktualisierte Funktion fügt mehrere Parameter hinzu, um eine Umgebung mit mehreren VPNs zu berücksichtigen:
Function Connect-Vpn {
param (
[string]$VpnName,
[string]$VpnCredName
)
$cred = Get-StoredCredential -Target $VpnCredName
$vpn = Get-VpnConnection -Name $VpnName
if ($vpn.ConnectionStatus -ne 'Connected') {
rasdial.exe $($vpn.name) $($cred.username) $($cred.GetNetworkCredential().password)
}
}
Die überarbeitete Funktion verlangt die manuelle Eingabe des VPN-Namens und der des Anmeldenamens, um sich mit demselben VPN wie gehabt zu verbinden:
Connect-Vpn -VpnName 'Arbeit' -VpnCredName 'ArbeitsVPN'
Mit diesem Skript stellt PowerShell eine Verbindung zu jedem beliebigen konfigurierten VPN mit sämtlichen gespeicherten Anmeldeinformationen her. Der Nachteil: Sie ist nicht mehr ganz so einfach zu benutzen.
Sie können nun Standardwerte hinzufügen, um genau diese Flexibilität wiederherzustellen. Weisen Sie dazu den Parametern im param-Block einen Wert zu. Wird beim Aufruf der Funktion kein Wert an diese Parameter übergeben, so verwendet das Skript stattdessen die vorgesehenen Standardwerte.
Function Connect-Vpn {
param (
[string]$VpnName = 'Arbeit',
[string]$VpnCredName = 'Arbeits-VPN'
)
$cred = Get-StoredCredential -Target $VpnCredName
$vpn = Get-VpnConnection -Name $VpnName
if ($vpn.ConnectionStatus -ne 'Connected') {
rasdial.exe $($vpn.name) $($cred.username) $($cred.GetNetworkCredential().password)
}
}
Wie bei der normalen Variablenzuweisung ordnet der Code der Variablen VpnName den Wert Arbeit und der Variablen VpnCredName den Wert ArbeitsVPN zu. Das Skript verbindet sich nun mit dem ArbeitsVPN, wenn es die Funktion Connect-Vpn ohne Parameterangabe ausführt, indem es den Parametern die im param-Block vorgegebenen Standardwerte zuweist.
Um ein anderes VPN und dessen Benutzerzugang einzurichten, könnten Sie eine Verbindung zu einem anderen VPN herstellen, indem Sie die richtigen Parameter übergeben:
Connect-Vpn -VpnName 'Site1' -VpnCredName 'Site1 VPN'
Ein Standardwert für lokale oder Remote-Verbindungen
Eine weitere nützliche PowerShell-Technik besteht darin, eine Funktion zu schreiben, die auf lokalen und auf Remote-Computern funktioniert. Um den Computernamen zu erfassen, können wir eine Funktion schreiben, die einen Parameter ComputerName verwendet. Das Skript ist flexibel, da dieser Parameter standardmäßig auf den Computer verweist, auf dem die Funktion ausgeführt wird. Dazu gleich ein Beispiel.
Im nächsten Beispiel wollen wir die Ereignisprotokolle durchkämmen und alle darin als Ereignisse festgehaltenen fehlgeschlagenen Anmeldeversuche zurückgeben. Die Ereignisse erscheinen im Sicherheitsprotokoll mit der ID 4648. Das folgende Skript verwendet eine Funktion, die keine Parameter akzeptiert und 4648-Ereignisse vom lokalen Computer zurückgibt.
Function Get-ExplicitLogins {
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4648
}
}
Wie im vorherigen Beispiel können wir die Funktion mit einem Parameter für den Computernamen flexibler gestalten und diesem einen Standardwert geben. Sofern Sie das Skript nicht benötigen, um die Protokolle eines bestimmten Systems zu prüfen, verwenden Sie den Namen des lokalen Computers als Standardwert, sodass Sie das Cmdlet ohne Übergabeparameter aufrufen können.
Function Get-ExplicitLogins {
param (
[string]$ComputerName = $env:COMPUTERNAME
)
Get-WinEvent -ComputerName $ComputerName -FilterHashtable @{
LogName = 'Security'
Id = 4648
}
}
Sie können die Funktion Get-ExplicitLogins ohne Parameter verwenden, woraufhin sie alle expliziten Anmeldungen für den lokalen Computer zurückgibt.
Sie können der Funktion aber auch einen Computernamen übergeben, womit sie die Ereignisse von einem Remote-Computer ausgibt:
Get-ExplicitLogins -ComputerName 'Test-PC01'