Wie kann eine in einem Powershell Skript definierte Funktion in einer Remote Session ausgeführt werden?

Dazu ein Bespiel:

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

 

Feedback

Haben Sie Fragen, Anregungen oder Kritik zu diesem Beitrag?
Nutzen Sie unser Feedback-Tool. Wir freuen uns auf Ihre Nachricht.

Ihre E-Mail-Adresse (Pflichtfeld)

Ihre Nachricht (Pflichtfeld)

Ich stimme zu, dass die Verarbeitung meiner Daten gemäß Punkt 3 der Datenschutzerklärung erfolgt .

Trevedi

Trevedi IT-Consulting GmbH
Gottfried-Hagen-Str. 30
51105 Köln

T +49 (0)221 – 3 55 88 88 – 0
E info(@)trevedi.de

Trevedi Partnerlogos

Top