oscarpapa
Goto Top

PowerShell script Benutzerberechtigungen anpassen

Hallo Admin Gemeinde,

hat jemand ein funktionierendes ps-script für folgende Ordnerberechtigungen anzupassen

Hauptordner : homedrive

unterhalb des Hauptordners die Homedrives der Nutzer

mmustermann
emustermann
mmueller
jdoe


usw.

aufgrund der unterschiedlich zugewiesenen Berechtigungen auf den jeweiligen Homedrive Ordnern sollen diese nun einheitlich angepasst werden.

Die Berechtigungen jedes Ordners sollen folgende Berechtigungen enthalten :

SYSTEM - Vollzugriff
Domänen-Admins - Vollzugriff
Nutzer - Ausführen-Lesen (wobei der Nutzername gleich Ordnername ist)

wer kann mir da helfen.
Habe so ein ps script schonmal irgendwo gesehen, aber ich finde nix mehr sinnvolles.

Vielen Dank.

oscar papa

Content-ID: 1796878767

Url: https://administrator.de/forum/powershell-script-benutzerberechtigungen-anpassen-1796878767.html

Ausgedruckt am: 22.12.2024 um 15:12 Uhr

Doskias
Doskias 01.02.2022 aktualisiert um 14:30:35 Uhr
Goto Top
Moin,

ich hab da selbst mal was ergoogelt und nutze es seither:

$dir="Dein Pfad"  
$Benutzer="Benutzr oder Gruppe z.b Domänen-Benutzer"  
$ACL=get-acl $dir
    # Rechte Festlegen
$Rights = [System.Security.AccessControl.FileSystemRights] "Modify, Synchronize"  
$Access=[System.Security.AccessControl.AccessControlType]::Allow
$Inherit=[System.Security.AccessControl.InheritanceFlags]::ContainerInherit `
-bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
$Prop=[System.Security.AccessControl.PropagationFlags]::NoPropagateInherit
#$Prop=[System.Security.AccessControl.PropagationFlags]::InheritOnly
$AccessRule = new-object System.Security.AccessControl.FileSystemAccessRule `
($BENUTZER,$Rights,$Inherit,$Prop,$Access)

    #Rechte Setzen
$ACL.AddAccessRule($AccessRule)
set-acl -AclObject $ACL -Path $DIR

Was welche Variable regelt und welche Optionen du benötigst, musst du selbst mal schauen ;)

Gruß
Doskias
TK1987
TK1987 01.02.2022 um 15:16:39 Uhr
Goto Top
Moin,

# Hauptordner
$Root = "C:\Pfad\zum\Hauptordner"  

$New_ACLs = @(
 [System.Security.AccessControl.FileSystemAccessRule]::new("$ENV:USERDOMAIN\Domänen-Admins",   'FullControl', "ContainerInherit, ObjectInherit", "none", "Allow")  
 [System.Security.AccessControl.FileSystemAccessRule]::new("NT AUTHORITY\System",              'FullControl', "ContainerInherit, ObjectInherit", "none", "Allow")  
 [System.Security.AccessControl.FileSystemAccessRule]::new("$ENV:USERDOMAIN\Domänen-Benutzer", 'Read',        "ContainerInherit, ObjectInherit", "none", "Allow")  
)

# ACL des Hauptordners lesen
$ACL = Get-ACL $Root

# Vererbung deaktivieren
$ACL.SetAccessRuleProtection($true,$False)

# Besitzer auf Domänen-Admins setzen
$ACL.SetOwner( $New_ACLs.IdentityReference )

# Neue ACLs hinzufügen
$New_ACLs | %{ $ACL.SetAccessRule($_) }

# ACL Setzen
Set-ACL $Root $ACL

Gruß Thomas
oscarpapa
oscarpapa 02.02.2022 um 13:40:08 Uhr
Goto Top
Vielen Dank. face-smile
Excellent.
oscarpapa
oscarpapa 02.02.2022 um 13:51:40 Uhr
Goto Top
Hmm...aber wie baue ich das so um, das er mich das für alle Ordner unterhalb von "Homedrive" setzt.

