bn2023
Goto Top

Berechtigungen für Verzeichnisse in 3 Ebenen anpassen

Hallo liebe Admin-User,

ich muss auf einem neu erstellten Laufwerk etwa 80 Verzeichnisse und Unterverzeichnisse anlegen.
Diese sollen in 3 Ebenen entstehen.

Alle Verzeichnisse - bis in die 3. Ebene hinein, sind namentlich bereits vorgegeben.
Daher habe ich schon eine entspr. Excel-Liste der Verzeichnisse erstellt.

Bevor ich diese Verzeichnisse nun anlege, würde ich gerne etwas zu den Berechtigungen für die 3. Ebene wissen.

Im ROOT-Verzeichnis soll die Vererbung deaktiviert werden.
Es gibt dort die Gruppen "Administrator" und "GAV".
Dabei soll es "Vollzugriff" für Admin haben und "Lesen, Ausführen, Ordnerinhalt anzeigen, Lesen" für die Gruppe GAV.

In Ebene 1 und 2 soll es genauso sein, wie im ROOT.

In der Ebene 3 liegen die meisten Unterverzeichnisse.
Dort sollen alle MA jedoch die Möglichkeit haben, neue Verzeichnisse anzulegen oder Dateien abzulegen... also mit zusätzlichen "ÄNDERN"-Rechten.

Nun meine Frage:
Wie mache ich es, dass in allen Unterverzeichnissen, die in Ebene 3 liegen, automatisch alle MA zusätzlich diese ÄNDERN-Rechte erhalten, ohne dass ich manuell in jedem einzelnen Verzeichnis über die Eigenschaften die Berechtigungen anpassen muss?

Zur Info:
Sämtliche Verzeichnisse werden im ROOT automatisch durch ein Script erstellt. Deshalb kann ich die Berechtigungen erst nachher anpassen.

ODER:
Wäre es ggf. sogar sinnvoller, im ROOT schon die ÄNDERN-Berechtigungen für die MA zu vergeben, diese weiter nach unten zu vererben und dann die Berechtigungen nur in den Ebenen 1 + 2 entspr. anzupassen... also dort für die MA von "ÄNDERN" auf "Lesen, Ausführen, Ordnerinhalt anzeigen, Lesen" ändern?
Obwohl ich gelesen habe, dass man es besser so nicht machen sollte (schlechter Stil etc.) face-smile

Danke und viele Grüße,
BN

Content-ID: 671065

Url: https://administrator.de/forum/berechtigungen-fuer-verzeichnisse-in-3-ebenen-anpassen-671065.html

Printed on: February 9, 2025 at 07:02 o'clock

mirdochegal
mirdochegal Jan 31, 2025 at 10:42:26 (UTC)
Goto Top
Déjà-vu
151434
151434 Jan 31, 2025 updated at 10:47:26 (UTC)
Goto Top
BN2023
BN2023 Jan 31, 2025 updated at 11:01:57 (UTC)
Goto Top
Hallo und danke.

Das Grundsätzliche ist ja bereits erledigt.
Das Berechtigungskonzept und Vererbungen ist ja bereits geklärt...

Mir ist nur nicht klar, wie ich vermeiden kann, dass ich in allen Verzeichnissen der 3. Ebene die Rechte von "Lesen, Ausführen, Ordnerinhalt anzeigen, Lesen" auf "Ändern" anpassen muss.

Kann ich das über die Vererbung irgendwie regeln?
Das habe ich einfach noch nicht verstanden...

Bitte bedenken: Die Excel-Datei enthält bereits den kompletten Verzeichnisbaum und dieser wird durch das entspr. Script erstellt. Erst dann kann ich die Anpassungen machen. Einzig im ROOT und Ebene 1 + 2 sind schon Vererbung & Berechtigungen angepaßt.

