NTFS AGDLP Gruppen zwischen zwei Domänen per Powershell erstellen

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.

https://gallery.technet.microsoft.com/scriptcenter/1abd77a5-9c0b-4a2b-acef-90dbb2b84e85
https://www.powershellgallery.com/packages/NTFSSecurity/4.2.4

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 🙂

Was this article helpful?
YesNo
5 1 vote
Article Rating
Abonnieren
Benachrichtige mich bei
guest
2 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
Martin
Martin
2 Jahre zuvor

Viele Fehler die auch den logischen Aufbau nicht vollziehen lassen.

$outlocaldemo01

ist so ein Beispiel