c#如何将FileSystemRights.CreateDirectories设置为Deny但将FileSystemRights.AppendData设置为Allow

时间:2015-05-20 13:29:54

标签: c# permissions ntfs

我正在尝试编写一个工具,限制了弄乱文件服务器结构的能力。在这个项目中,我试图限制用户在目录中保存文件,但阻止用户在特定文件夹中创建子目录。该子目录将以另一种方式创建,已经有效。

但我面临的问题是,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);

但是当设置一个允许而一个拒绝时,两者都被拒绝。

对此有何想法或提示?

1 个答案:

答案 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作为示例。