Schöne Grüße,
BN
151434
151434 Jan 31, 2025, updated at Feb 03, 2025 at 10:32:01 (UTC)
Goto Top
Wie oben eigentlich schon alles verlinkt, einfach ne entsprechende Gruppe mit Schreib-Rechten in den ACLs hinzufügen
# Gruppe die Schreibrechte bekommen soll
$gruppe = "Domain\GroupXYZWrite"  
# Root-Ordner der Ordner-Struktur
$ordner = "D:\Root"  
# alle Ordner der dritten Ebene verarbeiten
Get-ChildItem -LiteralPath $ordner -depth 2 -Directory | %{
    # ACLs des Ordners holen
    $acl = Get-ACL -LiteralPath $_.Fullname
    # Neue ACE in der ACL erstellen
    $acl.AddAccessRule([System.Security.AccessControl.FileSystemAccessRule]::new([System.Security.Principal.NTAccount]$gruppe,"Modify","ContainerInherit,ObjectInherit","None","Allow"))  
    # Neue ACL zurück schreiben
    Set-ACL -LiteralPath $_.Fullname -AclObject $acl
}

-TanteEdith- Kommentare hinzugefügt und Tippfehler korrigiert.
em-pie
em-pie Jan 31, 2025 updated at 11:32:51 (UTC)
Goto Top
Moin,

Wie ich in deinem ersten Zhread schon schrieb (Neue Verzeichnisse mit Unterverzeichnissen anlegen und Berechtigungen vergeben) und @151434 dir hier sogar die Funktionen teilweise nochmal verlinkte:

  • Import-CSV()
  • New-Item()
  • Set-ACL()

Etwas Hirnschmalz deinerseits darf gerne eingebracht werden…
BN2023
BN2023 Jan 31, 2025 at 11:44:22 (UTC)
Goto Top
Danke Dir @151434.

@em-pie
Ich hatte diesen Thread eigentlich gelöscht, da ich keine Änderungen mehr durchführen konnte.
Daher hatte ich Eure Antworten dort nicht gelesen...

Grüße,
BN
DivideByZero
DivideByZero Jan 31, 2025 at 20:58:44 (UTC)
Goto Top
Wenn Dein vorgelagertes Skript noch nicht auf Powershell basiert, wäre dies ggf. sinnvoll, umzustellen. Literatur: www.msxfaq.de/powershell/ps_excel.htm
BN2023
BN2023 Feb 03, 2025 at 08:39:01 (UTC)
Goto Top
Hallo nochmal,

sorry, aber ich habe es noch nicht so ganz verstanden (bin halt kein ausgebildeter Admin... muss dennoch eine Lösung finden)...

In die Excel-Datei (.xlsm), die die gesamte Verzeichnisstruktur enthält, habe ich folgenden VBA-Code eingefügt:

Option Explicit

#Const Develop = False

