Import-PSSession beschleunigen

In ein paar Powershell-Scripten, die Befehle an Domain-Controller und Exchange-Server absetzen störte es mich schon seit geraumer Zeit, dass das initiieren der Scripte relativ lange dauert. Besonders bei Exchange-Zugriffen fiel es extrem auf, also fügte ich ein paar Zeitausgaben ein und analysierte die einzelnen Befehle.

param( [string]$uid, [string]$exhost )
function GetElapsedTime() {
$runtime = $(get-date) - $script:StartTime
$retStr = [string]::format("{3}.{4} seconds", `
$runtime.Days, `
$runtime.Hours, `
$runtime.Minutes, `
$runtime.Seconds, `
$runtime.Milliseconds)
$retStr
}
$script:startTime = get-date
write-host "Start: $(GetElapsedTime)"
$session = New-PSSession -Configurationname Microsoft.Exchange -ConnectionUri http://$exhost/powershell
write-host "New-PSSession: $(GetElapsedTime)"
Import-PSSession $session -CommandName "Get-CASMailbox" | Out-Null
write-host "Import-PSSession: $(GetElapsedTime)"
$mailbox = Get-CASMailbox $uid |Select-Object ActiveSyncMailboxPolicy,ActiveSyncEnabled,Name
write-host "Get-CASMailbox: $(GetElapsedTime)"
[string]::format("{0}: {1}, {2}", $mailbox.Name, $mailbox.ActiveSyncEnabled, $mailbox.ActiveSyncMailboxPolicy)

Ausgabe:

Start: 0.0 seconds
New-PSSession: 0.562 seconds
Import-PSSession: 11.296 seconds
Get-CASMailbox: 11.406 seconds
jdoe: True, Default

Fazit: Das größte Problem ist Import-PSSession wenn es sich mit dem Exchange-Server verbindet, es braucht meistens zwischen 11 und 13 Sekunden bis das Script weiter laufen kann. Nach einigem Suchen und Ausprobieren stieß ich auf den Parameter -CommandName, der einschränkt welche Befehle man importieren möchte.

$session = New-PSSession
Import-PSSession $session -CommandName "Get-CasMailBox"

holt nur den angegebenen Befehl in die Session, dafür dauert der Import dann aber auch nur ca 1,5 Sekunden, was die Gesamtlaufzeit des Scriptes immerhin auf ein Zehntel reduziert. Ergebnis:

Start: 0.15 seconds
New-PSSession: 0.468 seconds
Import-PSSession: 1.937 seconds
Get-CASMailbox: 2.156 seconds
jdoe: True, Default

Das ganze bringt natürlich nur einen Vorteil wenn man nur wenige Befehle in einem Script benötigt.

Veröffentlicht von

Gerald

Diplom-Informatiker (DH) in Darmstadt. Ich blogge über Entwicklung, Internet, mobile Geräte und Virtualisierung. Meine Beiträge gibt es auch bei Google+ und Facebook.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.