From af5f0784b8b693c9588646930762ad8ffa3a6fbc Mon Sep 17 00:00:00 2001 From: Meik Date: Fri, 10 Jul 2026 09:02:32 +0200 Subject: [PATCH] Create NTFS traverse groups lazily --- LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs | 23 ++++++++++++++++++++ README.md | 4 +++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs b/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs index 9e62587..5822d36 100644 --- a/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs +++ b/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs @@ -656,6 +656,29 @@ namespace C4IT_IAM_SET continue; } + if (PathsEqual(parent.FullName, sourcePath) && string.IsNullOrWhiteSpace(traverseGroupName)) + { + DefaultLogger.LogEntry(LogLevels.Debug, $"Skip own Traverse-Gruppe fuer '{parent.FullName}' because no child permission or traverse group needs it."); + if (IsTraverseBoundaryPath(parent.FullName)) + break; + + parent = parent.Parent; + if (parent != null) + { + currentTraverseLevel = hasTraverseBoundary + ? currentTraverseLevel + 1 + : DataArea.GetRelativePath(parent.FullName, baseFolder).Count(n => n == Path.DirectorySeparatorChar); + if (!hasTraverseBoundary) + defaultTraverseLoopIndex--; + DefaultLogger.LogEntry(LogLevels.Debug, $"Neue Ebene (lvl) nach Lazy-Skip: {currentTraverseLevel}"); + } + else + { + DefaultLogger.LogEntry(LogLevels.Debug, "Parent nach Lazy-Skip ist null."); + } + continue; + } + DefaultLogger.LogEntry(LogLevels.Debug, $"Hole ACL für Ordner: {parent.FullName}"); AuthorizationRuleCollection ACLs = null; try diff --git a/README.md b/README.md index af2692e..3e5b049 100644 --- a/README.md +++ b/README.md @@ -252,6 +252,8 @@ Traverse-only sucht die erwarteten LIAM-Owner/Write/Read-Gruppen anhand der Nami Fuer AGP werden die Global-Gruppen auf der ACL und als Traverse-Mitglieder verwendet. Fuer AGDLP liegen weiterhin die DomainLocal-Gruppen auf der NTFS-ACL; die Traverse-Mitgliedschaft verwendet die zugehoerigen Global-Gruppen. +Traverse-Gruppen werden lazy erzeugt: LIAM legt eine Traverse-Gruppe fuer einen Pfad nur dann an, wenn darunter mindestens eine LIAM-Owner/Write/Read-Gruppe oder eine darunterliegende Traverse-Gruppe aufgenommen werden soll. Bestehende Traverse-Gruppen werden weiterverwendet, leere neue Traverse-Gruppen ohne aktuelle Mitglieder werden aber nicht vorsorglich erzeugt. + #### Traverse-Grenze `NtfsTraverseBoundaryPath` begrenzt, bis zu welcher Ebene Traverse-Gruppen und Traverse-ACLs sichergestellt werden. Ohne Boundary orientiert sich die Traverse-Verarbeitung an den normal verwalteten Permission-Pfaden. Mit Boundary darf die Traverse-Verarbeitung auch Pfade oberhalb des Include-Filters erreichen, solange der Pfad existiert und nicht durch `NtfsExcludePaths` ausgeschlossen ist. @@ -265,7 +267,7 @@ NtfsTraverseBoundaryPath=\\intra.brkr.corp\File_Shares\BRE.01.LEW\Projekte EnsureNtfsTraverseGroups=1 ``` -In diesem Beispiel koennen Traverse-Gruppen fuer `...\Projekte` selbst und fuer die Ordner darunter sichergestellt werden. Der Boundary-Pfad selbst ist gueltig; er muss nicht zusaetzlich als `NtfsIncludePaths`-Match enthalten sein, solange es nur um Traverse geht. +In diesem Beispiel koennen Traverse-Gruppen fuer `...\Projekte` selbst und fuer die Ordner darunter sichergestellt werden, sobald darunter Berechtigungsgruppen oder weitere Traverse-Gruppen aufzunehmen sind. Der Boundary-Pfad selbst ist gueltig; er muss nicht zusaetzlich als `NtfsIncludePaths`-Match enthalten sein, solange es nur um Traverse geht. #### Levelbereiche fuer Ensure und Ordneranlage