mybestdog
Goto Top

Probleme beim Zuweisen von Gruppenberechtigungen mit PowerShell: Gruppen werden nicht korrekt in den Ordner eingetragen

Hallo,

ich habe ein Problem mit meinem Powershell-skript. Es legt zwar User und Gruppen an und weißt es zu. Aber mein Problem besteht darin das es die Gruppen nicht zu den Ordner richtig bzw. gar nicht zuweist. Mein ziel ist es das
BenutzerA und Benutzer C Lese- und Schreibrechte für den Ordner Buchhaltung und Unterordner erhält,
BenutzerB soll Leserechte für den Ordner Buchhaltung und Unterordner erhalten. Zusätzlich Lese- und Schreiberechte für den Ordner Vertrieb erhalten,
BenutzerD soll Lese- und Schreiberechte für den Ordner Geschäftsführung erhalten,
BenutzerF soll Lese- und Schreiberechte für den Ordner Vertrieb und den Unterordner Graz erhalten,
BenutzerE soll Leserechte für den Ordner Buchhaltung und den Unterordner 2020_21 erhalten,
BenutzerB und BenutzerC sollen Lese- und Schreibrechte für den Ordner Technik erhalten.
Anbei das Skript:
# Benutzername
$username = "BenutzerA"  

# Festes Passwort
$password = "2007"  

# Benutzer "BenutzerA" anlegen  
net user $username $password /add




# Benutzername
$username = "BenutzerB"  

# Festes Passwort
$password = "2007"  

# Benutzer "BenutzerB" anlegen  
net user $username $password /add




# Benutzername
$username = "BenutzerC"  

# Festes Passwort
$password = "2007"  

# Benutzer "BenutzerC" anlegen  
net user $username $password /add



# Benutzername
$username = "BenutzerD"  

# Festes Passwort
$password = "2007"  

# Benutzer "BenutzerD" anlegen  
net user $username $password /add



# Benutzername
$username = "BenutzerE"  

# Festes Passwort
$password = "2007"  

# Benutzer "BenutzerE" anlegen  
net user $username $password /add




# Benutzername
$username = "BenutzerF"  

# Festes Passwort
$password = "2007"  

# Benutzer "BenutzerF" anlegen  
net user $username $password /add

New-LocalGroup -Name "grp.Buchhaltung.rw"   
New-LocalGroup -Name "grp.Buchhaltung.r"  
New-LocalGroup -Name "grp.Buchhaltung.2021_22.rw"  
New-LocalGroup -Name "grp.Buchhaltung.2021_22.r"  
New-LocalGroup -Name "grp.Buchhaltung.2020_21.rw"  
New-LocalGroup -Name "grp.Buchhaltung.2020_21.r"  
New-LocalGroup -Name "grp.Buchhaltung.2019_20.rw"  
New-LocalGroup -Name "grp.Buchhaltung.2019_20.r"  
New-LocalGroup -Name "grp.Geschäftsführung.rw"  
New-LocalGroup -Name "grp.Geschäftsführung.r"  
New-LocalGroup -Name "grp.Technik.rw"  
New-LocalGroup -Name "grp.Technik.r"  
New-LocalGroup -Name "grp.Vertrieb.rw"  
New-LocalGroup -Name "grp.Vertrieb.r"  
New-LocalGroup -Name "grp.Vertrieb.Graz.rw"  
New-LocalGroup -Name "grp.Vertrieb.Graz.r"  
New-LocalGroup -Name "grp.Vertrieb.Klagenfurt.rw"  
New-LocalGroup -Name "grp.Vertrieb.Klagenfurt.r"  
New-LocalGroup -Name "grp.Vertrieb.Wien.rw"  
New-LocalGroup -Name "grp.Vertrieb.Wien.r"  


New-Item -ItemType Directory -Path 'E:\Share'  
New-Item -ItemType Directory -Path 'E:\Share\Buchhaltung'  
New-Item -ItemType Directory -Path 'E:\Share\Buchhaltung\2021_22'  
New-Item -ItemType Directory -Path 'E:\Share\Buchhaltung\2020_21'  
New-Item -ItemType Directory -Path 'E:\Share\Buchhaltung\2019_20'  
New-Item -ItemType Directory -Path 'E:\Share\Technik'  
New-Item -ItemType Directory -Path 'E:\Share\Geschäftsführung'   
New-Item -ItemType Directory -Path 'E:\Share\Vertrieb'  
New-Item -ItemType Directory -Path 'E:\Share\Vertrieb\Wien'  
New-Item -ItemType Directory -Path 'E:\Share\Vertrieb\Graz'   
New-Item -ItemType Directory -Path 'E:\Share\Vertrieb\Klagenfurt'  

