如何以编程方式更改文件夹审核选项下的“适用于”字段 (.NET)

Bru*_*Dev 5 .net c# windows auditing

我正在尝试以编程方式设置文件夹审核选项下的“适用于”字段。在 MSDN 中,代码示例使用 FileSystemAuditRule 类向文件夹添加新的审核规则。此类中没有任何明显的内容可以设置需要应用的特定审核规则。

这是我用来设置一些权限的代码:

const string myFolder = @"S:\Temp\SomeFolderToAudit";

var account = new SecurityIdentifier(WellKnownSidType.WorldSid, null).Translate(typeof(NTAccount));

FileSecurity fSecurity = File.GetAccessControl(myFolder, AccessControlSections.Audit);

fSecurity.AddAuditRule(new FileSystemAuditRule(account, FileSystemRights.WriteData | FileSystemRights.Delete | FileSystemRights.ChangePermissions, AuditFlags.Success));

File.SetAccessControl(myFolder, fSecurity);
Run Code Online (Sandbox Code Playgroud)

除了下面突出显示的选项之外,这可以很好地创建审核规则: 适用于未设置的选项

例如,我需要将其设置为“此文件夹、子文件夹和文件”或“仅限此文件夹”以外的任何内容。我不想遍历所有目录和文件并对它们设置相同的审核规则。我也不想尝试管理继承,规则将受到保护。我只需要一种最好使用托管代码来设置此选项的方法(如果这是唯一的方法,欢迎使用 P/Invokes)。

预先感谢您的任何帮助。

Bru*_*Dev 5

经过一番摆弄后,我设法找到了如何设置“适用于”字段。创建审核规则对象时,您需要结合使用 InheritanceFlags 和 PropagationFlags。

以下是示例代码(基于问题示例),向您显示标志的组合以及它们对“适用于”字段的结果:

// This folder only (default)
fSecurity.AddAuditRule(new FileSystemAuditRule(account, FileSystemRights.WriteData | FileSystemRights.Delete | FileSystemRights.ChangePermissions, InheritanceFlags.None, PropagationFlags.None, AuditFlags.Success));
// This folder and subfolders
fSecurity.AddAuditRule(new FileSystemAuditRule(account, FileSystemRights.WriteData | FileSystemRights.Delete | FileSystemRights.ChangePermissions, InheritanceFlags.ContainerInherit, PropagationFlags.None, AuditFlags.Success));
// This folder and files
fSecurity.AddAuditRule(new FileSystemAuditRule(account, FileSystemRights.WriteData | FileSystemRights.Delete | FileSystemRights.ChangePermissions, InheritanceFlags.ObjectInherit, PropagationFlags.None, AuditFlags.Success));
// This folder, subfolders and files
fSecurity.AddAuditRule(new FileSystemAuditRule(account, FileSystemRights.WriteData | FileSystemRights.Delete | FileSystemRights.ChangePermissions, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AuditFlags.Success));
// Subfolders only
fSecurity.AddAuditRule(new FileSystemAuditRule(account, FileSystemRights.WriteData | FileSystemRights.Delete | FileSystemRights.ChangePermissions, InheritanceFlags.ContainerInherit, PropagationFlags.InheritOnly, AuditFlags.Success));
// Files only
fSecurity.AddAuditRule(new FileSystemAuditRule(account, FileSystemRights.WriteData | FileSystemRights.Delete | FileSystemRights.ChangePermissions, InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AuditFlags.Success));
// Subfolders and files only
fSecurity.AddAuditRule(new FileSystemAuditRule(account, FileSystemRights.WriteData | FileSystemRights.Delete | FileSystemRights.ChangePermissions, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AuditFlags.Success));
Run Code Online (Sandbox Code Playgroud)

这些信息以及更多有关访问控制的信息可以在Michael Taylor 的这个非常有用的页面上找到。