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:
Vielen Dank im Vorraus!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 62914594929
Url: https://administrator.de/contentid/62914594929
Ausgedruckt am: 18.11.2024 um 23:11 Uhr
4 Kommentare
Neuester Kommentar
Moin,
so, wie ich das sehe, schreibst Du Deine erzeugten AccessRule-Instanzen
nicht in das ACL-Objekt zurück, ehe Du dieses per setzt.
Dazwischen gehört imho noch ein damit's klappt. Hab's nicht getestet...
Viel Erfolg!
so, wie ich das sehe, schreibst Du Deine erzeugten AccessRule-Instanzen
$Permission = New-Object System.Security.AccessControl.FileSystemAccessRule($group, "Read", "Allow")
Set-Acl -Path $folderPath -AclObject $Acl
Dazwischen gehört imho noch ein
$Acl.AddAccessRule($Permission)
Viel Erfolg!
Servus @Mybestdog, willkommen auf Administrator.de!
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.
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)
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
Chat GPT hat bisschen was am Code geändert....
Neiiiin 😱. Eine Sprache von Grund auf Lernen ist nach wie vor nachhaltiger , 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)
CSV-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";""
CSV-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"
Skript 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
}
}
Skript 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
}
}
Viel Erfolg bei der Anpassung!
Grüße Uwe