0

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

 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);
 }
4

1 回答 1

3

用户可能通过组成员身份继承了对文件夹的附加权限,例如Everyone,因此设置允许规则只是允许他做他已经可以做的事情。

例子:

- 根
  [允许:读/写(所有人)]
  - 父文件夹
    [允许:读/写(所有人)- 继承自 Root]
    - 受限文件夹
      [允许:读/写(所有人)- 继承自 Root]
      [允许:读取(受限用户)- 这没有效果!]

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

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);

所以之后,层次结构如下所示:

- 根
  [允许:读/写(所有人)]
  - 父文件夹
    [允许:读/写(所有人)- 继承自 Root]
    - 受限文件夹
      [拒绝:写入(受限用户) - 这会覆盖继承的权限]
      [允许:读/写(所有人)- 继承自 Root]

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

- 根
  [允许:读/写(所有人)]
  - 父文件夹
    [允许:读/写(所有人)]
    // 防止 ParentFolder 的权限传播给子文件夹
    [防止子文件夹继承权限]
    - 受限文件夹
      [拒绝:写入(受限用户)]
      // 注意“Everyone”权限不是继承的。
      // 如果没有明确允许读取,用户不能对此文件夹执行任何操作
      [允许:阅读(受限用户)- 明确允许阅读]

更新

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

- 根
  [允许:读/写(所有人)]
  - 父文件夹
    [拒绝:删除子文件夹和文件(受限用户)]
    [允许:读/写(所有人)- 继承自 Root]
    - 受限文件夹
      [拒绝:写入(受限用户) - 这会覆盖继承的权限]
      [允许:读/写(所有人)- 继承自 Root]
于 2012-07-09T12:51:51.687 回答