Wie kann eine in einem Powershell Skript definierte Funktion in einer Remote Session ausgeführt werden?
Dazu ein Beispiel:
Die folgende Funktion verwendet das PSDrive AD, um die Access Control List eines Active Directory Objects zu ermitteln. Dazu muss die Funktion remote auf einem Domain Controller ausgeführt werden oder das Active Directory Module für die Pwershell muss auf dem lokalen Rechner als Remoteverwaltungstool installiert sein.
Function get-ADACL { Param ([String]$DistinguishedName) Import-module Activedirectory$path = "AD:\$distinguishedName"return get-acl $path }
Wir wollen die Funktion aber ausführen können, ohne dass das Active Directory Modul installiert ist. Auch wenn das Modul vorhanden ist, unterliegt die Funktion der Einschränkung, dass die ACL nicht von einem bestimmten Domain Controller ermittelt werden kann.
Ohne das Modul oder wenn die ACL von einem bestimmten Domain Controller ermittelt werden soll, bleibt eine Remoteaufführung in einer PSSession. Dazu übergibt man den Code der Funktion als Scriptblock und den Distinguishedname als Parameter über die Argumentlist des Cmdlets invoke-command:
$session = new-pssession -computername "DC001.foo.local"$distinguishedName = "ou=Managed Objects,dc=foo,dc=local"invoke-Command -session
$session -scriptblock $ScriptBlock -argumentlist $distinguishedName
Wie wird der ScriptBlock ermittelt? Wenn eine Funktion definiert wurde, wird sie dem PSDrive Function hinzugefügt und kann mit get-item ausgelesen werden:
Get-item Function :\ get-ADACL |
Das Objekt, dass get-item liefert, hat u.a. die Eigenschaft ScriptBlock, die den Code der Funktion als ausführen Powershell Scriptblock bereitstellt. Damit dann dem Cmdlet invoke-Command der Scriptblock übergeben werden und zur Ausführung aus einem Remote Computer gebracht werden. Parameter werden in der Reihenfolge ihrer Angabe im Parameterblock des Scriptblocks in einem Array über die Argumentlist übertragen.
Hier das komplette Beispiel:
# Definition der Funktion Function get-ADACL { Param ( [String] $DistinguishedName ) Import-module Activedirectory $path = "AD:\$distinguishedName" return get-acl $path } # # Verwenden der Funktion in einer Remote Session # $session = new-pssession -computername "DC001.foo.local" $distinguishedName = "ou=Managed Objects,dc=foo,dc=local" $scriptBlock = ( get-item Function :\ get-ADACL ).scriptblock invoke-Command -session $session -scriptblock $ScriptBlock -argumentlist $distinguishedName |