marika
Goto Top

Berechtigung auf letzten Ordner einrichten

Hallo Zusammen,

ich suche schon eine ganze Weile nach einer Lösung meines Problems und hoffe Ihr könnt mir helfen.

Ich muss auf eine Ordnerstruktur mit vielen Unterordnern schreibende Rechte nur auf den jeweils letzten Ordner einrichten.
Dies möchte ich mittels PowerShell erledigen, aber leider finde ich keinen Ansatz, wie ich den jeweiligen Datenpfad ermitteln kann.

Über Tipps würde ich mich freuen.

Marika

Content-Key: 767357689

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

Printed on: April 26, 2024 at 20:04 o'clock

Member: Tezzla
Tezzla Jun 22, 2021 at 13:55:20 (UTC)
Goto Top
Mahlzeit.

Was heißt für dich "letzter Ordner"? Der tiefste Ordner in der Struktur oder der, der zuletzt angelegt / geändert wurde?

VG
Member: colinardo
colinardo Jun 22, 2021 updated at 14:34:17 (UTC)
Goto Top
Servus Marika, willkommen auf Administrator.de!
Zitat von @Tezzla:
Was heißt für dich "letzter Ordner"? Der tiefste Ordner in der Struktur oder der, der zuletzt angelegt / geändert wurde?
Das frage ich mich ehrlich gesagt auch. Wenn der Ordner sich nicht benommen hat ist er auch der "letzte" Ordner face-smile.
Spaß beiseite, könnte auch noch bedeuten das jeder Ordner der keinen Unterordner mehr hat gemeint ist.

Also liebe Marika, spezifiziere diesen "letzten Ordner" für uns doch bitte exakter face-smile.

Grüße Uwe
Member: Tezzla
Tezzla Jun 22, 2021 at 14:04:54 (UTC)
Goto Top
@colinardo Wir wollen ja hier keine Ordnerdiskrimierung face-smile
Member: colinardo
colinardo Jun 22, 2021 updated at 14:06:32 (UTC)
Goto Top
Zitat von @Tezzla:

@colinardo Wir wollen ja hier keine Ordnerdiskrimierung face-smile
Sei froh das ich jetzt nicht auch noch mit Ordner*innen angefangen habe face-big-smile.
Member: Tezzla
Tezzla Jun 22, 2021 at 14:09:59 (UTC)
Goto Top
@colinardo Kann man PowerShell eigentlich gendern? Wäre es Power*innenShell oder PowerShell*innen? Vielleicht wäre das auch was für Frank die Themenbezeichnungen einmal anzupassen an den aktuellen Zeitgeist.

In der Zeit warten wir auf @Marika
Member: Marika
Marika Jun 22, 2021 at 14:11:30 (UTC)
Goto Top
Hallo Tezzla,

entschuldige, das habe ich nicht gut ausgedrückt.
Ich meine den "tiefsten" Ordner in der Strukturl

Danke
Member: colinardo
colinardo Jun 22, 2021 at 14:12:05 (UTC)
Goto Top
Zitat von @Tezzla:

@colinardo Kann man PowerShell eigentlich gendern?
"Die" Muschel ist schon weiblich, denke das sollte reichen face-smile
Member: colinardo
colinardo Jun 22, 2021 updated at 15:43:03 (UTC)
Goto Top
Zitat von @Marika:
Ich meine den "tiefsten" Ordner in der Strukturl
Na dann (User/Gruppe) und Ordner, Rechte anpassen.
# Ordner
$root = 'D:\Marika'  
# Account
$account = 'DOMAIN\Account'  
# tiefsten Ordner ermitteln
ls $root -Directory -Recurse -Force | sort {$_.Fullname.Length} -Desc | select -F 1 | %{
    # ACL des Ordners ermitteln
    $acl = Get-ACL $_.FullName
    # zusätzliche Zugriffregel erstellen
    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule $account,'Modify','ContainerInherit,ObjectInherit','None','Allow'  
    # Bei Bedarf access rule protection setzen wenn Vererbung unterbrochen werden soll
    $acl.SetAccessRuleProtection($false,$true)
    # regel der ACL hinzufügen
    $acl.SetAccessRule($rule)
    # ACL zurückschreiben
    Set-Acl $_.FullName $acl -verbose
}

Grüße Uwe
Member: Tezzla
Tezzla Jun 22, 2021 at 14:24:12 (UTC)
Goto Top
Für den Fall, dass nicht nur der Allertiefste gemeint ist, sondern pro Hauptordner der tiefste Unterordner, um ein Get-ChildItem mit ForEach drum herum ergänzen.
Member: Marika
Marika Jun 22, 2021 at 14:28:32 (UTC)
Goto Top
Hallo Tezzla,