Add-LocalGroupMember -Group "grp.Buchhaltung.rw" -Member "BenutzerA"   
Add-LocalGroupMember -Group "grp.Buchhaltung.2021_22.rw" -Member "BenutzerA"   
Add-LocalGroupMember -Group "grp.Buchhaltung.2020_21.rw" -Member "BenutzerA"   
Add-LocalGroupMember -Group "grp.Buchhaltung.2019_20.rw" -Member "BenutzerA"   
Add-LocalGroupMember -Group "grp.Buchhaltung.rw" -Member "BenutzerC"  
Add-LocalGroupMember -Group "grp.Buchhaltung.2021_22.rw" -Member "BenutzerC"   
Add-LocalGroupMember -Group "grp.Buchhaltung.2020_21.rw" -Member "BenutzerC"   
Add-LocalGroupMember -Group "grp.Buchhaltung.2019_20.rw" -Member "BenutzerC"   
Add-LocalGroupMember -Group "grp.Buchhaltung.r" -Member "BenutzerB"  
Add-LocalGroupMember -Group "grp.Vertrieb.rw" -Member "BenutzerB"  
Add-LocalGroupMember -Group "grp.Vertrieb.Wien.rw" -Member "BenutzerB"  
Add-LocalGroupMember -Group "grp.Vertrieb.Graz.rw" -Member "BenutzerB"  
Add-LocalGroupMember -Group "grp.Vertrieb.Klagenfurt.rw" -Member "BenutzerB"  
Add-LocalGroupMember -Group "grp.Geschäftsführung.rw" -Member "BenutzerD"  
Add-LocalGroupMember -Group "grp.Vertrieb.rw" -Member "BenutzerF"  
Add-LocalGroupMember -Group "grp.Vertrieb.Graz.rw" -Member "BenutzerF"  
Add-LocalGroupMember -Group "grp.Buchhaltung.r" -Member "BenutzerE"  
Add-LocalGroupMember -Group "grp.Buchhaltung.2020_21.r" -Member "BenutzerE"  
Add-LocalGroupMember -Group "grp.Technik.rw" -Member "BenutzerB"  
Add-LocalGroupMember -Group "grp.Technik.rw" -Member "BenutzerC"  


foreach ($permission in $permissions) {
    $group = $permission.Group
    $path = $permission.Path
    $Acl = Get-Acl -Path $path
    if ($group -eq "grp.Buchhaltung.rw" -or $group -eq "grp.Buchhaltung.2019_20.rw" -or $group -eq "grp.Vertrieb.rw" -or $group -eq "grp.Geschäftsführung.rw" -or $group -eq "grp.Vertrieb.Graz.rw" -or $group -eq "grp.Vertrieb.Klagenfurt.rw" -or $group -eq "grp.Technik.rw") {  
        $Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read,Write", "Allow")  
    } elseif ($group -eq "grp.Buchhaltung.r" -or $group -eq "grp.Buchhaltung.2020_21.r" -or $group -eq "grp.Technik.r" -or $group -eq "grp.Vertrieb.r" -or $group -eq "grp.Vertrieb.Wien.r") {  
        $Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")  
    }
    Set-Acl -Path $path -AclObject $Acl
}
$folderPath = "E:\Share\Buchhaltung"  
$group = "grp.Buchhaltung.rw"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Buchhaltung"  
$group = "grp.Buchhaltung.r"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Buchhaltung\2021_22"  
$group = "grp.Buchhaltung.2021_22.rw"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Buchhaltung\2021_22"  
$group = "grp.Buchhaltung.2021_22.r"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Buchhaltung\2020_21"  
$group = "grp.Buchhaltung.2020_21.rw"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Buchhaltung\2020_21"  
$group = "grp.Buchhaltung.2020_21.r"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Buchhaltung\2019_20"  
$group = "grp.Buchhaltung.2019_20.rw"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Buchhaltung\2019_20"  
$group = "grp.Buchhaltung.2019_20.r"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Technik"  
$group = "grp.Technik.rw"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Technik"  
$group = "grp.Technik.r"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Geschäftsführung"  
$group = "grp.Geschäftsführung.rw"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Geschäftsführung"  
$group = "grp.Geschäftsführung.r"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Vertrieb"  
$group = "grp.Vertrieb.rw"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Vertrieb"  
$group = "grp.Vertrieb.r"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Vertrieb\Wien"  
$group = "grp.Vertrieb.Wien.rw"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Vertrieb\Wien"  
$group = "grp.Vertrieb.Wien.r"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Vertrieb\Graz"  
$group = "grp.Vertrieb.Graz.rw"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Vertrieb\Graz"  
$group = "grp.Vertrieb.Graz.r"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Vertrieb\Klagenfurt"  
$group = "grp.Vertrieb.Klagenfurt.rw"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


$folderPath = "E:\Share\Vertrieb\Klagenfurt"  
$group = "grp.Vertrieb.Klagenfurt.r"  
$Acl = Get-Acl -Path $folderPath
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")   
$Acl.AddAccessRule($Permission)
Set-Acl -Path $folderPath -AclObject $Acl 


Vielen Dank im Vorraus!

Content-Key: 62914594929

Url: https://administrator.de/contentid/62914594929

Printed on: April 27, 2024 at 11:04 o'clock

Mitglied: 5388706050
5388706050 Jan 10, 2024 at 14:14:37 (UTC)
Goto Top
Moin,

so, wie ich das sehe, schreibst Du Deine erzeugten AccessRule-Instanzen
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")  
nicht in das ACL-Objekt zurück, ehe Du dieses per
Set-Acl -Path $folderPath -AclObject $Acl
setzt.

Dazwischen gehört imho noch ein
$Acl.AddAccessRule($Permission)
damit's klappt. Hab's nicht getestet...

Viel Erfolg!
Member: Mybestdog
Mybestdog Jan 10, 2024 updated at 14:48:49 (UTC)
Goto Top
Zitat von @5388706050:

Moin,

so, wie ich das sehe, schreibst Du Deine erzeugten AccessRule-Instanzen
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")  
nicht in das ACL-Objekt zurück, ehe Du dieses per
Set-Acl -Path $folderPath -AclObject $Acl
setzt.

