From dd0ebd3d6d8b0480b8a35286be9b8ed8b05dcb2a Mon Sep 17 00:00:00 2001 From: Meik Date: Thu, 16 Jul 2026 13:11:40 +0200 Subject: [PATCH] Avoid repeated NTFS engine logger initialization --- LiamNtfs/C4IT.LIAM.Ntfs.cs | 97 +++++++++++++------- LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs | 26 +++++- 2 files changed, 84 insertions(+), 39 deletions(-) diff --git a/LiamNtfs/C4IT.LIAM.Ntfs.cs b/LiamNtfs/C4IT.LIAM.Ntfs.cs index 062a311..dc7888d 100644 --- a/LiamNtfs/C4IT.LIAM.Ntfs.cs +++ b/LiamNtfs/C4IT.LIAM.Ntfs.cs @@ -1335,9 +1335,17 @@ namespace C4IT.LIAM IEnumerable readerSids, IEnumerable writerSids) { + var stopwatch = Stopwatch.StartNew(); + LogEntry( + $"NTFS filesystem engine creation stage. Stage=Start Path='{folderPath}', ParentPath='{parentFolderPath}'", + LogLevels.Debug); + var requiresDomainLocalTag = this.GroupStrategy == eLiamGroupStrategies.Ntfs_AGDLP || (NamingConventions ?? Enumerable.Empty()) .Any(i => i.Scope == eLiamAccessRoleScopes.DomainLocal); + LogEntry( + $"NTFS filesystem engine creation stage finished. Stage=ResolveStrategy Path='{folderPath}', RequiresDomainLocalTag={requiresDomainLocalTag}, Elapsed='{stopwatch.Elapsed}'", + LogLevels.Debug); var mergedCustomTags = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var tag in CustomTags) @@ -1347,49 +1355,70 @@ namespace C4IT.LIAM foreach (var tag in customTags) mergedCustomTags[tag.Key] = tag.Value; } + LogEntry( + $"NTFS filesystem engine creation stage finished. Stage=MergeCustomTags Path='{folderPath}', CustomTags={mergedCustomTags.Count}, Elapsed='{stopwatch.Elapsed}'", + LogLevels.Debug); + + LogEntry( + $"NTFS filesystem engine creation stage. Stage=ConstructEngine Path='{folderPath}'", + LogLevels.Debug); + var engine = new DataArea_FileSystem(); + LogEntry( + $"NTFS filesystem engine creation stage finished. Stage=ConstructEngine Path='{folderPath}', Elapsed='{stopwatch.Elapsed}'", + LogLevels.Debug); + + LogEntry( + $"NTFS filesystem engine creation stage. Stage=AssignEngineProperties Path='{folderPath}'", + LogLevels.Debug); + engine.ConfigID = "manual"; + engine.domainName = this.Domain; + engine.effectiveDomainController = activeDirectoryBase.EffectiveDomainController; + engine.username = this.Credential.Identification; + engine.password = new NetworkCredential("", this.Credential.Secret).SecurePassword; + engine.baseFolder = this.RootPath; + engine.newFolderPath = folderPath; + engine.newFolderParent = parentFolderPath; + engine.groupPrefix = GetRequiredCustomTag("Filesystem_GroupPrefixTag"); + engine.groupOUPath = this.GroupPath; + engine.groupPermissionStrategy = (C4IT_IAM_GET.PermissionGroupStrategy)this.GroupStrategy; + engine.groupCustomTags = mergedCustomTags; + engine.ownerUserSids = ownerSids?.Where(i => !string.IsNullOrWhiteSpace(i)).Distinct(StringComparer.OrdinalIgnoreCase).ToList() ?? new List(); + engine.readerUserSids = readerSids?.Where(i => !string.IsNullOrWhiteSpace(i)).Distinct(StringComparer.OrdinalIgnoreCase).ToList() ?? new List(); + engine.writerUserSids = writerSids?.Where(i => !string.IsNullOrWhiteSpace(i)).Distinct(StringComparer.OrdinalIgnoreCase).ToList() ?? new List(); + engine.groupOwnerTag = GetRequiredCustomTag("Filesystem_GroupOwnerTag"); + engine.groupWriteTag = GetRequiredCustomTag("Filesystem_GroupWriteTag"); + engine.groupReadTag = GetRequiredCustomTag("Filesystem_GroupReadTag"); + engine.groupTraverseTag = GetRequiredCustomTag("Filesystem_GroupTraverseTag"); + engine.groupDLTag = requiresDomainLocalTag ? GetRequiredCustomTag("Filesystem_GroupDomainLocalTag") : string.Empty; + engine.groupGTag = GetRequiredCustomTag("Filesystem_GroupGlobalTag"); + engine.CanManagePermissionsForPath = IsPermissionManagedFolderPath; + engine.CanManageTraversePermissionsForPath = IsTraversePermissionManagedPath; + engine.forceStrictAdGroupNames = IsAdditionalConfigurationEnabled("ForceStrictAdGroupNames"); + engine.groupNameSanitizeReplacement = GetAdditionalConfigurationValueOrDefault( + AdditionalConfigurationGroupNameSanitizeReplacementKey, + Helper.DefaultGroupNameSanitizeReplacement); + engine.preserveAdGroupNameCase = IsAdditionalConfigurationEnabled(AdditionalConfigurationPreserveAdGroupNameCaseKey); + engine.OwnerACLPermission = this.OwnerACLPermission; + engine.WriteACLPermission = this.WriteACLPermission; + engine.ReadACLPermission = this.ReadACLPermission; + LogEntry( + $"NTFS filesystem engine creation stage finished. Stage=AssignEngineProperties Path='{folderPath}', Elapsed='{stopwatch.Elapsed}'", + LogLevels.Debug); - var engine = new DataArea_FileSystem - { - ConfigID = "manual", - domainName = this.Domain, - effectiveDomainController = activeDirectoryBase.EffectiveDomainController, - username = this.Credential.Identification, - password = new NetworkCredential("", this.Credential.Secret).SecurePassword, - baseFolder = this.RootPath, - newFolderPath = folderPath, - newFolderParent = parentFolderPath, - groupPrefix = GetRequiredCustomTag("Filesystem_GroupPrefixTag"), - groupOUPath = this.GroupPath, - groupPermissionStrategy = (C4IT_IAM_GET.PermissionGroupStrategy)this.GroupStrategy, - groupCustomTags = mergedCustomTags, - ownerUserSids = ownerSids?.Where(i => !string.IsNullOrWhiteSpace(i)).Distinct(StringComparer.OrdinalIgnoreCase).ToList() ?? new List(), - readerUserSids = readerSids?.Where(i => !string.IsNullOrWhiteSpace(i)).Distinct(StringComparer.OrdinalIgnoreCase).ToList() ?? new List(), - writerUserSids = writerSids?.Where(i => !string.IsNullOrWhiteSpace(i)).Distinct(StringComparer.OrdinalIgnoreCase).ToList() ?? new List(), - groupOwnerTag = GetRequiredCustomTag("Filesystem_GroupOwnerTag"), - groupWriteTag = GetRequiredCustomTag("Filesystem_GroupWriteTag"), - groupReadTag = GetRequiredCustomTag("Filesystem_GroupReadTag"), - groupTraverseTag = GetRequiredCustomTag("Filesystem_GroupTraverseTag"), - groupDLTag = requiresDomainLocalTag ? GetRequiredCustomTag("Filesystem_GroupDomainLocalTag") : string.Empty, - groupGTag = GetRequiredCustomTag("Filesystem_GroupGlobalTag"), - CanManagePermissionsForPath = IsPermissionManagedFolderPath, - CanManageTraversePermissionsForPath = IsTraversePermissionManagedPath, - forceStrictAdGroupNames = IsAdditionalConfigurationEnabled("ForceStrictAdGroupNames"), - groupNameSanitizeReplacement = GetAdditionalConfigurationValueOrDefault( - AdditionalConfigurationGroupNameSanitizeReplacementKey, - Helper.DefaultGroupNameSanitizeReplacement), - preserveAdGroupNameCase = IsAdditionalConfigurationEnabled(AdditionalConfigurationPreserveAdGroupNameCaseKey), - OwnerACLPermission = this.OwnerACLPermission, - WriteACLPermission = this.WriteACLPermission, - ReadACLPermission = this.ReadACLPermission - }; engine.traverseBoundaryPath = GetEffectiveTraverseBoundaryPath(); LogEntry( $"NTFS filesystem engine ACL permissions: Owner=0x{engine.OwnerACLPermission:X}, Write=0x{engine.WriteACLPermission:X}, Read=0x{engine.ReadACLPermission:X}", LogLevels.Debug); + LogEntry( + $"NTFS filesystem engine creation stage. Stage=BuildSecurityGroupTemplates Path='{folderPath}'", + LogLevels.Debug); foreach (var template in BuildSecurityGroupTemplates()) engine.templates.Add(template); + LogEntry( + $"NTFS filesystem engine creation stage finished. Stage=BuildSecurityGroupTemplates Path='{folderPath}', Templates={engine.templates.Count}, Elapsed='{stopwatch.Elapsed}'", + LogLevels.Debug); return engine; } diff --git a/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs b/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs index 37e3e29..5e76681 100644 --- a/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs +++ b/LiamNtfs/C4IT_IAM_SET/DataArea_FileSystem.cs @@ -17,6 +17,7 @@ using C4IT.Logging; using static C4IT.Logging.cLogManager; using System.Reflection; +using System.Threading; using C4IT_IAM_GET; using C4IT.LIAM; @@ -75,18 +76,33 @@ namespace C4IT_IAM_SET public List templates; public int createTraverseGroupLvl = 0; + private static int engineFileLoggerInitialized; public DataArea_FileSystem() { + EnsureEngineFileLoggerInitialized(); + + if (DefaultLogger != null) + { + DefaultLogger.LogEntry(LogLevels.Info, "================================================="); + DefaultLogger.LogEntry(LogLevels.Info, $"LIAM engine v{Assembly.GetExecutingAssembly().GetName().Version} started"); + } + + templates = new List(); + } + + private static void EnsureEngineFileLoggerInitialized() + { + if (DefaultLogger != null) + return; + + if (Interlocked.Exchange(ref engineFileLoggerInitialized, 1) != 0) + return; + var logDirectory = Environment.ExpandEnvironmentVariables(constApplicationDataPath); Helper.CreatePathWithWriteAccess(logDirectory); var LogPath = Path.Combine(logDirectory, "Logs"); cLogManagerFile.CreateInstance(Path.Combine(LogPath, "LIAM.log")); - - DefaultLogger.LogEntry(LogLevels.Info, "================================================="); - DefaultLogger.LogEntry(LogLevels.Info, $"LIAM engine v{Assembly.GetExecutingAssembly().GetName().Version} started"); - - templates = new List(); } private string GetAdServer()