Zusätzlich müsste mir das Skript ja noch den Namen des jeweiligen Ordners auslesen, z.B.: mmustermann und diesen dann mit dem

System.Security.AccessControl.FileSystemAccessRule]::new("$ENV:USERDOMAIN\mmustermann", 'Read', "ContainerInherit, ObjectInherit", "none", "Allow")

setzen.
Wie baue ich das denn noch mit ein? face-smile
Doskias
Doskias 02.02.2022 um 14:41:18 Uhr
Goto Top
Moin,

wie wäre es mit einer Kombination aus get-childitem für die Ordner und anschließend eine Rechtervergabe in einer Foreach -Schleife?

Gruß
Doskias
TK1987
Lösung TK1987 02.02.2022 um 15:13:59 Uhr
Goto Top
# Hauptordner
$Root = "C:\Pfad\zum\Hauptordner"  

# Schleife für Unterordner
Foreach ($dir in Get-ChildItem -Directory $Root) {
  
  $New_ACLs = @(
    [System.Security.AccessControl.FileSystemAccessRule]::new("$ENV:USERDOMAIN\Domänen-Admins",   'FullControl', "ContainerInherit, ObjectInherit", "none", "Allow")  
    [System.Security.AccessControl.FileSystemAccessRule]::new("NT AUTHORITY\System",              'FullControl', "ContainerInherit, ObjectInherit", "none", "Allow")  
    [System.Security.AccessControl.FileSystemAccessRule]::new("$ENV:USERDOMAIN\$($dir.Name)",     'Read',        "ContainerInherit, ObjectInherit", "none", "Allow")  
  )
  
  # ACL des Unterordners lesen
  $ACL = Get-ACL $dir.Fullname
  
  # Vererbung deaktivieren
  $ACL.SetAccessRuleProtection($true,$false)
  
  # Besitzer auf Domänen-Admins setzen
  $ACL.SetOwner( $New_ACLs.IdentityReference )
  
  # Neue ACLs hinzufügen
  $New_ACLs | %{ $ACL.SetAccessRule($_) }
  
  # ACL Setzen
  Set-ACL $dir.Fullname $ACL
 
} # Ende der Schleife
oscarpapa
oscarpapa 03.02.2022 aktualisiert um 11:58:09 Uhr
Goto Top
Da ich von ps wirklich kein Plan habe, wo liegt nun das Problem?
Zeile 23 ist "$New_ACLs | %{ $ACL.SetAccessRule($_) }" und Zeichen 18 wäre das "C" von ACL. face-sad

# Hauptordner
$Root = "D:\homedrive" #pfad zum hauptordner  

# Schleife für Unterordner
Foreach ($dir in Get-ChildItem -Directory $Root) {
  
  $New_ACLs = @(
    [System.Security.AccessControl.FileSystemAccessRule]::new("$ENV:USERDOMAIN\Domänen-Admins",   'FullControl', "ContainerInherit, ObjectInherit", "none", "Allow")  
    [System.Security.AccessControl.FileSystemAccessRule]::new("NT AUTHORITY\System",              'FullControl', "ContainerInherit, ObjectInherit", "none", "Allow")  
    [System.Security.AccessControl.FileSystemAccessRule]::new("$ENV:USERDOMAIN\$($dir.Name)",     'Read',        "ContainerInherit, ObjectInherit", "none", "Allow")  
  )
  
  # ACL des Unterordners lesen
  $ACL = Get-ACL $dir.Fullname
  
  # Vererbung deaktivieren
  $ACL.SetAccessRuleProtection($true,$false)
  
  # Besitzer auf Domänen-Admins setzen
  $ACL.SetOwner( $New_ACLs.IdentityReference )
  
  # Neue ACLs hinzufügen
  $New_ACLs | %{ $ACL.SetAccessRule($_) }
  
  # ACL Setzen
  Set-ACL $dir.Fullname $ACL
 
} # Ende der Schleife

Ausnahme beim Aufrufen von "SetAccessRule" mit 1 Argument(en):  "Manche oder alle Identitätsverweise konnten nicht übersetzt werden."  
In Zeile:23 Zeichen:18
+   $New_ACLs | %{ $ACL.SetAccessRule($_) }
+                  ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) , MethodInvocationException
    + FullyQualifiedErrorId : IdentityNotMappedException
 