Dazwischen gehört imho noch ein
$Acl.AddAccessRule($Permission)
damit's klappt. Hab's nicht getestet...

Viel Erfolg!

Vielen Dank für Ihre schnelle Rückmeldung!

Leider hat es nicht geklappt und es passiert dasselbe wie vorher.

Ich habe den code jetzt überarbeitet wieder als Frage oben eingeben. Chat GPT hat bisschen was am Code geändert.... Jedoch kommt jetzt kein Fehler mehr aber funktioniert trotzdem nicht.
Member: erikro
erikro Jan 11, 2024 at 08:06:51 (UTC)
Goto Top
Moin,

so wie ich das sehe, fehlt der Kontext der Gruppe (welche Domain oder welcher Rechner). Da das aussieht, als ob das eine lokale Einrichtung ist, versuche mal:

$group = "rechnername\gruppenname"  

hth

Erik
Member: colinardo
Solution colinardo Jan 12, 2024, updated at Jan 18, 2024 at 16:42:22 (UTC)
Goto Top
Servus @Mybestdog, willkommen auf Administrator.de!
Chat GPT hat bisschen was am Code geändert....
Neiiiin 😱. Eine Sprache von Grund auf Lernen ist nach wie vor nachhaltiger face-smile, ChatGPT generiert da oft noch hanebüchenen Code, je nachdem wie man seine Fragen formuliert.
Für den Anfang kann ich dir den Powershell Leitfaden für Anfänger wärmstens ans Herz legen.

Mal was zusammen gestöpselt und die sich ständig wiederholenden redundanten Teile durch Hashtables und Schleifen eliminiert.
$ErrorActionPreference = 'Stop'  
# restart elevated if needed
if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){start powershell -Verb runas -ArgumentList '-File',$MyInvocation.MyCommand.Definition;exit}  

# add privilege tokens
Add-Type '[DllImport("ntdll.dll")] public static extern int RtlAdjustPrivilege(int Privilege, bool Enable, bool CurrentThread, ref bool EnabledOut);' -name token -namespace privilege  
9,17,18 | %{[void][privilege.token]::RtlAdjustPrivilege($_,1,0,[ref]0)}

# function to set filesystem permissions
function Set-FileSystemPermission {
    param(
        [parameter(mandatory=$true)][ValidateScript({Test-Path $_})][string]$path,
        [parameter(mandatory=$true)][string]$principal,
        [parameter(mandatory=$true)][ValidateSet("AppendData","ChangePermissions","CreateDirectories","CreateFiles","Delete","DeleteSubdirectoriesAndFiles","ExecuteFile","FullControl","ListDirectory","Modify","Read","ReadAndExecute","ReadAttributes","ReadData","ReadExtendedAttributes","ReadPermissions","Synchronize","TakeOwnership","Traverse","Write","WriteAttributes","WriteData","WriteExtendedAttributes")][string[]]$AccessRights,  
        [parameter(mandatory=$false)][ValidateSet("Allow","Deny")][string]$ControlType = "Allow",  
        [parameter(mandatory=$false)][ValidateSet( "folder","folder;sub-folders;files","folder;sub-folders","folder;files","sub-folders;files","sub-folders","files")][string]$inheritance = "folder;sub-folders;files",  
        [parameter(mandatory=$false)][bool]$disableInheritance = $false,
        [parameter(mandatory=$false)][bool]$keepExistingRules = $true
    )

    process{
        try{
            # inheritance and propagation Zuordnung
            $inheritance_table = @{
                "folder" = @{I="none";P="none"}  
                "folder;sub-folders;files" = @{I="ContainerInherit,ObjectInherit";P="none"}  
                "folder;sub-folders" = @{I="ContainerInherit";P="none"}  
                "folder;files" = @{I="ObjectInherit";P="none"}  
                "sub-folders;files" = @{I="ContainerInherit,ObjectInherit";P="InheritOnly"}  
                "sub-folders" = @{I="ContainerInherit";P="InheritOnly"}  
                "files" = @{I="ObjectInherit";P="InheritOnly"}  
            }
            # bestehende ACL speichern
            $acl = Get-ACL $path
            # wenn Pfad ein Ordner ist
            if ((get-item $path).PSIsContainer){
                # Vererbung der ACL festlegen
                $acl.SetAccessRuleProtection($disableInheritance,$keepExistingRules)
                # Access Rule erstellen
                $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($principal,$AccessRights,$inheritance_table[$inheritance].I,$inheritance_table[$inheritance].P,$ControlType)
            }else{
                $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($principal,$AccessRights,$ControlType)
            }
            # AccessRule der ACL hinzufügen
            $acl.SetAccessRule($objACE)
            # Schreibe die ACL
            set-acl -Path $path -AclObject $acl
            return $objACE
        }catch{ 
            write-Error $_
        }
    }
}

# define groups
$groups = "grp.Buchhaltung.rw",  
          "grp.Buchhaltung.r",  
          "grp.Buchhaltung.2021_22.rw",  
          "grp.Buchhaltung.2021_22.r",  
          "grp.Buchhaltung.2020_21.rw",  
          "grp.Buchhaltung.2020_21.r",  
          "grp.Buchhaltung.2019_20.rw",  
          "grp.Buchhaltung.2019_20.r",  
          "grp.Geschäftsführung.rw",  
          "grp.Geschäftsführung.r",  
          "grp.Technik.rw",  
          "grp.Technik.r",  
          "grp.Vertrieb.rw",  
          "grp.Vertrieb.r",  
          "grp.Vertrieb.Graz.rw",  
          "grp.Vertrieb.Graz.r",  
          "grp.Vertrieb.Klagenfurt.rw",  
          "grp.Vertrieb.Klagenfurt.r",  
          "grp.Vertrieb.Wien.rw",  
          "grp.Vertrieb.Wien.r"  

