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只是作为一个例子。