Windows Regionseinstellungen per Script ändern – Teil 2

Es ist nun endlich soweit, wer den ersten Teil dieses Artikels noch nicht gesehen hat, sollte vorab unbedingt hier vorbeischauen. Für alle jene, die den Weg zu diesen Beitrag bereits über Teil 1 gefunden haben: Wir klären nun das Problem, wie man die Regionsseinstellungen für den bestehenden ‚Administrator‘ Benutzer umstellt. Dazu habe ich das Script um ein paar Zeilen erweitert, damit eine Automatisierung möglich ist. Kurz zusammengefasst werden folgende Aktionen ausgeführt:

  1. Das ‚Region_de-AT.xml‘ wird wie in Artikel 1 beschrieben erstellt und unter ‚C:\Windows\Temp‘ abgelegt.
  2. Zusätzlich erstellen wir ein ‚SetRegion.ps1‘ Powershell Script am Host.
  3. Dieses Script wird bei der erstmaligen Anmeldung des Benutzers ‚Administrator‘ ausgeführt und setzt alle nötigen Einstellungen.
  4. Zusatz: Da nach dem Setzen der Einstellungen ein Neustart nötig ist, loggen wir uns automatisch mit dem lokalen Administrator an und starten die VM anschließend neu.

 

XML für die Regionseinstellungen

Zur Wiederholung: Wir speichern das XML-File als ‚Region_de-AT.xml‘ im Ordner ‚C:\Windows\Temp‘. Je nach Region muss die GeoID, sowie die de-ATs durch das jeweilige Land ersetzt werden.

    $regionalsettingsAT = 
            "<gs:GlobalizationServices xmlns:gs='urn:longhornGlobalizationUnattend'> 
            <!--User List-->
            <gs:UserList>
                <gs:User UserID='Current' CopySettingsToDefaultUserAcct='true' CopySettingsToSystemAcct='true'/> 
            </gs:UserList>
            <!-- user locale -->
            <gs:UserLocale> 
                <gs:Locale Name='de-AT' SetAsCurrent='true' ResetAllSettings='true'/> 
            </gs:UserLocale>
            <!-- system locale -->
            <gs:SystemLocale Name='de-AT'/>
            <!-- GeoID -->
            <gs:LocationPreferences> 
                <gs:GeoID Value='14'/> 
            </gs:LocationPreferences>
            <gs:MUILanguagePreferences>
                <gs:MUILanguage Value='de-AT'/>
            </gs:MUILanguagePreferences>
            <!-- input preferences -->
            <gs:InputPreferences>
                <!--en-AU-->
                <gs:InputLanguageID Action='add' ID='0c07:00000407' Default='true'/> 
            </gs:InputPreferences>
            </gs:GlobalizationServices>"
            
    $regionalsettingsAT | Out-File C:\Windows\Temp\Region_de-AT.xml
    $regionalsettingsATXML = "C:\Windows\Temp\Region_de-AT.xml"

Powershell Script ‚SetRegion.ps1‘

Anstatt das Script nun einmalig während des Provisionierungsprozesses aufzurufen, machen wir uns die Registry und den RunOnce Key zu nutze. Dabei wird im jeweiligen HKEY_USER Hive ein Eintrag erstellt, der beim ersten Logon des Benutzers ein Powershell Script ausführt. In diesem Powershell Script implementieren wir die Einstellungen des zuvor erstellten XML-Files.

  • SetRegion.ps1 unter ‚C:\Windows\Temp‘ ablegen:
$regionPS = {& $env:SystemRoot\System32\control.exe "intl.cpl,,/f:`"C:\Windows\Temp\Region_de-AT.xml`""}
Add-Content -Path "C:\Windows\Temp\SetRegion.ps1" -Value $regionPS

 

  • RunOnce Registry Variabel in HKEY_USER Hive vom lokalen Administrator erstellen
### Get SID of local Administrator
$localadmin = Get-LocalUser | where {$_.Name -like "Administrator"}

### Load HKEY_USER Hive of local Administrator
reg load HKU\$($localadmin.SID.Value) C:\Users\Administrator\ntuser.dat

### Check if 'RunOne' Key  is already available, if not create it
if(!(Test-Path -Path Registry::HKEY_USERS\$($localadmin.SID.Value)\Software\Microsoft\Windows\CurrentVersion\RunOnce)){
    New-Item -Path Registry::HKEY_USERS\$($localadmin.SID.Value)\Software\Microsoft\Windows\CurrentVersion\RunOnce
}

### Create RunOnce Variable und set Path to Powershell Script
Set-ItemProperty -Path Registry::HKEY_USERS\$($localadmin.SID.Value)\Software\Microsoft\Windows\CurrentVersion\RunOnce -Name '!SetRegion' -Value {c:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -file "C:\Windows\Temp\SetRegion.ps1"}

### Unload HKEY_USER Hive of local Administrator
reg unload HKU\$($localadmin.SID.Value)

Ab diesen Zeitpunkt wären wir bereits dazu in der Lage, uns als lokaler Administrator anzumelden und die angesprochenen Regionseinstellungen würden automatisch gesetzt werden. An dieser Stelle bestünde allerdings noch ein Makel: Nachdem die Einstellungen gesetzt wurden, muss der Host einmal neugestartet werden. Das ist gerade bei einem vollautomatisiertem Deployment einer VM ein Problem, welches sich allerdings relativ einfach und mit vertretbaren Mitteln lösen lässt.

 

AutoLogon als Administrator

Wie bereits erwähnt, wird das SetRegion.ps1 Script automatisch beim ersten Logon des Administrators ausgeführt. Was wäre, wenn wir einfach die VM rebooten und zuvor den AutoLogon für den Benutzer aktivieren? Pingo – das Script würde automatisch laufen.

Um den Plan nun zu verwirklichen, müsst ihr euch aber vorab einige Fragen beantworten:

  • Müssen noch weitere Schritte im Deployment ausgeführt werden?
  • Ist mein Deployment-Script bootresistent?
  • Was passiert, wenn meine VM rebootet?
  • Für den AutoLogon benötige ich das Passwort des Administrators – wie komme ich zu diesem?
  • Wie starte ich die VM nach dem Setzen der Regionseinstellungen automatisch neu?

Den Ablauf müsst ihr gut planen – ich liefere euch in dem Sinne nur die Ideen und Scriptbausteine. Da bei meinem Deployment die VM selbst mehrmals neustartet und mein Script automatisiert aufgerufen wird und auch bootresistent ist, sieht der Weg bei mir wie folgt aus. Es ist relativ wahrscheinlich, dass ihr euer Administrator Password nicht in irgendwelchen VMWare Config Files speichert  – daher dürfte der dritte Block im nachfolgenden Script nicht relevant sein.

### Enable 'AutoLogon' 
Set-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name "AutoAdminLogon" -Value "1"

### Specify for which user AutoLogon should be enabled
Set-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name "DefaultUsername" -Value "Administrator"

### Extract the initial Administrator Password from the VMWare Config
$vmwaretoolspath = "C:\Program Files\VMware\VMware Tools\vmtoolsd.exe"
$tmp = & $vmwaretoolspath --cmd "info-get guestinfo.cloudinit.metadata" | Out-String
$tmp = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($tmp))
$tmp = $tmp -split "`n"
$tmp = $tmp | Select-String -Pattern "admin_pass"
$password = $tmp.ToString().substring(12)

### Set the Administrator Password
Set-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name "DefaultPassword" -Value "$password"

Startet die VM jetzt neu, erfolgt ein automatischer Logon für den Administrator. Nun muss man nur noch gewährleisten, dass man die zuvor gesetzten Registry Einträge wieder löscht (Passwort sonst im Klartext!) und die VM erneut rebootet.

Das das Thema sehr komplex ist und sich von den eingesetzten Technologien stark unterscheidet, biete ich euch nur die jeweiligen Bausteine und Ideen an. Bitte prüft selbst, ob der AutoLogon in eurem Szenario Sinn ergibt oder ob doch ein manueller Login vertretbar ist.

You may also like...

Abonnieren
Benachrichtige mich bei
guest
0 Comments
Inline Feedbacks
View all comments
0
Hinterlass' doch deine Meinung zu diesem Artikelx