# define users with their membership
$users = [ordered]@{
    'BenutzerA' = @{  
        Password = "Passw0rd"  
        Groups = "grp.Buchhaltung.2021_22.rw","grp.Buchhaltung.rw","grp.Buchhaltung.2020_21.rw"  
    }
    'BenutzerB' = @{  
        Password = "Passw0rd"  
        Groups = "grp.Buchhaltung.r","grp.Vertrieb.rw","grp.Vertrieb.Wien.rw","grp.Vertrieb.Graz.rw","grp.Vertrieb.Klagenfurt.rw","grp.Technik.rw"  
    }
    'BenutzerC' = @{  
        Password = "Passw0rd"  
        Groups = "grp.Buchhaltung.2021_22.rw","grp.Buchhaltung.rw","grp.Buchhaltung.2020_21.rw","grp.Buchhaltung.2019_20.rw","grp.Technik.rw"  
    }
    'BenutzerD' = @{  
        Password = "Passw0rd"  
        Groups = "grp.Geschäftsführung.rw"  
    }
    'BenutzerE' = @{  
        Password = "Passw0rd"  
        Groups = "grp.Buchhaltung.2020_21.r"  
    }
    'BenutzerF' = @{  
        Password = "Passw0rd"  
        Groups = "grp.Vertrieb.Graz.rw"  
    }
}

# define folders and rights to assign
$folders = [ordered]@{
    'E:\share' = @{  
        Protect = $true
        KeepRules = $false
        Rights = @{Groups=$groups;AccessRights='ListDirectory';Inheritance='folder'},@{Groups="SYSTEM";AccessRights='FullControl';Inheritance='folder;sub-folders;files'},@{Groups=(Get-Localgroup -SID S-1-5-32-544).Name;AccessRights='FullControl';Inheritance='folder;sub-folders;files'}  
    }
    'E:\share\Buchhaltung' = @{  
       Protect=$false
       KeepRules = $true
       Rights = @{Groups="grp.Buchhaltung.r";AccessRights='ReadAndExecute';Inheritance='folder;sub-folders;files'}, @{Groups="grp.Buchhaltung.rw";AccessRights='Modify';Inheritance='folder;sub-folders;files'}  
    }
    'E:\share\Buchhaltung\2021_22' = @{  
        Protect=$false
        KeepRules = $true
        Rights = @{Groups="grp.Buchhaltung.2021_22.r";AccessRights='ReadAndExecute';Inheritance='folder;sub-folders;files'}, @{Groups="grp.Buchhaltung.2021_22.rw";AccessRights='Modify';Inheritance='folder;sub-folders;files'}  
    }
    'E:\share\Buchhaltung\2020_21' = @{  
        Protect=$false
        KeepRules = $true
        Rights = @{Groups="grp.Buchhaltung.2020_21.r";AccessRights='ReadAndExecute';Inheritance='folder;sub-folders;files'}, @{Groups="grp.Buchhaltung.2020_21.rw";AccessRights='Modify';Inheritance='folder;sub-folders;files'}  
    }
    'E:\share\Buchhaltung\2019_20' = @{  
        Protect=$false
        KeepRules = $true
        Rights = @{Groups="grp.Buchhaltung.2019_20.r";AccessRights='ReadAndExecute';Inheritance='folder;sub-folders;files'}, @{Groups="grp.Buchhaltung.2019_20.rw";AccessRights='Modify';Inheritance='folder;sub-folders;files'}  
    }
    'E:\share\Technik' = @{  
        Protect=$false
        KeepRules = $true
        Rights = @{Groups="grp.Technik.r";AccessRights='ReadAndExecute';Inheritance='folder;sub-folders;files'},@{Groups="grp.Technik.rw";AccessRights='Modify';Inheritance='folder;sub-folders;files'}  
    }
    'E:\share\Geschäftsführung' = @{  
        Protect=$false
        KeepRules = $true
        Rights = @{Groups="grp.Geschäftsführung.r";AccessRights='ReadAndExecute';Inheritance='folder;sub-folders;files'},@{Groups="grp.Geschäftsführung.rw";AccessRights='Modify';Inheritance='folder;sub-folders;files'}  
    }
    'E:\share\Vertrieb' = @{  
        Protect=$false
        KeepRules = $true
        Rights = @{Groups="grp.Vertrieb.r";AccessRights='ReadAndExecute';Inheritance='folder;sub-folders;files'},@{Groups="grp.Vertrieb.rw";AccessRights='Modify';Inheritance='folder;sub-folders;files'}  
    }
    'E:\share\Vertrieb\Wien' = @{  
        Protect=$false
        KeepRules = $true
        Rights = @{Groups="grp.Vertrieb.Wien.r";AccessRights='ReadAndExecute';Inheritance='folder;sub-folders;files'},@{Groups="grp.Vertrieb.Wien.rw";AccessRights='Modify';Inheritance='folder;sub-folders;files'}  
    }
    'E:\share\Vertrieb\Graz' = @{  
        Protect=$false
        KeepRules = $true
        Rights = @{Groups="grp.Vertrieb.Graz.r";AccessRights='ReadAndExecute';Inheritance='folder;sub-folders;files'},@{Groups="grp.Vertrieb.Graz.rw";AccessRights='Modify';Inheritance='folder;sub-folders;files'}  
    }
    'E:\share\Vertrieb\Klagenfurt' = @{  
        Protect=$false
        KeepRules = $true
        Rights = @{Groups="grp.Vertrieb.Klagenfurt.r";AccessRights='ReadAndExecute';Inheritance='folder;sub-folders;files'},@{Groups="grp.Vertrieb.Klagenfurt.rw";AccessRights='Modify';Inheritance='folder;sub-folders;files'}  
    }
}


