Gruppenrichtlinien mit PowerShell bearbeiten

Mit der PowerShell lassen sich nicht nur Gruppenrichtlinien sichern und importieren sondern auch geziehlt einzelne Einstellungen mittels „Set-GPRegistryValue“ anpassen.

Wie im letzten Beitrag (https://jans.cloud/2019/08/microsoft-fslogix-profile-container/) bereits genutzt, hier ein wenig mehr zum Arbeiten mit / in Gruppenrichtlinien-Objekten und der PowerShell.

Warum nicht einfach einmalig Konfigurieren, dann sichern, und in der Zielumgebung importieren?

  1. Darum!
  2. Weil ichs kann!
  3. Wie im Beispiel unten zu sehen ist, ist sicherlich nicht in jeder Umgebung z.B. der Remotedesktop-Lizenzserver „rdslic01.jans.cloud“ ;). Ebenfalls könnten sich Domain-Namen, Profilspeicherorte, etc. pp. ändern, was eine „händische“ Anpassung (oder eine Anpassung per „Migration Table„) mit sich ziehen würde.
  4. Am Ende des Tages läuft es sicherlich auf eine Mischung von vorhandenen zu importierenden GPO-Sets raus, wo an entsprechender Stelle die „Dynamik“ per GPO und den Set- / Get-GPRegistryValue-CMDLets erfolgt.

Daher legen wir los: Im ersten Step lege ich einfach ein leeres GPO an und schaue einmal, getreu dem Motto „Doof darf man sein, man muss sich nur zu helfen wissen“, mit Get-GPRegistryValue nach, was ich da so finde, um es später einfach mit Set-GPRegistryValue zu ändern. Leider nein, leider gar nicht. Das endet im Fehler. Daher setzen wir doch einfach einmal drei „Test Keys“ in der neu erstellten Richtlinie und schauen erneut nach.

Get-GPRegistryValue : Die folgende Gruppenrichtlinien-Registrierungseinstellung wurde nicht gefunden: „HKEY_LOCAL_MACHINE\Software“.
Parametername: keyPath
In Zeile:1 Zeichen:1
Get-GPRegistryValue „C_Mein_TestGPO“ -Key „HKLM\Software“
~~~~~~~~~~~~~ CategoryInfo : InvalidArgument: (Microsoft.Group…tryValueCommand:GetGPRegistryValueCommand) [Get-GPRegistryValue], ArgumentException
FullyQualifiedErrorId : UnableToRetrievePolicyRegistryItem,Microsoft.GroupPolicy.Commands.GetGPRegistryValueCommand

PowerShell Fehler „Get-GPRegistryValue“ bei leerem GPO
$GPOObject = New-GPO "C_Mein_TestGPO"

# Endet im Fehler (Bild 1)
Get-GPRegistryValue "C_Mein_TestGPO" -Key "HKLM\Software"
# Die Remotedesktop-Lizenzierung wurde gesetzt (Bild 2 und 3)
Get-GPRegistryValue "C_Mein_TestGPO" -Key "HKLM\Software"
# Weiterhangel.. (Bild 4)
Get-GPRegistryValue "C_Mein_TestGPO" -Key "HKLM\Software\Policies"
# Bis zum Ende (Bild 5)
Get-GPRegistryValue "C_Mein_TestGPO" -Key "HKLM\Software\Policies\Microsoft\Windows NT\Terminal Services"

