
Aufgrund des ersten Artikels zum Thema Gruppenrichtlinien-Bereinigung bekam ich Nachfragen, so dass ich die Antworten gerne ebenfalls in einen neuen Artikel einarbeiten möchte.
Nicht genutzt WMI-Filter
Gruppenrichtlinien können mit WMI-Filtern eingeschÀnkt werden. Dadurch können diese auf definierte Systeme oder Benutzer angewandt werden, ohne strukturell in der DomÀnenstruktur zu definieren. Zum Bespiel können verschiedene Betriebssysteme oder auch Hardware-Hersteller gefiltert werden. Entsprechend können aber auch diese mit der Zeit ungenutzt im Speicher bleiben:
# Importieren des Active Directory-Moduls
Import-Module ActiveDirectory
# Funktion zum Finden nicht verlinkter WMI-Filter
function Get-UnlinkedWMIFilters {
# Abrufen aller WMI-Filter
$allWMIFilters = Get-GpoWMIFilter -All
# Liste zum Speichern nicht verlinkter WMI-Filter
$unlinkedWMIFilters = @()
# Schleife durch alle WMI-Filter
foreach ($filter in $allWMIFilters) {
# Abrufen aller verlinkten GPOs fĂŒr den aktuellen WMI-Filter
$linkedGPOs = Get-Gpo -All | Where-Object { $_.WmiFilter -eq $filter }
# ĂberprĂŒfen, ob keine GPOs verlinkt sind
if ($linkedGPOs.Count -eq 0) {
# HinzufĂŒgen des WMI-Filters zur Liste nicht verlinkter WMI-Filter
$unlinkedWMIFilters += $filter
}
}
# Ausgabe der nicht verlinkten WMI-Filter
foreach ($unlinkedFilter in $unlinkedWMIFilters) {
Write-Output "WMI-Filter '$($unlinkedFilter.Name)';(ID: $($unlinkedFilter.Id))"
}
}
# Aufruf der Funktion
Get-UnlinkedWMIFilters
Richtlinien ohne Sicherheitsfilter
Ăber Sicherheitsfilter wie AD-Benutzer, AD-Gruppen oder AD-Computer können ebenfalls Verteilungen wie bei den WMI-Filtern oder der aktiven FunktionalitĂ€t der Gruppenrichtlinien eingeschrĂ€nkt werden. So können auch in diesem Fall „AltbestĂ€nde“ vorhanden bleiben:
# Importieren des GroupPolicy-Moduls
Import-Module GroupPolicy
# Funktion zum Finden von GPOs ohne Sicherheitsfilter
function Get-GPOsWithoutSecurityFilter {
# Abrufen aller GPOs
$allGPOs = Get-GPO -All
# Liste zum Speichern von GPOs ohne Sicherheitsfilter
$gposWithoutSecurityFilter = @()
# Schleife durch alle GPOs
foreach ($gpo in $allGPOs) {
# Abrufen der Sicherheitsfilter des aktuellen GPO
$securityFilters = Get-GPOReport -Guid $gpo.Id -ReportType Xml | Select-String -Pattern "<SecurityGroup>" | Measure-Object
# ĂberprĂŒfen, ob keine Sicherheitsfilter vorhanden sind
if ($securityFilters.Count -eq 0) {
$gposWithoutSecurityFilter += $gpo
}
}
# Ausgabe der GPOs ohne Sicherheitsfilter
foreach ($gpo in $gposWithoutSecurityFilter) {
Write-Output "GPO-SecurityFilter '$($gpo.DisplayName)';(ID: $($gpo.Id))"
}
}
# Aufruf der Funktion
Get-GPOsWithoutSecurityFilter
In diesem Fall bitte ich allerdings eindringlich zu beachten, dass die Regelung auch ĂŒber Security-ACLs und spezielleren Rechten umgesetzt werden kann. Eine direkte Löschung aufgrund eines fehlenden Sicherheitsfilters empfehle ich definitiv nicht. Ăber den Reiter „Security“ sollten andere Berechtigungen zur Verteilung geprĂŒft werden.