write-host "Creating groups ..." -F Green  
# foreach group
foreach($group in $groups){ 
    # create group if it does not exist
    if(!(Get-LocalGroup -Name $group -EA SilentlyContinue)){
        New-LocalGroup -Name $group
    }
}

write-host "Creating users and assign membership ..." -F Green  
# foreach user
foreach($user in $users.GetEnumerator()){    
    # create user if does not exist
    if (!(Get-LocalUser -Name $user.Key)){
        New-LocalUser -Name $user.Key -Password (ConvertTo-SecureString $user.Value.Password -AsPlainText -Force)
    }
    # Assign user to groups    
    foreach($group in $user.Value.Groups){
        Add-LocalGroupMember -Group $group -Member $user.Key -EA SilentlyContinue
    }
}

write-host "Create folders and assign rights to groups ..." -F Green  
# for each folder
foreach($folder in $folders.GetEnumerator()){
    # create directory
    if(!(Test-Path $folder.Key)){
        write-host "Adding '$($folder.Key)' ..." -F Green  
        New-Item -ItemType Directory -Path $folder.Key -Force | out-null
    }
    write-host "Assigning rights to '$($folder.Key)' ..." -F Green  
    # assign folder rights to groups
    foreach($right in $folder.Value.Rights){
        foreach($group in $right.Groups){
            Set-FileSystemPermission -path $folder.Key -principal $group -AccessRights $right.AccessRights.split(',') -ControlType Allow -disableInheritance $folder.Value.Protect -keepExistingRules $folder.Value.KeepRules -inheritance $right.Inheritance  
        }
    }
}


Ein nächster Schritt wäre das Verlagern der statischen Teile wie Benutzer, Gruppen und Berechtigungen aus dem Skript in CSV-Dateien um diese dann im Skript zu importieren, dann entfällt das zukünftige Anpassen des Skripts wenn man Erweiterungen vornehmen will.
Hier ein Beispiel wie dies aussehen könnte:
(Die CSV-Dateien im Ordner des Skripts ablegen, oder Pfade im Skript anpassen)

back-to-topCSV-Datei principals.csv


"Type";"SamAccountName";"Password";"MemberOf";"Description"  
"Group";"grp.Buchhaltung.rw";"";"";""  
"Group";"grp.Buchhaltung.r";"";"";""  
"Group";"grp.Buchhaltung.2021_22.rw";"";"";""  
"Group";"grp.Buchhaltung.2021_22.r";"";"";""  
"Group";"grp.Buchhaltung.2020_21.rw";"";"";""  
"Group";"grp.Buchhaltung.2020_21.r";"";"";""  
"Group";"grp.Buchhaltung.2019_20.rw";"";"";""  
"Group";"grp.Buchhaltung.2019_20.r";"";"";""  
"Group";"grp.Geschäftsführung.rw";"";"";""  
"Group";"grp.Geschäftsführung.r";"";"";""  
"Group";"grp.Technik.rw";"";"";""  
"Group";"grp.Technik.r";"";"";""  
"Group";"grp.Vertrieb.rw";"";"";""  
"Group";"grp.Vertrieb.r";"";"";""  
"Group";"grp.Vertrieb.Graz.rw";"";"";""  
"Group";"grp.Vertrieb.Graz.r";"";"";""  
"Group";"grp.Vertrieb.Klagenfurt.rw";"";"";""  
"Group";"grp.Vertrieb.Klagenfurt.r";"";"";""  
"Group";"grp.Vertrieb.Wien.rw";"";"";""  
"Group";"grp.Vertrieb.Wien.r";"";"";""  
"User";"BenutzerA";"Passw0rd";"grp.Buchhaltung.2021_22.rw|grp.Buchhaltung.rw|grp.Buchhaltung.2020_21.rw";""  
"User";"BenutzerB";"Passw0rd";"grp.Buchhaltung.r|grp.Vertrieb.rw|grp.Vertrieb.Wien.rw|grp.Vertrieb.Graz.rw|grp.Vertrieb.Klagenfurt.rw|grp.Technik.rw";""  
"User";"BenutzerC";"Passw0rd";"grp.Buchhaltung.2021_22.rw|grp.Buchhaltung.rw|grp.Buchhaltung.2020_21.rw|grp.Buchhaltung.2019_20.rw|grp.Technik.rw";""  
"User";"BenutzerD";"Passw0rd";"grp.Geschäftsführung.rw";""  
"User";"BenutzerE";"Passw0rd";"grp.Buchhaltung.2020_21.r";""  
"User";"BenutzerF";"Passw0rd";"grp.Vertrieb.Graz.rw";""  

