我正在尝试编写一个工具,限制了弄乱文件服务器结构的能力。在这个项目中,我试图限制用户在目录中保存文件,但阻止用户在特定文件夹中创建子目录。该子目录将以另一种方式创建,已经有效。
但我面临的问题是,ntfs权限似乎混合了#34;创建目录"和"追加数据"。现在"追加数据" part是一个(当被拒绝时)阻止用户保存目录中的文件,这是不希望的。但是当启用时,相同的权限可以创建子目录。
在Windows资源管理器安全窗口中,两个权限都设置为相同的复选框,但由于枚举FileSystemRights同时具有CreateDirectories和AppendData,我认为我可以将它们设置为另一个。
directorySecurity.AddAccessRule(
new FileSystemAccessRule(sidAll, FileSystemRights.CreateDirectories, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None, AccessControlType.Deny)
);
directorySecurity.AddAccessRule(
new FileSystemAccessRule(sidAll, FileSystemRights.AppendData, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None, AccessControlType.Allow)
);
directoryInfo.SetAccessControl(directorySecurity);
但是当设置一个允许而一个拒绝时,两者都被拒绝。
对此有何想法或提示?
答案 0 :(得分:1)
问题通过以下方式解决:
// Create a new DirectoryInfo object.
DirectoryInfo directoryInfo = new DirectoryInfo(_folderPath);
// Get a DirectorySecurity object that represents the
// current security settings.
DirectorySecurity directorySecurity = directoryInfo.GetAccessControl();
SecurityIdentifier sidAll = new SecurityIdentifier("S-1-1-0");
//Set the permissions for files in that folder to allow
FileSystemRights rights = FileSystemRights.Modify |
FileSystemRights.ReadAndExecute |
FileSystemRights.ListDirectory |
FileSystemRights.Read |
FileSystemRights.Write
directorySecurity.AddAccessRule(
new FileSystemAccessRule(
sidAll,
rights,
InheritanceFlags.ContainerInherit |
InheritanceFlags.ObjectInherit,
PropagationFlags.None,
AccessControlType.Allow)
);
FileSystemRights subfolderRights = FileSystemRights.CreateDirectories |
FileSystemRights.DeleteSubdirectoriesAndFiles |
FileSystemRights.Delete;
//Set the rights for subfolders of the
directorySecurity.AddAccessRule(
new FileSystemAccessRule(
sidAll,
subfolderRights,
InheritanceFlags.ContainerInherit, PropagationFlags.None,
AccessControlType.Deny)
);
// Set the new access settings.
directoryInfo.SetAccessControl(directorySecurity);
请注意InheritanceFlags-parameters和AccessControllType参数的不同之处。我的一个朋友给了我解决方案,但我还没有能够调查InheritanceFlags参数的差异。只要我有时间,我就会试着暗示它们是如何工作的。
此处仅使用SecurityIdentifier sidAll作为示例。