Teil 1: AD-Gruppenmitglieder auslesen

Aufgabenstellung: Ein Umzug eines bzw. mehrerer Fileserver von einer Domäne in die andere inkl. Übernahme der bestehenden Berechtigungen. Die User sind in Domäne B Gruppen zugeordnet. Domäne B ist eine Unterdomäne von Domäne A. Der Fileserver ist in Domäne C und in dessen lokalen Gruppen sind die globalen Berechtigungsgruppen der Domäne B. Domäne C fällt weg und die Fileserver sollen zukünftig in Domäne A laufen und die Gruppen namenstechnisch aus Domäne C übernehmen.

Erster Schritt: Die Gruppenmitgliedschaft aus Domäne C (Vertrauensstellung zu Domäne A besteht) auslesen, um dort Leichen zu finden und zu bereinigen. Problem: Die Abtrennung in eine andere Domäne, erschwert den Zugriff, da in Domäne C keine Domainadminrechte vorhanden sind, lediglich Berechtigungen auf Fileebene und in bestimmte OU’s. Erster Versuch mit Get-ADGroupmember im Folgenden:

#Variablen definieren
$textfile="gruppen.txt"
$output="gruppen.csv"

# Gruppen auslesen und in Textfile schreiben.
DSQuery * -d domain.de -Filter "(&(objectClass=group)(member=*))" -Limit 0 >$textfile

#Textfile in Array
$gruppenhp = (Get-Content $textfile)

#Ausgabe Gruppenmitglieder
foreach ($_ in $gruppenhp)
    {
    Get-ADGroupMember -Identity $_
    }

Ergebnis: Mit Get-ADGroupmember können keine Gruppen aus fremden Domänen ausgelesen werden, es werden Gruppen aus Domäne A erwartet.

Zweiter Versuch mit DSQUERY und DSGET, der Abschnitt #Ausgabe Gruppenmitglieder wird ersetzt durch:

foreach ($a in $gruppenhp)
    {
    DSQUERY GROUP $a | DSGET GROUP -MEMBERS
    }

Hier klappt der Zugriff über Domänengrenzen hinweg, Problem: Die Gruppen können nicht aufgelöst werden und anstatt dem Gruppennamen wird nur die SID mit dem Hinweis auf „ForeignSecurityPrincipals“ ausgegeben. Überlegungen zur Nutzung von SID-Auflösung mittels System.Security.Principal.NTAccount habe ich aufgrund fehlender Scripterfahrung wieder verworfen, eine Automatisierung gestaltete sich hier schwierig…

Lösung dafür wäre das optimierte Cmdlet von Quest, das vollständige Script lautet:

#Questmodul laden
Add-PSSnapin Quest.ActiveRoles.ADManagement

#Variablen definieren
$textfile="gruppen.txt"
$output="gruppen.csv"

# Gruppen auslesen und in Textfile schreiben.
DSQuery * -d domain.de -Filter "(&(objectClass=group)(member=*))" -Limit 0 >$textfile

#Textfile in Array
$gruppenhp = (Get-Content $textfile)

#Ausgabe Gruppenmitglieder
foreach ($_ in $gruppenhp)
    {
    Get-QADGroupMember -Identity $_
    }

Aber: Hier macht die Variablenübergabe Probleme, was bei den erstgenannten Scripts funktioniert, meldet hier einen Fehler, anstatt Zeile für Zeile auszulesen und abzufragen, nimmt das Quest-Cmdlet die Variable nicht mit und meckert etwas über falsche Parameter. Sobald ich eine Lösung habe, wird sie hier veröffentlicht.

Leave a Reply