back-to-topCSV-Datei acl.csv


"Path";"Protect";"KeepRules";"Principal";"AccessRights";"Inheritance";"AccessControlType"  
"E:\share";"true";"false";"SYSTEM,Administratoren";"FullControl";"folder;sub-folders;files";"Allow"  
"E:\share";"true";"false";"grp.Buchhaltung.rw,grp.Buchhaltung.r,grp.Buchhaltung.2021_22.rw,grp.Buchhaltung.2021_22.r,grp.Buchhaltung.2020_21.rw,grp.Buchhaltung.2020_21.r,grp.Buchhaltung.2019_20.rw,grp.Buchhaltung.2019_20.r,grp.Geschäftsführung.rw,grp.Geschäftsführung.r,grp.Technik.rw,grp.Technik.r,grp.Vertrieb.rw,grp.Vertrieb.r,grp.Vertrieb.Graz.rw,grp.Vertrieb.Graz.r,grp.Vertrieb.Klagenfurt.rw,grp.Vertrieb.Klagenfurt.r,grp.Vertrieb.Wien.rw,grp.Vertrieb.Wien.r";"ListDirectory" ;"folder";"Allow"  
"E:\share\Buchhaltung";"false";"true";"grp.Buchhaltung.r";"ReadAndExecute";"folder;sub-folders;files";"Allow"  
"E:\share\Buchhaltung";"false";"true";"grp.Buchhaltung.rw";"Modify";"folder;sub-folders;files";"Allow"  
"E:\share\Buchhaltung\2021_22";"false";"true";"grp.Buchhaltung.2021_22.r";"ReadAndExecute";"folder;sub-folders;files";"Allow"  
"E:\share\Buchhaltung\2021_22";"false";"true";"grp.Buchhaltung.2021_22.rw";"Modify";"folder;sub-folders;files";"Allow"  
"E:\share\Buchhaltung\2020_21";"false";"true";"grp.Buchhaltung.2020_21.r";"ReadAndExecute";"folder;sub-folders;files";"Allow"  
"E:\share\Buchhaltung\2020_21";"false";"true";"grp.Buchhaltung.2020_21.rw";"Modify";"folder;sub-folders;files";"Allow"  
"E:\share\Buchhaltung\2019_20";"false";"true";"grp.Buchhaltung.2019_20.r";"ReadAndExecute";"folder;sub-folders;files";"Allow"  
"E:\share\Buchhaltung\2019_20";"false";"true";"grp.Buchhaltung.2019_20.rw";"Modify";"folder;sub-folders;files";"Allow"  
"E:\share\Buchhaltung\2019_20";"false";"true";"grp.Buchhaltung.2019_20.r";"ReadAndExecute";"folder;sub-folders;files";"Allow"  
"E:\share\Buchhaltung\2019_20";"false";"true";"grp.Buchhaltung.2019_20.rw";"Modify";"folder;sub-folders;files";"Allow"  
"E:\share\Technik";"false";"true";"grp.Technik.r";"ReadAndExecute";"folder;sub-folders;files";"Allow"  
"E:\share\Technik";"false";"true";"grp.Technik.rw";"Modify";"folder;sub-folders;files";"Allow"  
"E:\share\Geschäftsführung";"false";"true";"grp.Geschäftsführung.r";"ReadAndExecute";"folder;sub-folders;files";"Allow"  
"E:\share\Geschäftsführung";"false";"true";"grp.Geschäftsführung.rw";"Modify";"folder;sub-folders;files";"Allow"  
"E:\share\Vertrieb";"false";"true";"grp.Vertrieb.r";"ReadAndExecute";"folder;sub-folders;files";"Allow"  
"E:\share\Vertrieb";"false";"true";"grp.Vertrieb.rw";"Modify";"folder;sub-folders;files";"Allow"  
"E:\share\Vertrieb\Wien";"false";"true";"grp.Vertrieb.Wien.r";"ReadAndExecute";"folder;sub-folders;files";"Allow"  
"E:\share\Vertrieb\Wien";"false";"true";"grp.Vertrieb.Wien.rw";"Modify";"folder;sub-folders;files";"Allow"  
"E:\share\Vertrieb\Graz";"false";"true";"grp.Vertrieb.Graz.r";"ReadAndExecute";"folder;sub-folders;files";"Allow"  
"E:\share\Vertrieb\Graz";"false";"true";"grp.Vertrieb.Graz.rw";"Modify";"folder;sub-folders;files";"Allow"  
"E:\share\Vertrieb\Klagenfurt";"false";"true";"grp.Vertrieb.Klagenfurt.r";"ReadAndExecute";"folder;sub-folders;files";"Allow"  
"E:\share\Vertrieb\Klagenfurt";"false";"true";"grp.Vertrieb.Klagenfurt.rw";"Modify";"folder;sub-folders;files";"Allow"  

back-to-topSkript für die Nutzung mit den CSV-Dateien und lokalen Usern und Gruppen


$ErrorActionPreference = 'Stop'  
# restart elevated if needed
if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){start powershell -Verb runas -ArgumentList '-File',$MyInvocation.MyCommand.Definition;exit}  

# add privilege tokens
Add-Type '[DllImport("ntdll.dll")] public static extern int RtlAdjustPrivilege(int Privilege, bool Enable, bool CurrentThread, ref bool EnabledOut);' -name token -namespace privilege  
9,17,18 | %{[void][privilege.token]::RtlAdjustPrivilege($_,1,0,[ref]0)}

