4

我正在尝试以编程方式设置文件夹审核选项下的“适用于”字段。在 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);

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

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

提前感谢您的任何帮助。

4

1 回答 1

4

经过一番摆弄后,我设法找出了如何设置“适用于”字段。创建审计规则对象时,您需要结合使用 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));

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

于 2013-05-04T08:56:18.360 回答