将文件夹设为具有ACL的用户的只读文件夹



我想为特定用户设置一个只读文件夹,他应该无法编辑或删除它,我尝试了下面的代码,但它不起作用,我需要对它进行哪些更改

 try
 {
     string folderPath = textBox1.Text;
     string username = comboBox1.SelectedItem.ToString();
     DirectorySecurity ds = Directory.GetAccessControl(folderPath);
     FileSystemAccessRule fsa =
         new FileSystemAccessRule(username,
                                  FileSystemRights.ReadAndExecute,
                                  AccessControlType.Allow);
     ds.AddAccessRule(fsa);
     Directory.SetAccessControl(folderPath, ds);
     MessageBox.Show("ReadOnly");
 }
 catch (Exception ex)
 {
     MessageBox.Show(ex.Message);
 }

用户可能通过Everyone等组的成员身份继承了对文件夹的额外权限,因此设置Allow规则只允许他做一些他已经可以做的事情。

示例:

-根[允许:读/写(每个人)]-ParentFolder[允许:读/写(Everyone)-从根继承]-受限文件夹[允许:读/写(Everyone)-从根继承][允许:读取(受限用户)-此操作无效!]

您可能希望设置拒绝规则。这应确保阻止用户写入或删除文件夹,无论继承的权限或允许写入文件夹的组的成员身份如何。

DirectorySecurity ds = Directory.GetAccessControl(folderPath);
FileSystemRights allExceptRead =
    FileSystemRights.FullControl & ~FileSystemRights.ReadAndExecute;
// Use AccessControlType.Deny instead of Allow.
FileSystemAccessRule fsa = new FileSystemAccessRule(username,
                                                    allExceptRead,
                                                    AccessControlType.Deny);
ds.AddAccessRule(fsa);
Directory.SetAccessControl(folderPath, ds);

所以之后,层次结构看起来是这样的:

-根[允许:读/写(每个人)]-ParentFolder[允许:读/写(Everyone)-从根继承]-受限文件夹[拒绝:写入(受限用户)-这将覆盖继承的权限][允许:读/写(Everyone)-从根继承]

如果用户可能还不被允许通过继承或组成员身份读取文件夹,那么您将不得不添加两个访问规则,一个像您已经拥有的(明确允许读取),另一个像我的(明确禁止读取以外的任何内容)。之后的层次结构示例:

-根[允许:读/写(每个人)]-ParentFolder[允许:读/写(每个人)]//阻止ParentFolder的权限传播到子文件夹[阻止子文件夹继承权限]-受限文件夹[拒绝:写入(受限用户)]//请注意,"Everyone"权限不是继承的。//如果不明确允许读取,用户将无法对此文件夹执行任何操作[允许:读取(受限用户)-明确允许读取]

更新

根据此链接,拒绝对文件夹本身的Delete权限是不够的。您还需要拒绝文件夹的文件夹上的Delete subfolders and files。因此,您的文件夹层次结构必须如下所示:

-根[允许:读/写(每个人)]-ParentFolder[拒绝:删除子文件夹和文件(受限用户)][允许:读/写(Everyone)-从根继承]-受限文件夹[拒绝:写入(受限用户)-这将覆盖继承的权限][允许:读/写(Everyone)-从根继承]

相关内容

最新更新