könntest Du mir vielleicht behilflich sein, wie ich das umsetzen kann?
Leider bin ich in PowerShell noch nicht so bewandert, dass ich ein ForEach umsetzen könnte.

Marika
Member: colinardo
colinardo Jun 22, 2021 updated at 15:42:51 (UTC)
Goto Top
Zitat von @Marika:

Hallo Tezzla,

könntest Du mir vielleicht behilflich sein, wie ich das umsetzen kann?
Leider bin ich in PowerShell noch nicht so bewandert, dass ich ein ForEach umsetzen könnte.
In dem Fall dann bspw.
# Ordner
$root = 'D:\Marika'  
# Account
$account = 'DOMAIN\Account'  
# erste Ebene Ordner durchlaufen
foreach ($base in (ls $root -Directory)){
    # tiefsten Ordner des aktuellen basisordners ermitteln
    ls $base.Fullname -Directory -Recurse -Force | sort {$_.Fullname.Length} -Desc | select -F 1 | %{
        # ACL des Ordners ermitteln
        $acl = Get-ACL $_.FullName
        # zusätzliche Zugriffregel erstellen
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule $account,'Modify','ContainerInherit,ObjectInherit','None','Allow'  
        # bei Bedarf access rule protection setzen wenn Vererbung unterbrochen werden soll, siehe https:{{comment_single_line_double_slash:0}}
        $acl.SetAccessRuleProtection($false,$true)
        # Regel der ACL hinzufügen/ersetzen
        $acl.SetAccessRule($rule)
        # ACL zurückschreiben
        Set-Acl $_.FullName $acl -verbose
    }
}
Member: Marika
Marika Jun 22, 2021 at 14:39:26 (UTC)
Goto Top
Ich werde mir Dein Beispiel ansehen und versuchen face-smile zu verstehen.
Vielen Dank für die nette Unterstützung.
Member: colinardo
colinardo Jun 22, 2021 updated at 14:49:37 (UTC)
Goto Top
Da du ja anscheinend PS-Anfänger bist habe ich dir zum besseren Verständnis noch entsprechende Kommentare zu den Codezeilen hinzugefügt.

Wünsche Dir viel Erfolg!

Grüße Uwe
Mitglied: 148656
148656 Jun 22, 2021 at 14:49:51 (UTC)
Goto Top
Moin Uwe,

hast du nicht etwas vergessen? Laut deiner Aussage machst du das doch immer bei lernwilligen Anfängern.

Gruß
C.C.
Member: colinardo
colinardo Jun 22, 2021 updated at 14:58:22 (UTC)
Goto Top
Zitat von @148656:
hast du nicht etwas vergessen? Laut deiner Aussage machst du das doch immer bei lernwilligen Anfängern.
Nee, der RefLink zur Doku für eine spezielle Funktion und Kommentare sind im Code enthalten face-wink. Oder meinst du meine PS-Linkliste?
Wenn ich die jedes mal posten würde ... dann ist hier Speicher bald voll ... face-wink. Mach ich wohl mal einen Blog-Beitrag mit Verweis.
Member: Marika
Marika Jun 22, 2021 updated at 14:52:19 (UTC)
Goto Top
Hallo Colinardo,

ich habe in Deinem Script nur meinen Account hinzugefügt und dann "laufen" lassen. Den Ordner auf D: gab es schon face-smile
Es gibt zwar keinen Fehler, aber leider werden auch keine Rechte hinzugefügt.

Marika
Member: colinardo
colinardo Jun 22, 2021 updated at 15:11:52 (UTC)
Goto Top
Zitat von @Marika:

Hallo Colinardo,

ich habe in Deinem Script nur meinen Account hinzugefügt und dann "laufen" lassen. Den Ordner auf D: gab es schon face-smile
Es gibt zwar keinen Fehler, aber leider werden auch keine Rechte hinzugefügt.
Wir kennen hier deine Ordnerbechtigungsstruktur ja nicht, der Account den du zum Ausführen verwendest muss natürlich über entsprechende Rechte in dieser Ordnerstruktur verfügen, ansonsten musst du ihm diese ja erst verschaffen, das ist oben nicht enthalten. Das Skript geht davon als Voraussetzung aus.

Bitte beschäftige dich damit erst einmal gründlich, wir liefern ja hier kein Fertig-Back-Rezept für alle Lebenslagen.

Powershell Link-Leitfaden für Anfänger
Mitglied: 148656
148656 Jun 22, 2021 at 15:05:35 (UTC)
Goto Top
face-wink
sry, mir sitzt heut der Schalk im Nacken :-P
Man könnte ja für das übernächste Release eine Signatur wünschen, die man bei bedarf Anheften kann.