# function to set filesystem permissions
function Set-FileSystemPermission {
    param(
        [parameter(mandatory=$true)][ValidateScript({Test-Path $_})][string]$path,
        [parameter(mandatory=$true)][string]$principal,
        [parameter(mandatory=$true)][ValidateSet("AppendData","ChangePermissions","CreateDirectories","CreateFiles","Delete","DeleteSubdirectoriesAndFiles","ExecuteFile","FullControl","ListDirectory","Modify","Read","ReadAndExecute","ReadAttributes","ReadData","ReadExtendedAttributes","ReadPermissions","Synchronize","TakeOwnership","Traverse","Write","WriteAttributes","WriteData","WriteExtendedAttributes")][string[]]$AccessRights,  
        [parameter(mandatory=$false)][ValidateSet("Allow","Deny")][string]$ControlType = "Allow",  
        [parameter(mandatory=$false)][ValidateSet( "folder","folder;sub-folders;files","folder;sub-folders","folder;files","sub-folders;files","sub-folders","files")][string]$inheritance = "folder;sub-folders;files",  
        [parameter(mandatory=$false)][bool]$disableInheritance = $false,
        [parameter(mandatory=$false)][bool]$keepExistingRules = $true
    )

    process{
        try{
            # inheritance and propagation Zuordnung
            $inheritance_table = @{
                "folder" = @{I="none";P="none"}  
                "folder;sub-folders;files" = @{I="ContainerInherit,ObjectInherit";P="none"}  
                "folder;sub-folders" = @{I="ContainerInherit";P="none"}  
                "folder;files" = @{I="ObjectInherit";P="none"}  
                "sub-folders;files" = @{I="ContainerInherit,ObjectInherit";P="InheritOnly"}  
                "sub-folders" = @{I="ContainerInherit";P="InheritOnly"}  
                "files" = @{I="ObjectInherit";P="InheritOnly"}  
            }
            # bestehende ACL speichern
            $acl = Get-ACL $path
            # wenn Pfad ein Ordner ist
            if ((get-item $path).PSIsContainer){
                # Vererbung der ACL festlegen
                $acl.SetAccessRuleProtection($disableInheritance,$keepExistingRules)
                # Access Rule erstellen
                $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($principal,$AccessRights,$inheritance_table[$inheritance].I,$inheritance_table[$inheritance].P,$ControlType)
            }else{
                $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($principal,$AccessRights,$ControlType)
            }
            # AccessRule der ACL hinzufügen
            $acl.SetAccessRule($objACE)
            # Schreibe die ACL
            set-acl -Path $path -AclObject $acl
            return $objACE
        }catch{ 
            write-Error $_
        }
    }
}

# import principals
$principals = Import-CSV -LiteralPath "$psscriptroot\principals.csv" -Delimiter ";" -Encoding UTF8  

# import ACLs
$folders = Import-CSV -LiteralPath "$psscriptroot\acl.csv" -Delimiter ";" -Encoding UTF8  

write-host "Creating groups and users ..." -F Green  
# foreach principal
foreach($principal in $principals){ 
    # determine principal type
    switch($principal.Type){
        'Group' {  
            # create group if it does not exist
            if(!(Get-LocalGroup -Name $principal.SamAccountName -EA SilentlyContinue)){
                New-LocalGroup -Name $principal.SamAccountName -Description $principal.Description
            }
        }
        'User'{  
            # create user if does not exist
            if (!(Get-LocalUser -Name $principal.SamAccountName -EA SilentlyContinue)){
                New-LocalUser -Name $principal.SamAccountName -Password (ConvertTo-SecureString $principal.Password -AsPlainText -Force) -Description $principal.Description
            }
        }
        Default {
            write-Error "Principal type '$($principal.Type)' is unknown (supported values are 'Group' and 'User'." -Category InvalidData  
        }
    }
    # Assign principal to groups
    $groups = $principal.MemberOf.split('|')  
    if ($groups -ne ''){  
        foreach($group in $groups){
            Add-LocalGroupMember -Group $group -Member $principal.SamAccountName -EA SilentlyContinue
        }
    }

}

# for each folder
foreach($folder in $folders){
    # create directory
    if(!(Test-Path $folder.Path)){
        write-host "Adding folder '$($folder.Path)' ..." -F Green  
        New-Item -ItemType Directory -Path $folder.Path -Force | out-null
    }
    write-host "Adding ACEs to '$($folder.Path)' ..." -F Green  
    # assign folder rights to principal(s)
    foreach($principal in $folder.Principal.split(',')){  
        Set-FileSystemPermission -path $folder.Path -principal $principal -AccessRights $folder.AccessRights.split(',') -ControlType $folder.AccessControlType -disableInheritance ([bool]::Parse($folder.Protect)) -keepExistingRules ([bool]::Parse($folder.KeepRules)) -inheritance $folder.Inheritance  
    }
}

back-to-topSkript für die Nutzung mit den CSV-Dateien und ActiveDirectory Benutzern und Gruppen


$ErrorActionPreference = 'Stop'  
# restart elevated if needed
if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){start powershell -Verb runas -ArgumentList '-File',$MyInvocation.MyCommand.Definition;exit}  

# add privilege tokens
Add-Type '[DllImport("ntdll.dll")] public static extern int RtlAdjustPrivilege(int Privilege, bool Enable, bool CurrentThread, ref bool EnabledOut);' -name token -namespace privilege  
9,17,18 | %{[void][privilege.token]::RtlAdjustPrivilege($_,1,0,[ref]0)}

