c# 如何将 FileSystemRights.CreateDirectories 设置为拒绝,但将 FileSystemRights.AppendData 设置为允许
c# How to set FileSystemRights.CreateDirectories to Deny but FileSystemRights.AppendData to Allow
我正在尝试编写一个工具,限制破坏文件服务器结构的能力。在这个项目中,我试图限制用户将文件保存在目录中,但阻止用户在特定文件夹中创建子目录。子目录将以另一种方式创建,已经可以使用了。
但我面临的问题是,ntfs 权限似乎混合了 "create directories" 和 "append data"。现在 "append data" 部分是(拒绝时)阻止用户将文件保存在目录中的部分,这是不需要的。但是当允许时,相同的权限使得创建子目录成为可能。
在 windows explorer security window 中,这两个权限是使用相同的复选框设置的,但是由于枚举 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);
但是当设置一个允许,一个拒绝时,两者都被拒绝了。
对此有什么想法或提示吗?
问题解决方法如下:
// 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 参数和 AccessControllType 参数的区别。我的一个朋友给了我解决方案,但我还无法调查 InheritanceFlags 参数的差异。一旦有时间,我将尝试给出有关它们如何工作的提示。
这里的SecurityIdentifier sidAll只是作为一个例子。
我正在尝试编写一个工具,限制破坏文件服务器结构的能力。在这个项目中,我试图限制用户将文件保存在目录中,但阻止用户在特定文件夹中创建子目录。子目录将以另一种方式创建,已经可以使用了。
但我面临的问题是,ntfs 权限似乎混合了 "create directories" 和 "append data"。现在 "append data" 部分是(拒绝时)阻止用户将文件保存在目录中的部分,这是不需要的。但是当允许时,相同的权限使得创建子目录成为可能。
在 windows explorer security window 中,这两个权限是使用相同的复选框设置的,但是由于枚举 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);
但是当设置一个允许,一个拒绝时,两者都被拒绝了。
对此有什么想法或提示吗?
问题解决方法如下:
// 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 参数和 AccessControllType 参数的区别。我的一个朋友给了我解决方案,但我还无法调查 InheritanceFlags 参数的差异。一旦有时间,我将尝试给出有关它们如何工作的提示。
这里的SecurityIdentifier sidAll只是作为一个例子。