Schaut man sich die Ergebnisse etwas „genauer“ an, stellt man sicherlich fest, dass das ganze ja der Registry ziemlich nahe kommt bzw. identisch mit dem ist, was später auf dem Client im Policy-Zweig ankommt *Magic*. 😉 Zum Setzen / Ändern der Einstellungen im GPO geht es direkt mit Set-GPRegistryValue weiter. Dazu wird benötigt:

  1. Name oder GuId des GPO (C_Mein_TestGPO)
  2. Key (KeyPath vom CMDlet Get-GPRegistryValue (oben Bild 5)
  3. ValueName (Ebenfalls Bild 5)
  4. Value (siehe Bild 5)
  5. Type (Bild 5)
# Das jeweilige "Gegenteil" wird konfiguriert:
Set-GPRegistryValue "C_Mein_TestGPO" -Key "HKLM\Software\Policies\Microsoft\Windows NT\Terminal Services" -ValueName fDisableTerminalServerTooltip -Value 0 -Type DWord
Set-GPRegistryValue "C_Mein_TestGPO" -Key "HKLM\Software\Policies\Microsoft\Windows NT\Terminal Services" -ValueName LicensingMode -Value 2 -Type DWord
Set-GPRegistryValue "C_Mein_TestGPO" -Key "HKLM\Software\Policies\Microsoft\Windows NT\Terminal Services" -ValueName LicenseServers -Value "rdslica01.dertest.org" -Type String

# Eine Einstellung wird auf "Nicht konfiguriert" zurückgesetzt:
Set-GPRegistryValue "C_Mein_TestGPO" -Key "HKLM\Software\Policies\Microsoft\Windows NT\Terminal Services" -ValueName fDisableTerminalServerTooltip -Disable

# Der ganze Zweig wird auf "Nicht konfiguriert" zurückgesetzt:
Set-GPRegistryValue "C_Mein_TestGPO" -Key "HKLM\Software\Policies\Microsoft\Windows NT\Terminal Services" -Disable

Hier gehe ich noch auf Punkt 4 „Am Ende des Tages“ mit einem Besipielszenario ein: Es wird ein neues GPO erstellt, verlinkt, eine Sicherung* importiert und der RDS-Lizenzierungs-Host angepasst.

* Die Sicherung habe ich bereits vorbereitet und bei mir unter „C:\Install\GPOs\C_RDSLizenzierung“ abgelegt

$RDSLicHost = $("rdslic01" + "." + $env:USERDNSDOMAIN.ToLower())
do{
    $LinkGPOToOU = Get-ADOrganizationalUnit -Filter * | Select-Object Name, DistinguishedName | Sort-Object Name | Out-GridView -Title "Wo soll das GPO verlinkt werden?" -PassThru
}until($LinkGPOToOU)
$LinkGPOToOU = Get-ADOrganizationalUnit $LinkGPOToOU.DistinguishedName

$LatestBackupID = $(Get-ChildItem -Path "C:\Install\GPOs\C_RDSLizenzierung" | Sort-Object LastWriteTime -Descending | Select-Object -First 1).Name.Split("{")[1].Split("}")[0]

$NewGPO = New-GPO "C_RDSLizenzierung" | New-GPLink -Target $LinkGPOToOU.DistinguishedName -LinkEnabled Yes
Import-GPO -TargetGuid $NewGPO.GpoId -BackupId $LatestBackupID -Path "C:\Install\GPOs\C_RDSLizenzierung"

Set-GPRegistryValue -GuId $NewGPO.GpoId -Key "HKLM\Software\Policies\Microsoft\Windows NT\Terminal Services" -ValueName LicenseServers -Value $RDSLicHost -Type String

Was passiert hier eigentlich?

  1. Der FQDN des Lizenzierungshosts wird mit dem Host „rdslic01“ und der „USERDNSDOMAIN“ erstellt
  2. Die OUs der aktuellen Domäne werden solange ausgelesen bis eine OU ausgewählt wird
  3. Da eine GPO-Vorlage durchaus schonmal angepasst werden kann, suche ich mir im Sicherungs-Ordner die neuste Version aus und schneide die führende „{“ und abschließende „}“ ab
  4. Das neue GPO wird erzeugt und direkt an die in Schritt 2 auerkorene OU verlinkt
  5. Der eigentliche Import des GPOs
  6. Anpassung des Lizenzierungshosts an die aktuelle Umgebung

Abschließende Anmerkung: Wer die Einstellungen nicht händisch durchklicken möchte, um diese dann mittels Get-GPRegistryValue auszulesen und später mit Set-GPRegistryValue zu setzen, der darf sich gerne bei der Group Policy Search oder GetADMX bedienen.

Windows Zertifikatsspeicher unter Firefox nutzen Part II

Hier ein kleines Update zum Beitrag wie der Windows Zertifikatsspeicher im Firefox Browser genutzt werden kann.

Um es ganz kurz zu halten: Mozilla hat dem Firefox ab der Version 60 beigebracht mit Gruppenrichtlinien umzugehen. Yay! 🙂 Dazu einfach die ADMX Templates von github (https://github.com/mozilla/policy-templates/releases) laden und in den zentralen Richtlinienspeicher (PolicyDefinitions Ordner (\\<Domain DNS Name\SYSVOL\<Domain DNS Name>\Policies\PolicyDefinitions)) kopieren. Im Anschluss die Gruppenrichtlinienverwaltung (gpmc.msc) starten, in der Computer- und / oder Benutzerkonfiguration in die administrativen Vorlagen wechseln und Mozilla -> Firefox -> Zertifikate -> Windows Zertifikatsspeicher benutzern -> Aktivieren.

Wie man sehen kann lässt sich die Einstellung „security.enterprise_roots.enabled“ im about:config-Tab nicht mehr ändern und diese erhält durch die Richtlinie den Status „gesperrt“.

Neben der Aktivierung des Windows Zertifikatsspeichers im Firefox können die Richtlinien noch ein wenig mehr wie zum Beispiel die Ausführung von Flash nur auf bestimmten Seiten zulassen oder den Zugriff auf Kamera, Mikrofon und Standort steuern. Eine vollständige Liste gibt es ebenfalls auf github bzw. im ZIP File mit den GPO Templates: https://github.com/mozilla/policy-templates/blob/master/README.md

Windows Zertifikatsspeicher unter Firefox nutzen

Mit dem Firefox Browser der eigenen Enterprise CA bzw. den Zertifikaten im Windows Zertifikatsspeicher vertrauen.

In einem Kundenprojekt gab es den Bedarf an einer zweistufigen Public Key Infrastruktur sowie der Nutzung des Firefox Browsers. Zum Einen gab es hier die Herausforderung dem Firefox beizubringen den Windows Zertifikatsspeicher zu nutzen sowie zum Anderen diese Einstellung nach Möglichkeit automatisiert auszurollen.

Update: Ab Version 60 versteht der Mozilla Firefox Gruppenrichtlinien – Juchuu!

Damit der Firefox Browser den per GPO verteilten Zertifikaten (Computer Konfiguration -> Windows Einstellungen -> Sicherheitseinstellungen -> Richtlinien für öffentliche Schlüssel -> Vertrauenswürdige Stammzertifizierungsstellen bzw. Zwischenzertifizierungsstellen) vertraut muss im Firefox im about:config Tab die Nutzung der Enterprise Roots aktiviert werden.

Um die guten Schuhe zu schonen wird jetzt ein Weg benötitig, diese Einstellung zu verteilen. Dazu wird ein GPO oder ein Start-Up-Script benötigt welches eine js-Datei ins Firefox Programmverzeichniss (C:\Program Files (x86)\Mozilla Firefox\defaults\pref) kopiert. Als Beispiel die Verteilung per GPO:

Dazu eine Freigabe erstellen in der die Computerkonten bzw. die „Authentifizierten User“ Lesen dürfen sowie ebenfalls das NTFS Recht „Lesen“ besitzen.

Im Ordner eine „EnableRoot.js“-Datei anlegen

/* Windows Zertifikatsspeicher nutzen */
pref("security.enterprise_roots.enabled", true);

GPO erstellen welche mit der entsprechenden Computer-OU verlinkt ist und unter Computerkonfiguration -> Einstellungen -> Windows-Einstellungen -> Dateien eine „neue Datei“ erstellen sowie eine Zielgruppenadressierung für x64 bzw. 64 Bit Systeme hinzufügen:

Quelldatei(en): \\<Server>\<Freigabe>\EnableRoot.js
Zieldatei: C:\Program Files (x86)\Mozilla Firefox\defaults\pref\EnableRoot.js
Select * from Win32_Processor where AddressWidth = ’64‘

Gruppenrichtlinien Einstellung (Group Policy Preference) für 64-Bit

Für die älteren x86 bzw. 32 Bit Clients folgende „neue Datei“ samt Zielgruppenadressierung erstellen:

Quelldatei(en): \\<Server>\<Freigabe>\EnableRoot.js
Zieldatei: C:\Program Files\Mozilla Firefox\defaults\pref\EnableRoot.js
Select * from Win32_Processor where AddressWidth = ’32‘

Gruppenrichtlinien Einstellung (Group Policy Preference) für 32-Bit
Gruppenrichtlinien-Einstellungen und Zielgruppenadressierung
Gruppenrichtlinien-Einstellungen und Zielgruppenadressierung

Im Worst-Case den Client einmal durchbooten, sofern es ein neues GPO ist oder per „gpupdate“ die Gruppenrichtlinien erneut anwenden.