# function to set filesystem permissions
function Set-FileSystemPermission {
    param(
        [parameter(mandatory=$true)][ValidateScript({Test-Path $_})][string]$path,
        [parameter(mandatory=$true)][string]$principal,
        [parameter(mandatory=$true)][ValidateSet("AppendData","ChangePermissions","CreateDirectories","CreateFiles","Delete","DeleteSubdirectoriesAndFiles","ExecuteFile","FullControl","ListDirectory","Modify","Read","ReadAndExecute","ReadAttributes","ReadData","ReadExtendedAttributes","ReadPermissions","Synchronize","TakeOwnership","Traverse","Write","WriteAttributes","WriteData","WriteExtendedAttributes")][string[]]$AccessRights,  
        [parameter(mandatory=$false)][ValidateSet("Allow","Deny")][string]$ControlType = "Allow",  
        [parameter(mandatory=$false)][ValidateSet( "folder","folder;sub-folders;files","folder;sub-folders","folder;files","sub-folders;files","sub-folders","files")][string]$inheritance = "folder;sub-folders;files",  
        [parameter(mandatory=$false)][bool]$disableInheritance = $false,
        [parameter(mandatory=$false)][bool]$keepExistingRules = $true
    )

    process{
        try{
            # inheritance and propagation Zuordnung
            $inheritance_table = @{
                "folder" = @{I="none";P="none"}  
                "folder;sub-folders;files" = @{I="ContainerInherit,ObjectInherit";P="none"}  
                "folder;sub-folders" = @{I="ContainerInherit";P="none"}  
                "folder;files" = @{I="ObjectInherit";P="none"}  
                "sub-folders;files" = @{I="ContainerInherit,ObjectInherit";P="InheritOnly"}  
                "sub-folders" = @{I="ContainerInherit";P="InheritOnly"}  
                "files" = @{I="ObjectInherit";P="InheritOnly"}  
            }
            # bestehende ACL speichern
            $acl = Get-ACL $path
            # wenn Pfad ein Ordner ist
            if ((get-item $path).PSIsContainer){
                # Vererbung der ACL festlegen
                $acl.SetAccessRuleProtection($disableInheritance,$keepExistingRules)
                # Access Rule erstellen
                $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($principal,$AccessRights,$inheritance_table[$inheritance].I,$inheritance_table[$inheritance].P,$ControlType)
            }else{
                $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($principal,$AccessRights,$ControlType)
            }
            # AccessRule der ACL hinzufügen
            $acl.SetAccessRule($objACE)
            # Schreibe die ACL
            set-acl -Path $path -AclObject $acl
            return $objACE
        }catch{ 
            write-Error $_
        }
    }
}

# import principals
$principals = Import-CSV -LiteralPath "$psscriptroot\principals.csv" -Delimiter ";" -Encoding UTF8  

# import ACLs
$folders = Import-CSV -LiteralPath "$psscriptroot\acl.csv" -Delimiter ";" -Encoding UTF8  

write-host "Creating groups and users ..." -F Green  
# foreach principal
foreach($principal in $principals){ 
    # determine principal type
    switch($principal.Type){
        'Group' {  
            # create group if it does not exist
            if(!(Get-ADGroup -Filter "SamAccountName -eq '$($principal.SamAccountName)'")){  
                New-ADGroup -Name $principal.SamAccountName -SamAccountName $principal.SamAccountName -GroupCategory Security -GroupScope Global -Description $principal.Description
            }
        }
        'User'{  
            # create user if does not exist
            if (!(Get-ADUser -Filter "SamAccountName -eq '$($principal.SamAccountName)")){  
                New-ADUser -Name $principal.SamAccountName -SamAccountName $principal.SamAccountName -Password (ConvertTo-SecureString $principal.Password -AsPlainText -Force) -Description $principal.Description
            }
        }
        Default {
            write-Error "Principal type '$($principal.Type)' is unknown (supported values are 'Group' and 'User'." -Category InvalidData  
        }
    }
    # Assign principal to groups
    $groups = $principal.MemberOf.split('|')  
    if ($groups -ne ''){  
        foreach($group in $groups){
            Add-ADGroupMember -Identity $group -Members $principal.SamAccountName -EA SilentlyContinue
        }
    }

}

# for each folder
foreach($folder in $folders){
    # create directory
    if(!(Test-Path $folder.Path)){
        write-host "Adding folder '$($folder.Path)' ..." -F Green  
        New-Item -ItemType Directory -Path $folder.Path -Force | out-null
    }
    write-host "Adding ACEs to '$($folder.Path)' ..." -F Green  
    # assign folder rights to principal(s)
    foreach($principal in $folder.Principal.split(',')){  
        Set-FileSystemPermission -path $folder.Path -principal $principal -AccessRights $folder.AccessRights.split(',') -ControlType $folder.AccessControlType -disableInheritance ([bool]::Parse($folder.Protect)) -keepExistingRules ([bool]::Parse($folder.KeepRules)) -inheritance $folder.Inheritance  
    }
}
Das sind natürlich nur beispielhafte Rezepte die man sich auf seine Bedürfnisse zuschneidern kann, aber die Basis sollte dir schon mal weiterhelfen.
Viel Erfolg bei der Anpassung!

Grüße Uwe