我想为特定用户设置一个只读文件夹,他应该无法编辑或删除它,我尝试了下面的代码,但它不起作用,我需要对它进行哪些更改
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)-从根继承]