Ausnahme beim Aufrufen von "SetAccessRule" mit 1 Argument(en):  "Manche oder alle Identitätsverweise konnten nicht übersetzt werden."  
In Zeile:23 Zeichen:18
+   $New_ACLs | %{ $ACL.SetAccessRule($_) }
+                  ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) , MethodInvocationException
    + FullyQualifiedErrorId : IdentityNotMappedException
TK1987
TK1987 05.02.2022 aktualisiert um 12:43:58 Uhr
Goto Top
Zitat von @oscarpapa:
"Manche oder alle Identitätsverweise konnten nicht übersetzt werden."  
Der Fehler tritt auf, wenn es ein Benutzerkonto nicht gibt. Möglicherweise habt ihr einen Ordner, zu dem kein Benutzer existiert?
Ändere Zeile 23 mal ab auf
  $New_ACLs | %{
    try { $ACL.SetAccessRule($_) }
    catch { Write-Warning "Rechte für '$($_.IdentityReference.Value)' konnte nicht hinzugefügt werden, bitte überprüfen Sie, ob der User existiert" }  
  }

Das sollte aufschluss darüber geben, bei welchem User die Probleme auftreten.
oscarpapa
oscarpapa 07.02.2022 um 07:23:14 Uhr
Goto Top
Guten Morgen,

funktioniert nicht so hundert Prozent...er gibt den User nicht aus, der nicht existiert.

WARNUNG: Rechte für '' konnte nicht hinzugefügt werden, bitte überprüfen Sie, ob der User existiert  
WARNUNG: Rechte für '' konnte nicht hinzugefügt werden, bitte überprüfen Sie, ob der User existiert  

Guten Start in die neue Woche.
TK1987
TK1987 07.02.2022 um 07:49:57 Uhr
Goto Top
Moin,

stimmt, da war ein Denkfehler drin, sorry. So müsste es gehen:
  Foreach ($Identity in $New_ACLs) {
    try { $ACL.SetAccessRule($Identity) }
    catch { Write-Warning "Rechte für '$($Identity.IdentityReference.Value)' konnte nicht hinzugefügt werden, bitte überprüfen Sie, ob der User existiert" }  
  }

Zitat von @oscarpapa:
Guten Start in die neue Woche.
Ebenso, danke.

Gruß Thomas
oscarpapa
oscarpapa 07.02.2022 um 08:00:48 Uhr
Goto Top
Vielen Dank.

Hast du evtl. auch noch den Code für das Löschen eines Nutzers aus der ACL für mich?
Also wenn ich wie in dem ersten Code einen Nutzer der ACL hinzufüge.....
wie kann ich einen anderen Nutzer mit Nutzernamen "12345678" aus allen ACLs unterhalb des
# Hauptordner
$Root = "D:\homedrive" #pfad zum hauptordner  
rauslöschen ?

face-smile
TK1987
TK1987 07.02.2022 um 08:41:06 Uhr
Goto Top
# Hauptordner
$Root = "D:\Test\"  

# Zu löschender User
$User = "12345678"  

# Schleife für Unterordner
Foreach ($dir in Get-ChildItem -Directory $Root) {
  
  try {

    # ACL des Unterordners lesen
    $ACL = Get-ACL $dir.Fullname -ErrorAction Stop
  
    # Alle Rechte des Benutzers entfernen
    $ACL.Access | ? IdentityReference -Match ([regex]::Escape($User)) | %{[void]$ACL.RemoveAccessRule($_); $Changed = 1}

    # Falls Rechte verändert wurden, neu setzen
    if ($Changed) {
        Set-ACL $dir.Fullname $ACL
        Write-Host "Rechte für Benutzer '$User' wurde aus '$($dir.Name)' entfernt. "  
    }

  } catch { Write-Host -ForegroundColor "Red" $_.Exception.Message }  
 
  # Änderungsstatus zurücksetzen
  $Changed = 0
 
} # Ende der Schleife