Sub Example_FolderCreate()
  Dim Data, Index, This
  Dim i As Long
  Dim Folder As String

  'Read in all values  
  'Wenn es in Zeile “1“ eine Überschrift gibt, dann hier „A2“ einsetzen!!  
  Data = Range("A2").CurrentRegion.Value  
  'Create a row pointer for each column  
  ReDim Index(1 To UBound(Data, 2))
  'Create an array for the folder items  
  ReDim This(0 To UBound(Data, 2))
  'Main path  
  This(0) = ThisWorkbook.Path
  
  'Initialize  
  For i = 1 To UBound(Data, 2)
    Index(i) = 1
  Next
  
  Do
    'Copy the items into our array  
    For i = 1 To UBound(Data, 2)
      This(i) = Data(Index(i), i)
    Next
    'Create the path  
    Folder = Join(This, "\")  

#If Develop Then
    Debug.Print Folder
#Else
    'Create it on disk  
    If Not FolderCreate(Folder) Then
      MsgBox Folder, vbCritical, "Can not create:"  
      Exit Sub
    End If
#End If

    'Find next item  
    i = UBound(Data, 2)
    Do
      'Last row?  
      If Index(i) = UBound(Data) Then
EndRow:
        'Start this column again from first row  
        Index(i) = 1
        'Go one column left  
        i = i - 1
        'Done?  
        If i < 1 Then Exit Sub
      Else
        'Next row  
        Index(i) = Index(i) + 1
        'Empty?  
        If IsEmpty(Data(Index(i), i)) Then
          'Start over  
          GoTo EndRow
        Else
          'Create this one in the next round  
          Exit Do
        End If
      End If
    Loop
  Loop
End Sub

Function FolderCreate(ByVal Path As String) As Boolean
  'Creates a complete sub directory structure  
  Dim Temp, i As Integer
  On Error GoTo ExitPoint
  If Dir(Path, vbDirectory) = "" Then  
    If Right$(Path, 1) = "\" Then Path = Left$(Path, Len(Path) - 1)  
    If Left$(Path, 2) = "\\" Then  
      i = InStr(3, Path, "\")  
      Temp = Split(Mid$(Path, i + 1), "\")  
      Temp(0) = Left$(Path, i) & Temp(0)
    Else
      Temp = Split(Path, "\")  
    End If
    Path = ""  
    For i = 0 To UBound(Temp)
      Path = Path & Temp(i) & "\"  
      If Dir(Path, vbDirectory) = "" Then MkDir Path  
    Next
  End If
  FolderCreate = True
ExitPoint:
End Function

Function FolderDelete(ByVal Path As String) As Boolean
  'Deletes a complete sub directory structure  
  Dim This As String
  Dim Temp, i As Integer
  On Error GoTo ExitPoint
  If Right$(Path, 1) <> "\" Then Path = Path & "\"  
  This = Path
  Do
    Do
      If Dir(This & "*.*") <> "" Then Kill This & "*.*"  
      Temp = Dir(This, vbDirectory)
      Do While Temp = "." Or Temp = ".."  
        Temp = Dir
      Loop
      If Temp = "" Then  
        Exit Do
      Else
        This = This & Temp & "\"  
      End If
    Loop
    RmDir This
    If This = Path Then
      Exit Do
    Else
      Temp = Split(This, "\")  
      ReDim Preserve Temp(0 To UBound(Temp) - 1)
      Temp(UBound(Temp)) = ""  
      This = Join(Temp, "\")  
    End If
  Loop
  FolderDelete = True
ExitPoint:
End Function

Sub Test()
  Dim Folder As String
  Dim R As Range
  
  Folder = ThisWorkbook.Path
  If Right(Folder, 1) <> "\" Then Folder = Folder & "\"  
'Angeben in welcher Spalte die Verkettung erfolgen soll:  
  For Each R In Range("E2", Range("E" & Rows.Count).End(xlUp))  
    FolderCreate Folder & R
  Next
End Sub

Somit kann ich über 2 Makros die komplette Verzeichnisstuktur erstellen lassen, was in mehreren Tests auch gut funktioniert hat.

Die ersten 3 Ebenen bekommen durch entspr. Vererbung schon die korrekten Berechtigungen (Änderungen nur durch Admin und GF // MA nur Lese und Ausführen Rechte). Diese Rechte werden über die Gruppen "Admin" + "MA" erteilt.

Die 4. Ebene soll grds. auch diese Berechtigungen haben, aber zusätzlich "ÄNDERN"-Rechte für die MA.

Deshalb hatte ich dann ganz oben ja auch geschrieben, dass ich natürlich nicht manuell in allen Verzeichnissen der 4. Ebene nun die MA-Rechte anpassen will.

Das war die Ausgangssituation...

Nun habt Ihr mir viele Antworten und Tipps gegeben.
Aber ich weiß einfach noch nicht, wie ich diese anwenden soll.

Gibt es ggf. sogar eine Möglichkeit, die Gruppenrechte für die Gruppe "MA" über meinen VBA-Code (sh. oben) für die 4. Ebene anzugeben?

Wenn nein... was genau muss ich tun, um das zu erreichen?
Und... bitte so beschreiben, dass ein eher Laie es verstehen kann face-smile

Danke und Grüße,
BN
DivideByZero
DivideByZero Feb 03, 2025 at 08:44:43 (UTC)
Goto Top
Einfach das powershell Skript (s.o.)für Dich anpassen, dass es läuft, und dann nach Deinen Makros aufrufen.
BN2023
BN2023 Feb 03, 2025 updated at 13:03:52 (UTC)
Goto Top
...Du meinst das hier von @151434 ?

Grüße,
BN
BN2023
BN2023 Feb 03, 2025 updated at 13:27:20 (UTC)
Goto Top
Ergebnis:

Ich habe mal eine Testumgebung erstellt mit jeweils mehreren Verzeichissen in 3 Ebenen.
Das PS-Script (von @151434) habe ich aber nun (nach einem vorherigen weiteren Test) so angepaßt, dass ich dort nur 2 Ebenen bei "$ordner" aufgeführt habe (siehe hier):

$gruppe = "domain\GAV"      
$ordner = "M:\ROOT\1 Basisdaten\1 Dokumente\"      
Get-ChildItem -Path $ordner -depth 2 -Directory | %{
    $acl = Get-ACL -Path $_.Fullname
    $acl.AddAccessRule([System.Security.AccessControl.FileSystemAccessRule]::new([System.Security.Principal.NTAccount]$gruppe,"Modify","ContainerInherit,ObjectInherit","InheritOnly","Allow"))      
    Set-ACL -Path $_.Fullname -AclObject $acl
}

Das PS-Script habe ich dann ausgeführt, nachdem meine Test-Ordnerstruktur fertig war.

Dadurch entstand in den "Eigenschaften / Sicherheit / Erweitert" nun ein zusätzlicher Eintrag für die Gruppe "MA".
Bei "Geerbt von" steht dort "Keine"
Bei "Zugriff" steht "Ändern"
Bei "Anwenden auf" steht "nur Unterordner und Dateien".

ABER:
Trotzdem kann ich auf der 3. Ebene kein neues Verzeichnis anlegen als MA.

Vermutung
Könnte es sein, dass der vorherige Eintrag für die Gruppe "MA"... also "Lesen und Ausführen-Rechte" quasi Vorrang hat vor dem neuen Eintrag mit "nur Unterordner und Dateien"?

Was kann ich hier tun?
Im PS-Script müßte also der vorherige Eintrag für die Gruppe "MA" gelöscht werden (???)

Grüße,
BN
BN2023
BN2023 Feb 04, 2025 at 08:26:58 (UTC)
Goto Top
...hat hierzu nochmal jemand von Euch einen Tipp?
Wie kann ich den PS-Code so ergänzen, dass der ursprüngliche Eintrag für die Gruppe "MA" entfernt wird.
Das ist offenbar nötig, da wohl dieser Eintrag vorgeht vor dem Gruppeneintrag, der mit dem PS-Script erstellt wird.

Grüße,
BN
151434
151434 Feb 04, 2025 at 08:57:48 (UTC)
Goto Top
Zitat von @BN2023:

...hat hierzu nochmal jemand von Euch einen Tipp?
Wie kann ich den PS-Code so ergänzen, dass der ursprüngliche Eintrag für die Gruppe "MA" entfernt wird.
Das ist offenbar nötig, da wohl dieser Eintrag vorgeht vor dem Gruppeneintrag, der mit dem PS-Script erstellt wird.

Blödsinn, du hast das Schema der ACLs leider nicht verstanden und du hast die Änderung die ich oben hinzugefügt hatte nicht mit übernommen.
Nicht denken sondern nachdenken und vor allem die Schritte VERSTEHEN UND AUCH SELBST NACHSCHLAGEN lautet die Devise, Copy n Paste bringt dich eben nicht weiter!

Me out.
BN2023
BN2023 Feb 04, 2025 at 09:21:48 (UTC)
Goto Top
Lieber @151434

zunächst einmal danke für Deine Antwort...

Aber Deine Ausdrucksart mir gegenüber geht garnicht!!
Ich bin nicht Dein Angestellter oder sonstwas. Bitte gewöhne Dir einen anderen Schreibstil an. Danke.

Zum Thema:
Du hast die Änderungen ja erst vorgenommen, nachdem ich meinen Test durchgeführt habe.
Gestern sah Dein PS-Script noch anders aus. Also wirf mir bitte nicht vor, dass ich "Deine Änderungen nicht übernommen" habe.

Ich werde das neue PS-Script morgen einmal testen.

Grüße,
BN
151434
151434 Feb 04, 2025 updated at 09:59:55 (UTC)
Goto Top
Du hast die Änderungen ja erst vorgenommen, nachdem ich meinen Test durchgeführt habe
Meine Änderung gestern =>
aktualisiert am 03.02.2025 um 11:32:01 Uhr

Dein Post
03.02.2025 aktualisiert um 14:27:20 Uhr

Ergo nach 11:32 nichts mehr geändert worden.

Wohl irgend nen Cache dazwischen gefunkt, haben wir keinen Einfluss drauf.

Bitte gewöhne Dir einen anderen Schreibstil an
Du bist nicht mein Deutschlehrer, also nein, ich schreibe so wie ich es für angebracht halte.

Ich werde das neue PS-Script morgen einmal testen.
Verstehen der Befehle und deren Auswirkungen wäre ja auch nicht verkehrt. Dann macht man sich auch nicht so abhängig von Foren für seine Arbeit.
BN2023
BN2023 Feb 04, 2025 at 11:45:22 (UTC)
Goto Top
...ich möchte das nicht weiter kommentieren.

Aber danke für Deine Hilfe.

Grüße,
BN
BN2023
BN2023 Feb 06, 2025 updated at 08:25:41 (UTC)
Goto Top
Ich habe nochmal eine Frage zu diesem Thema.

Hier seht Ihr ja den von mir in einer Excel-Datei verwendeten VBA-Code: Berechtigungen für Verzeichnisse in 3 Ebenen anpassen

Wie kann ich erreichen, dass die von mir mit diesem Code in Verbindung mit den Einträgen in der Excel-Liste erstellten Verzeichnisse automatisch folgendes erhalten:

ROOT >> Vererbung deaktiviert
Ebene 1 >> Vererbung aktiviert
Ebene 2 >> Vererbung aktiviert
Ebene 3 >> Vererbung deaktiviert

Oder läßt sich auch das zusätzlich über das PS-Script lösen, welches @151434 hier eingestellt hat: [Berechtigungen für Verzeichnisse in 3 Ebenen anpassen] ?

Soweit ich informiert bin, geht das aktivieren ja auch so über die Kommandozeile:
icacls.exe "M:\ROOT\1 Basisdaten\1 Dokumente\" /inheritance:e /t  

- für deaktivieren wäre dann "d" oder "r" richtig, statt "e".

Aber wie wende ich das an? Vielleicht eher im PS-Script?

Grüße,
BN
BN2023
BN2023 Feb 06, 2025 updated at 13:00:26 (UTC)
Goto Top
U P D A T E:

Ich habe jetzt eine Lösung gefunden, die vielleicht recht kompliziert ist, aber die funktioniert face-smile
Damit will ich - nach der Erstellung der kompetten Verzeichnisstruktur per VBA-Code aus der Excel-Liste - die Vererbung aller Verzeichnisse der Ebene 3 deaktivieren.

Ich möchte sie Euch mal kurz vorstellen:

Zunächst habe ich in meiner Excel-Tabelle, die ja die komplette Verzeichnisstruktur bereits enthält, ein zusätzliches Tabellenblatt eingefügt. In diesem habe ich die 3 Spalten verknüpft, in denen die 3 Ebenen aufgelistet sind.

Die Spalte, die die 3. Ebene der Verzeichnisstruktur enthält, habe ich dann gefiltert, da im orig. Tabellenblatt nicht in jeder Zelle ein Eintrag steht. Beim Filtern habe ich dann einfach den Haken bei "0" entfernt und habe dann nur noch alle Zellen, die auch einen Inhalt haben.

Dann habe ich ganz vorne eine Spalte eingefügt, die nur den Beginn des Codes enthält "icacls.exe "M:\ROOT\"
Und am Ende habe ich eine Spalte eingefügt, die das Ende des Codes enthält "\" /inheritance:d"

Dann habe ich über die VERKETTEN-Funktion von Excel alle 5 Spalten verknüpft, inkl. der "\"-Zeichen.
Das Ergebnis erscheint dann in der 6. Spalte und dort sehe ich dann quasi die kompletten Formeln, um die Vererbung aller Verzeichnisse der 3. Ebene in einem Rutsch deaktivieren zu können.

Hier mal ein Beispiel:
icacls.exe "M:\ROOT\1 Basisdaten\1 Dokumente\Vereinbarungen\" /inheritance:d  

Alle Einträge aus dieser verketteten Spalte habe ich nun in eine Batchdatei kopiert, die ich dann per Doppelklick ausführen kann, um die Vererbung aller Verzeichnisse der 3. Ebene zu deaktivieren.

Tja... ich denke, das sollte so funktionieren.
Vielleicht gibt´s ja eine einfachere Lösung für das Problem, aber ich wollte es halt mal versuchen face-wink

Was denkt Ihr?

Grüße,
BN