Um den Grad der Dynamisierung einer Installation zu erhöhen bieten sich in SCCM bekanntlich mehrere Stellen an, an denen Variablen gesetzt werden können. Hierbei gilt jedoch die Reihenfolge der Abarbeitung zu beachten, sofern dieselbe Variable an unterschiedlichen Stellen verwendet wird. Grundsätzlich werden zuerst Sammlungsvariablen ausgewertet, danach Gerätespezifische Variablen die die Sammlungsvariablen im Ernstfall überschreiben und danach Task Sequenz Variablen die den Wert der Gerätespezifischen Variablen wiederrum überschreiben würden. Hinzu kommt die Tatsache, dass diese Variablen immer nur zur Laufzeit einer Task Sequenz verwendet werden können und danach nicht mehr zur Verfügung stehen.

 

In manchen Fällen, wie z.B. bei einer Neuinstallation eines Computers, kann es jedoch durchaus hilfreich sein sich alle während der OS Installationsphase verfügbaren Task Sequenz Variablen anzeigen oder im Bedarfsfall sogar weg schreiben zu lassen um diese auch nach der Ausführung der Task Sequenz, wenn auch nur mit den zur Laufzeit aktuellen Werten, zur Verfügung zu haben.

 

In diesem Artikel möchte ich kurz darauf eingehen wie man sich während einer Neuinstallation im PE alle Task Sequenz Variablen anzeigen lassen und diese z.B. in Form einer Log Datei oder in der Registry speichern kann.

 

Vorbereitungen

 

Damit im PE grundsätzlich PowerShell verwendet werden kann, müssen die beiden optionalen Komponenten "Microsoft .NET (WinPE-NetFx)" und "Windows PowerShell (WinPE-PowerShell)" aktiviert werden.

 

 

Des Weiteren empfiehlt es sich die Befehlsunterstützung zu aktivieren, um später etwas einfacher testen zu können.

 

 

Nach den Änderungen müssen die Verteilungspunkte natürlich aktualisiert werden.

 

Task Sequenz Variablen auslesen und speichern

 

Da die Befehlsunterstützung im PE aktiviert wurde, kann mit F8 eine Eingabeaufforderung gestartet werden. Mit dieser wird zunächst auf PowerShell gewechselt.

 

 

Um sich nun alle Variablen anzeigen lassen zu können, müssen wir diese zunächst aus dem zuständigen COM Objekt auslesen. Möchte man sich die Variablen lediglich ausgeben lassen so kann dies mit folgenden Befehlen gemacht werden:

 

$tsenv = New-Object -COMObject Microsoft.SMS.TSEnvironment

$tsenv.GetVariables() | % { Write-Host "$_ = $($tsenv.Value($_))" }

 

 

Da die ausgegebene Liste jedoch relativ lang ist und man auf der Kommandozeile auch schlecht nach einem bestimmten Wert oder einer Variable suchen kann bietet es sich an, den Output in eine Datei umzuleiten. Hier gibt es sicherlich mehrere Möglichkeiten. Unter Verwendung des Cmdlets "Out-File" muss jedoch der "Write-Host" Befehl in "Write-Output" geändert werden, da "Out-File" mit der Hostausgabe nichts anfangen kann.

 

$tsenv.GetVariables() | % { Write-Output "$_ = $($tsenv.Value($_))" | Out-File -FilePath c:\TSVar.log -append}

 

 

Möchte man dennoch die Ausgabe sowohl über die Konsole als auch in einem File haben kann z.B. auch das Cmdlet "Start-Transcript" verwendet werden.

 

$log = "C:\TSVar.log"

Start-Transcript $log

$tsenv.GetVariables() | % { Write-Host "$_ = $($tsenv.Value($_))" }

Stop-Transcript

 

 

 

Ebenfalls kann die Liste durch diverse Filter weiter eingeschränkt werden um sich nur bestimmte Variablen anzeigen zu lassen.

 

$tsenv.Get-Variables() | where {$_ -like "*LAB*"} | % { Write-Host "$_ = $($tsenv.Value($_))" }

 

 

Denkbar wäre natürlich auch die Sicherung aller oder bestimmter Variablen direkt in die Registry des Clients.

 

New-Item -Path "HKLM:SOFTWARE\SCCM\TSVars\" -force

$tsenv-GetVariables() | where {$_ -like "*LAB*"} | % { New-ItemProperty -Path "HKLM:SOFTWARE\SCCM\TSVars\" -Name $_ -PropertyType STRING -Value $($tsenv.Value($_)) -Force }

 

 

Aber Achtung! Wichtig ist hier natürlich der Zeitpunkt der Speicherung! Passiert diese zu früh kann es sein, dass die Änderungen nach einem Reboot wieder weg sind, da lediglich in die Registry des PE zu dessen Laufzeit geschrieben wurde. Demnach empfiehlt sich für eine derartige Aktion ein Zeitpunkt gegen Ende der Task Sequenz.