如何在C#中为文件夹授予权限?

12

我需要使用C#给文件夹"Temporary ASP.NET Files"授予写入权限... 我使用以下代码进行访问

DirectoryInfo d1 = new DirectoryInfo(Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "Temporary ASP.NET Files"));
DirectorySecurity md1 = d1.GetAccessControl();


string user_1 = fa.TextGuestDomain + "\\" + fa.TextGuestUser;
md1.AddAccessRule(new FileSystemAccessRule(user_1, FileSystemRights.FullControl,InheritanceFlags.ObjectInherit,PropagationFlags.InheritOnly, AccessControlType.Allow));

d1.SetAccessControl(md1);

在我实施代码后,当我检查“Temporary ASP.NET Files”文件夹的安全属性时,它没有勾选“写入”权限复选框,而是勾选了“特殊权限”... 我已经注意到,即使我将访问权限从写入更改为完全控制或读取,它仍然会勾选“特殊权限”的复选框...

这不是问题 :),问题是它没有给予我所赋予的正确访问权限... 当我赋予它写入权限时,它不像有写入权限一样运作。我不知道为什么!!我做错了吗?

注意:手动进行时可以正常工作,但使用编码方式时不能正常工作...

希望你能帮助我解决这个问题...

非常感谢!

2个回答

11
private static void GrantAccess(string file)
{
    bool exists = System.IO.Directory.Exists(file);
    if (!exists)
    {
        DirectoryInfo di = System.IO.Directory.CreateDirectory(file);
        Console.WriteLine("The Folder is created Sucessfully");
    }
    else
    {
        Console.WriteLine("The Folder already exists");
    }
    DirectoryInfo dInfo = new DirectoryInfo(file);
    DirectorySecurity dSecurity = dInfo.GetAccessControl();
    dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
    dInfo.SetAccessControl(dSecurity);
   
}

上述代码将文件夹的访问权限设置为每个用户(所有人)的完全控制/读写。

1
完全按照所说的那样工作。每个人都拥有完全控制。 - Venugopal M
对我没有用。我想将一些库添加到 C:\Program Files\Unity\Hub\Editor\2019.4.20f1\Editor 中,使用了相同的脚本,但修改了不创建目录的部分。我得到了以下错误: 错误:System.UnauthorizedAccessException:尝试执行未经授权的操作。 于 System.Security.AccessControl.NativeObjectSecurity.RaiseExceptionOnFailure (System.Int32 errorCode, System.String name, System.Runtime.InteropServices.SafeHandle handle, System.Object context) [0x00024] - blongho
@blongho 也许你当前的进程没有该位置的访问权限。尝试以管理员权限运行它。 - Idan

10

我了解你的痛苦 - 文件系统的ACL修改很麻烦,即使看起来工作正常,但在某些情况下可能会出现问题。 在你的情况下,幸运的是有一个简单的解决方案。

问题在于 PropagationFlags.InheritOnly。这意味着此权限仅适用于继承权限的项目 - 例如,您只为此目录中的文件授予权限,而不是任何子目录中的文件。

要授予继承“正常”的目录权限(即传播到子目录和所有文件),请使用 InheritanceFlags 和 PropagationFlags 的以下值:InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInheritPropagationFlags.None


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接