PowerShell Implicit Remoting

#powershell edit this page

Eine der wichtigsten Funktionen der PowerShell ist die Möglichkeit cmdlet’s (ScriptBlocks) auf remoten System auszuführen. Dazu wird eine PowerShell Sesion mit dem Remote Computer erstellt, die Befehle werden remote ausgeführt und das Ergebnis lokal angezeigt.

Nun gibt es verschiedene Module für das Verwalten von Serverrollen wie z.B. Active Directory, Exchange 2010 oder Lync 2010. Will ich von meinem Client aus diese cmdlet’s verwenden muss ich die Module installieren. Oder?

Session erstellen und Modul Laden

Man erstellt eine neue PSSessoin mit einem Computer auf dem das entsprechende Modul installiert ist.

$ADSession = New-PSSession –ComputerName dc01.domain.local

Dann wird das Modul in der gerade erstellten Session geladen:

Invoke-Command {Import-Module ActiveDirectory}  -Session $ADSession

Import-PSSession

Befehle aus einer Session können mit Import-PSSession in die aktuelle PowerShell Sitzung übernommen werden, man kann entweder alle Verfügbaren cmdlet’s importieren oder nur einen Teil. In diesem Beispiel interessieren mich die cmdlets aus dem ActiveDirectory Modul, die entsprechenden Nouns beginnen mit AD, ich kann also auf *-AD* Filtern und so nur ActiveDirectory cmdlet’s übernehmen.

Import-PSSession -Session $ADSession-CommandName *-AD*

So kann ich in meiner aktuellen PS Sitzung die AD cmdlet’s wie Get-ADUser verwenden. Schließe ich das aktuelle PS Fenster wars das mit den AD cmdlet’s.

Export-PSSession

Damit man sich diese Befehle nicht merken muss und die cmdlet’s einfach wiederverwendet kann, erstellt Export-PSSession automatisch ein Modul mit den gewünschten remote cmdlet’s.

Export-PSSession $ADSession -OutputModule AD -CommandName *-AD* –AllowClobber

Jetzt kann man das aktuelle PowerShell Fenster schließen, ein Modul wurde erstellt das wie gewohnt geladen werden kann.

Import-Module AD

Die Befehle aus dem Modul sind jetzt verfügbar, allerdings gibt es noch keine PSSession. Diese muss jedoch nicht manuell erstellt werden, führt man den ersten Befehl aus dem Modul aus (Get-ADUser username) wird automatisch eine PS Session mit dem remote Computer erstellt und das cmdlet ausgeführt.

So kann man also auf jedem beliebigen Client (auf dem nur PowerShell v2 installiert ist) cmdlet’s ausführen die auf dem Server laufen.

Exchange und Lync

Exchange und Lync bieten einen eigenen Endpoint für PowerShell Verbindungen, man gibt diesen bei der Erstellung der PSSession als ConnectionURI an.

$exSession = New-PSSession -ConnectionUri 'http://ex14.domain.local/powershell/’ -ConfigurationName Microsoft.Exchange -Authentication Kerberos</p>

$lyncSession = New-PSSession –ConnectionUri ‘https://lync.domain.local/ocspowershell’</code>

Hat man die gewünschte Session erstellt kann man sie wie gehabt mit Import-PSSession gleich verwenden oder mit Export-PSSession ein Modul erstellen.

Prefix

Damit man die lokalen und remoten cmdlet’s unterscheiden kann, gibt es den Parameter –Prefix für die cmdlet’s Import-Module und Import-PSSession.

Import-Module AD –Prefix ‘r’

So wird jedem Noun ein ‘r’ vorgestellt, ich verwende also z.B. Get-rMailbox, Get-rADUser usw.

 

Ich denke diese wenig bekannte Funktionalität zeigt wie genial das Konzept der PowerShell ist, mit Windows 8 sollen jede Menge weitere cmdlet’s dazukommen. PowerShell wird das ultimative Admin Werkzeug werden.

 

so long, happy hacking!

tom