Use configured NTFS ACL permissions

This commit is contained in:
Meik
2026-07-10 11:23:52 +02:00
parent f9133b3549
commit 5dfccca237
4 changed files with 50 additions and 3 deletions

View File

@@ -80,6 +80,9 @@ namespace C4IT.LIAM
public string ReadGroupGlobal { get; set; } = ""; public string ReadGroupGlobal { get; set; } = "";
public string ReadGroupLocal { get; set; } = ""; public string ReadGroupLocal { get; set; } = "";
public string TraverseGroup { get; set; } = ""; public string TraverseGroup { get; set; } = "";
public int ReadACLPermission { get; set; } = 0x200A9;
public int WriteACLPermission { get; set; } = 0x301BF;
public int OwnerACLPermission { get; set; } = 0x1F01FF;
public List<cLiamNamingConvention> NamingConventions { get; set; } = new List<cLiamNamingConvention>(); public List<cLiamNamingConvention> NamingConventions { get; set; } = new List<cLiamNamingConvention>();
public Dictionary<string, string> CustomTags { get; set; } = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); public Dictionary<string, string> CustomTags { get; set; } = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
@@ -98,6 +101,9 @@ namespace C4IT.LIAM
To.GroupFilter = From.GroupFilter; To.GroupFilter = From.GroupFilter;
To.GroupRegEx = From.GroupRegEx; To.GroupRegEx = From.GroupRegEx;
To.GroupPath = From.GroupPath; To.GroupPath = From.GroupPath;
To.ReadACLPermission = From.ReadACLPermission;
To.WriteACLPermission = From.WriteACLPermission;
To.OwnerACLPermission = From.OwnerACLPermission;
To.CustomTags = From.CustomTags; To.CustomTags = From.CustomTags;
To.AdditionalConfiguration = From.AdditionalConfiguration; To.AdditionalConfiguration = From.AdditionalConfiguration;
To.CustomTags = From.CustomTags; To.CustomTags = From.CustomTags;

View File

@@ -1349,10 +1349,17 @@ namespace C4IT.LIAM
groupNameSanitizeReplacement = GetAdditionalConfigurationValueOrDefault( groupNameSanitizeReplacement = GetAdditionalConfigurationValueOrDefault(
AdditionalConfigurationGroupNameSanitizeReplacementKey, AdditionalConfigurationGroupNameSanitizeReplacementKey,
Helper.DefaultGroupNameSanitizeReplacement), Helper.DefaultGroupNameSanitizeReplacement),
preserveAdGroupNameCase = IsAdditionalConfigurationEnabled(AdditionalConfigurationPreserveAdGroupNameCaseKey) preserveAdGroupNameCase = IsAdditionalConfigurationEnabled(AdditionalConfigurationPreserveAdGroupNameCaseKey),
OwnerACLPermission = this.OwnerACLPermission,
WriteACLPermission = this.WriteACLPermission,
ReadACLPermission = this.ReadACLPermission
}; };
engine.traverseBoundaryPath = GetEffectiveTraverseBoundaryPath(); 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);
foreach (var template in BuildSecurityGroupTemplates()) foreach (var template in BuildSecurityGroupTemplates())
engine.templates.Add(template); engine.templates.Add(template);

View File

@@ -68,7 +68,10 @@ namespace C4IT.LIAM.Activities
var dataMain = dataProvider.GetDataList(constFragmentNameConfigProviderMain, var dataMain = dataProvider.GetDataList(constFragmentNameConfigProviderMain,
"ID, [Expression-ObjectId] as EOID, GCCDomain, GCCTarget, GCCMaxDepth, " + "ID, [Expression-ObjectId] as EOID, GCCDomain, GCCTarget, GCCMaxDepth, " +
"GCCgroupLDAPFilter, GCCgroupOUPath, GCCPermissionGroupStrategy, GCCtargetType", "GCCgroupLDAPFilter, GCCgroupOUPath, GCCPermissionGroupStrategy, GCCtargetType, " +
"OwnerACLPermission.C4IT_EnumValueInt as OwnerACLPermission, " +
"WriteACLPermission.C4IT_EnumValueInt as WriteACLPermission, " +
"ReadACLPermission.C4IT_EnumValueInt as ReadACLPermission",
$"[Expression-ObjectId] = '{configEOID}'"); $"[Expression-ObjectId] = '{configEOID}'");
Guid ConfigClassId = (Guid)dataMain.First()["ID"]; Guid ConfigClassId = (Guid)dataMain.First()["ID"];

View File

@@ -300,7 +300,10 @@ namespace LiamWorkflowActivities
GroupFilter = cLIAMHelper.getStringFromObject(dataMain["GCCgroupLDAPFilter"]), GroupFilter = cLIAMHelper.getStringFromObject(dataMain["GCCgroupLDAPFilter"]),
GroupPath = cLIAMHelper.getStringFromObject(dataMain["GCCgroupOUPath"]), GroupPath = cLIAMHelper.getStringFromObject(dataMain["GCCgroupOUPath"]),
GroupStrategy = (eLiamGroupStrategies)cLIAMHelper.getIntFromObject(dataMain["GCCPermissionGroupStrategy"]), GroupStrategy = (eLiamGroupStrategies)cLIAMHelper.getIntFromObject(dataMain["GCCPermissionGroupStrategy"]),
ProviderType = (eLiamProviderTypes)cLIAMHelper.getIntFromObject(dataMain["GCCtargetType"]) ProviderType = (eLiamProviderTypes)cLIAMHelper.getIntFromObject(dataMain["GCCtargetType"]),
OwnerACLPermission = GetAclPermissionFromDataRow(dataMain, "OwnerACLPermission", 0x1F01FF),
WriteACLPermission = GetAclPermissionFromDataRow(dataMain, "WriteACLPermission", 0x301BF),
ReadACLPermission = GetAclPermissionFromDataRow(dataMain, "ReadACLPermission", 0x200A9)
}; };
if (dataAdditional != null) if (dataAdditional != null)
{ {
@@ -421,6 +424,34 @@ namespace LiamWorkflowActivities
} }
private int GetAclPermissionFromDataRow(DataRow row, string columnName, int defaultValue)
{
if (row == null || string.IsNullOrWhiteSpace(columnName) || !row.Table.Columns.Contains(columnName))
return defaultValue;
var rawValue = cLIAMHelper.getStringFromObject(row[columnName]);
if (string.IsNullOrWhiteSpace(rawValue))
return defaultValue;
var value = rawValue.Trim();
try
{
if (value.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return Convert.ToInt32(value.Substring(2), 16);
if (int.TryParse(value, out var parsedValue))
return parsedValue;
}
catch (Exception ex)
{
LogEntry($"Could not parse ACL permission config value '{columnName}'='{rawValue}': {ex.Message}. Falling back to default '{defaultValue}'.", LogLevels.Warning);
return defaultValue;
}
LogEntry($"Could not parse ACL permission config value '{columnName}'='{rawValue}'. Falling back to default '{defaultValue}'.", LogLevels.Warning);
return defaultValue;
}
public ProviderCacheEntry getDataProvider(Guid ProviderConfigClassID) public ProviderCacheEntry getDataProvider(Guid ProviderConfigClassID)
{ {
var CM = MethodBase.GetCurrentMethod(); var CM = MethodBase.GetCurrentMethod();