The estimated reading time 7 minutes
NTFS AGDLP Gruppen zwischen zwei Domänen per Powershell erstellen
In der letzten Zeit hatte ich immer wieder kleinere Projekte in denen es um Migrationen von einem Forest in einen anderen ging. Hierbei gibt es viele Punkte zu beachten. Einer dieser Punkte ist der Dateiserver, welcher ebenfalls migriert werden muss. Viele der Dateiserver sind leider nicht nach dem bekannten AGDLP Prinzip strukturiert. Aus diesem Grund habe ich ein kleines Skript entwickelt welches eine Ordnerstruktur generiert und die entsprechenden NTFS Berechtigungen für beide Domänen richtig setzt.
Szenario:
Das Ziel ist also eine Koexistenz zwischen den beiden Domänen zu finden.
In meinem DemoLab hosten zwei separate Domänenkontroller zwei Forests.
Ein Domäne ist „demo01.it-koehler.com“ und die andere „demo02.it-koehler.com“.
Ein Domänenkontroller ist mit Windows Server 2016 und der zweite mit Windows Server 2019 17763 Core.
Zusätzlich habe ich eine bidirektionale Vertrauensstellung um das Ganze in beide Richtungen zu testen.
Die Freigabe „share02“ ist auf dc01-70 hinterlegt. Um dies zu zeigen kann ebenfalls das Windows Admin Center verwendet werden.
Auf dem dc01-70 habe ich ein kleine TXT-Datei (CSV Datei) mit der neuen Ordnerstruktur erstellt. (c:\temp\folders.txt)
Eine weitere Vorbereitung ist die Installation des NTFS Powershell Modules von Andree Raimund.
In meinem Lab wurde das Powershell Modul bereits auf der entsprechenden Maschine (dc01-70) installiert.
Ebenfalls habe ich die NTFS Berechtigungen bereits auf der obersten Ebene angepasst. Es werden nur administrative Berechtigungen gesetzt und diese dann nach unten vererbt.
(Owner Rights in deutsch Eigentümerrechte siehe mein Artikel)
(Domain Admins in deutsch Domänen-Admins)
In meinem Active Directory habe ich OUs für die neuen Gruppen erstellt. Zu Beginn sind diese natürlich leer.
So nun können wir mit dem Scripten beginnen 🙂
NTFS-Script:
#domain 1 informations $folderstructure = Get-Content -Path c:\temp\folders.txt -Encoding UTF8 $dir = "\\dc01-70.demo01.it-koehler.com\share02" $dc = "dc01-70.demo01.it-koehler.com" $ouglobaldemo01 = "OU=groups,OU=DEMO,DC=demo01,DC=it-koehler,DC=com" $outlocaldemo01 = "OU=groups,OU=DEMO,DC=demo01,DC=it-koehler,DC=com" $domainadmin = "demo01\domain admins" #groupnames $grouplocal = "loc_dc01-70_share02-" $groupglobal = "glo_dc01-70_share02-" #domain 2 only creating global groups and put them into local group of domain 1 $dcdemo02 = "dc0280.demo02.it-koehler.com" $ouglobaldemo02 = "OU=groups,OU=DEMO02,DC=demo02,DC=it-koehler,DC=com" #loading modules $ADModule='ActiveDirectory' if (Get-Module -Name $ADModule) { write-host 'Module' $ADModule 'already loaded' } else { Import-Module $ADModule -force write-host 'Module' $ADModule 'loaded successfully' } $NTFSModule='NTFSSecurity' if (Get-Module -Name $NTFSModule) { write-host 'Module' $NTFSModule 'already loaded' } else { Import-Module $NTFSModule -force write-host 'Module' $NTFSModule 'loaded successfully' } #credentials already available or not if ($credentialdemo02 -eq $null){ #getting credentials for second domain $credentialdemo02 = Get-Credential -Message "user for connecting to $dcdemo02" -UserName demo02\administrator } else{ Write-Host "Credentials already available." } #go through textfile and generate folders and groups in both domains foreach($newfolder in $folderstructure){ #generate path to folders $folderpath = "$dir\$NewFolder" #generate groupnames $groupnamelocalread = ("$grouplocal-"+$newfolder+"_r").ToLower() $groupnameglobalread = ("$groupglobal-"+$newfolder+"_r").ToLower() $groupnamelocalwrite = ("$grouplocal-"+$newfolder+"_w").ToLower() $groupnameglobalwrite = ("$groupglobal-"+$newfolder+"_w").ToLower() if( -Not (Test-Path -Path "$folderpath" ) ) { #generate folder New-Item -ItemType directory -Path "$folderpath".Tolower() | Out-Null Write-Host "folder $folderpath created" #group creation write in domain 1 New-ADGroup -server "$dc" -GroupScope global -Name "$groupnameglobalwrite" -Path "$ouglobaldemo01" -Description "global permission to write on $folderpath" New-ADGroup -server "$dc" -GroupScope domainlocal -Name "$groupnamelocalwrite" -Path "$outlocaldemo01" -Description "local permission to write on $folderpath" #group creation write in domain 2 New-ADGroup -server "$dcdemo02" -Credential $credentialdemo02 -GroupScope global -Name ("$groupnameglobalwrite").tolower() -Path "$ouglobaldemo02" -Description "global permission to write on $folderpath " #group nesting $tempreadgroupdemo01 = get-adgroup -server $dc -Identity ("$groupnameglobalwrite") $tempreadgroupdemo02 = get-adgroup -server $dcdemo02 -Credential $credentialdemo02 -Identity ("$groupnameglobalwrite") # group nesting domain 1 Add-ADGroupMember -Identity ("$groupnamelocalwrite") -Members $tempreadgroupdemo01 -Server $dc #group nesting domain 2 Add-ADGroupMember -Identity ("$groupnamelocalwrite") -Members $tempreadgroupdemo02 -Server $dc #generate folder #group creation read in domain 1 New-ADGroup -server "$dc" -GroupScope global -Name "$groupnameglobalread" -Path "$ouglobaldemo01" -Description "global permission to write on $folderpath" New-ADGroup -server "$dc" -GroupScope domainlocal -Name "$groupnamelocalread" -Path "$outlocaldemo01" -Description "local permission to write on $folderpath" #group creation read in domain 2 New-ADGroup -server "$dcdemo02" -Credential $credentialdemo02 -GroupScope global -Name ("$groupnameglobalread").tolower() -Path "$ouglobaldemo02" -Description "global permission to write on $folderpath " #group nesting $tempreadgroupdemo01 = get-adgroup -server $dc -Identity ("$groupnameglobalread") $tempreadgroupdemo02 = get-adgroup -server $dcdemo02 -Credential $credentialdemo02 -Identity ("$groupnameglobalread") # group nesting domain 1 Add-ADGroupMember -Identity ("$groupnamelocalread") -Members $tempreadgroupdemo01 -Server $dc #group nesting domain 2 Add-ADGroupMember -Identity ("$groupnamelocalread") -Members $tempreadgroupdemo02 -Server $dc Write-Host "Adding NTFS Permissions" #setting owner $folderpath | Set-NTFSOwner -Account "$domainadmin" Write-Host "New Owner on $NewFolder is $domainadmin " Write-Host "Addin other NTFS Permissions on $NewFolder " #write permission Add-NTFSAccess -Path "$folderpath" -Account ("$groupnamelocalwrite") -AccessRights ReadData,CreateFiles,Createdirectories,ReadExtendedAttributes,WriteExtendedAttributes,DeleteSubdirectoriesandFiles,ReadAttributes,WriteAttributes,ReadPermissions,ExecuteFile -AppliesTo ThisFolderSubfoldersAndFiles #read permission Add-NTFSAccess -Path "$folderpath" -Account ("$groupnamelocalread") -AccessRights Read,ReadAndExecute,ListDirectory -AppliesTo ThisFolderSubfoldersAndFiles Write-Host "NTFS Permissions set!" #show all NTFS permissions on folder Get-NTFSAccess -Path "$folderpath" | ft -AutoSize -Wrap } else { Write-Host "$newfolder Ordner existiert bereits, es wird nichts angelegt!" -ForegroundColor Yellow } }
Das Script fragt nach den Anmeldedaten für die zweite Domäne demo02.
Nach der Eingabe der Anmeldedaten wird zuerst zum lokalen DC verbunden und die Gruppen erstellt. Danach wird remote zur Domäne demo02 verbunden und die notwendigen Gruppen in dieser Domäne erstellt. Außerdem übernimmt das Script die Verschachtelung der Gruppen auch domänenübergreifend nach AGDLP.
Nun schauen wir uns mal die erstellten Ordner an.
Der Ordner bekommt die Administrativen Berechtigungen von „Share02“ und die domänenlokalen Gruppen stellen den Benutzern die Rechte zur Verfügung.
Zusätzlich wird in der Konsole eine kleine Übersicht über die entsprechenden Ordner ausgegeben.
Nachdem die Ordner /AD-Gruppen erstellt wurden, müssen diesen Gruppen nur noch die entsprechenden Benutzer zugeordnet werden (Globalen Gruppen).
WICHTIG: Den übergeordneten Ordner „share02“ nicht vergessen. In meinem DemoLab habe ich „Authentifizierte Benutzer“ lesend hinzugefügt.
Nun noch einige Erläuterungen zum Script, bzw. wo ihr eigene Anpassungen machen könnt/müsst:
#domain 1 informations $folderstructure = Get-Content -Path c:\temp\folders.txt -Encoding UTF8 $dir = "\\dc01-70.demo01.it-koehler.com\share02" $dc = "dc01-70.demo01.it-koehler.com" $ouglobaldemo01 = "OU=groups,OU=DEMO,DC=demo01,DC=it-koehler,DC=com" $outlocaldemo01 = "OU=groups,OU=DEMO,DC=demo01,DC=it-koehler,DC=com" $domainadmin = "demo01\domain admins" #groupnames $grouplocal = "loc_dc01-70_share02-" $groupglobal = "glo_dc01-70_share02-" #domain 2 only creating global groups and put them into local group of domain 1 $dcdemo02 = "dc0280.demo02.it-koehler.com" $ouglobaldemo02 = "OU=groups,OU=DEMO02,DC=demo02,DC=it-koehler,DC=com"
Linie 50-56
#generate path to folders $folderpath = "$dir\$NewFolder" #generate groupnames $groupnamelocalread = ("$grouplocal-"+$newfolder+"_r").ToLower() $groupnameglobalread = ("$groupglobal-"+$newfolder+"_r").ToLower() $groupnamelocalwrite = ("$grouplocal-"+$newfolder+"_w").ToLower() $groupnameglobalwrite = ("$groupglobal-"+$newfolder+"_w").ToLower()
Sollen weitere Berechtigungen vergeben werden, kann folgende Zeile angepasst werden:
#write permission Add-NTFSAccess -Path "$folderpath" -Account ("$groupnamelocalwrite") -AccessRights ReadData,CreateFiles,Createdirectories,ReadExtendedAttributes,WriteExtendedAttributes,DeleteSubdirectoriesandFiles,ReadAttributes,WriteAttributes,ReadPermissions,ExecuteFile -AppliesTo ThisFolderSubfoldersAndFiles #read permission Add-NTFSAccess -Path "$folderpath" -Account ("$groupnamelocalread") -AccessRights Read,ReadAndExecute,ListDirectory -AppliesTo ThisFolderSubfoldersAndFiles
In diesem Zustand führt das Script kaum Fehlerbehandlung durch, es prüft nur ab ob der Ordner bereits existiert.
Wenn euch der Artikel gefallen hat, dann klickt bitte auf „helpful“.
Viel Spaß beim Anpassen.
Für Weiterentwicklungen bin ich jeder Zeit bereit 🙂
Viele Fehler die auch den logischen Aufbau nicht vollziehen lassen.
ist so ein Beispiel
Hi,
danke für den Hinweis, ist nun korrigiert. Welche Fehler sind sonst noch aufgefallen? Was hättest am Aufbau anders gemacht?