Gruß
C.C.
Member: Marika
Marika Jun 22, 2021 at 15:29:49 (UTC)
Goto Top
Die lesenden Rechte sind für die Ordnerstruktur schon vorhanden. Auch das ausführende Konto kann die Rechte hinzufügen.
Manuell die Rechte zu bearbeiten funktioniert.

Ein "fertiges" Skript habe ich wirklich nicht erwartet. Ich versuche mal eine Art LOGGING einzubinden.
Danke für die Anregung und die Infos.
Member: colinardo
colinardo Jun 22, 2021 updated at 15:49:36 (UTC)
Goto Top
Zitat von @Marika:

Die lesenden Rechte sind für die Ordnerstruktur schon vorhanden. Auch das ausführende Konto kann die Rechte hinzufügen.
Manuell die Rechte zu bearbeiten funktioniert.
Obiges Skript modifiziert die vorhandenen Rechte mit SetAccessRule(). Sollte dort also schon ein ACL-Eintrag für den angegebenen Account vorhanden sein wird dieser durch die neue Regel ersetzt und nicht hinzugefügt., ist das Principle noch nicht vorhanden wird dieses hinzugefügt. Willst du trotz vorhandener Berechtigung für den selben Account eine zusätzliche ACL hinzufügen musst du stattdessen die Funktion AddAccessRule() benutzen.
# ...
$acl.AddAccessRule($rule)
# ...
Das Hinzufügen der Berechtigungen funktioniert hier ansonsten im Test problemlos.

screenshot
Member: Marika
Marika Jun 23, 2021 at 08:59:29 (UTC)
Goto Top
Hallo Zusammen,

jetzt habe ich "erkannt" face-smile, warum ich keine Rechteänderung ermitteln konnte.
Es werden nicht alle Ordner bearbeitet und ich hatte mir immer den "falschen" Ordner angesehen.

Wenn ich z.B. folgende Struktur habe, dann wird nur der fett markierte Ordner geändert.

D:\Marika\3.0c\3.0.c.1abc
D:\Marika\3.0c\3.0.c.1abc-ABC
D:\Marika\3.0c\3.0.c.1abc-DASDFADF

Ich brauche aber auch die beiden anderen Ordner im obigen Beispiel. Könnt Ihr mir noch einen Tipp geben, wie ich auch diese Ordner erwischen kann?

Marika
Member: colinardo
Solution colinardo Jun 23, 2021 updated at 09:27:01 (UTC)
Goto Top
Zitat von @Marika:
Wenn ich z.B. folgende Struktur habe, dann wird nur der fett markierte Ordner geändert.

D:\Marika\3.0c\3.0.c.1abc
D:\Marika\3.0c\3.0.c.1abc-ABC
D:\Marika\3.0c\3.0.c.1abc-DASDFADF
Du wolltest ja nur den längsten/tiefsten Ordner face-smile
Ich brauche aber auch die beiden anderen Ordner im obigen Beispiel. Könnt Ihr mir noch einen Tipp geben, wie ich auch diese Ordner erwischen kann?
Und woran machst du diese fest? Meinst du alle Ordner der tiefsten Ebene ? Wenn ja dann nimm mal das
# Ordner
$root = 'D:\Marika'  
# Account
$account = 'DOMAIN\Account'  
# erste Ebene Ordner durchlaufen
foreach ($base in (ls $root -Directory)){
    # alle Ordner der tiefsten Ebene des Basisordners ermitteln
    ls $base.Fullname -Directory -Recurse -Force | group {$_.Parent.FullName} | sort Name -Descending | select -f 1 -Expand Group | %{
        # ACL des Ordners ermitteln
        $acl = Get-ACL $_.FullName
        # zusätzliche Zugriffregel erstellen
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule $account,'Modify','ContainerInherit,ObjectInherit','None','Allow'  
        # bei Bedarf access rule protection setzen wenn Vererbung unterbrochen werden soll, siehe https:{{comment_single_line_double_slash:0}}
        $acl.SetAccessRuleProtection($false,$true)
        # Regel der ACL hinzufügen/ersetzen
        $acl.SetAccessRule($rule)
        # ACL zurückschreiben
        Set-Acl $_.FullName $acl -verbose
    }
}

Du merkst es ist wichtig wie man spezifiziert, für das nächste mal also bitte gleich exakt mit allen Bedingungen spezifizieren damit wir hier x mal anfangen müssen, das ist ja nicht Sinn und Zweck.

Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.

Grüße Uwe