读取C#中目录的权限

前端之家收集整理的这篇文章主要介绍了读取C#中目录的权限前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我注意到如果您更改特定目录的安全设置,您可以使该文件夹不再在 Windows中“浏览”.特别是,将管理员的“读取”权限更改为“拒绝”将使该文件夹无法访问.

我现在的问题是,我如何在代码解决这个问题?我跟着让我接近,但它仍然是不对的:

/// <summary>
/// Takes in a directory and determines if the current user has read access to it (doesn't work for network drives)
/// THIS IS VERY HACKY
/// </summary>
/// <param name="dInfo">directoryInfo object to the directory to examine</param>
/// <returns>true if read access is available,false otherwise</returns>
public static bool IsDirectoryReadable(DirectoryInfo dInfo)
{
    try
    {
        System.Security.AccessControl.DirectorySecurity dirSec = dInfo.GetAccessControl();
        System.Security.Principal.WindowsIdentity self = System.Security.Principal.WindowsIdentity.GetCurrent();
        System.Security.Principal.WindowsPrincipal selfGroup = new System.Security.Principal.WindowsPrincipal(self);
        // Go through each access rule found for the directory
        foreach (System.Security.AccessControl.FileSystemAccessRule ar in dirSec.GetAccessRules(true,true,typeof(System.Security.Principal.SecurityIdentifier)))
        {
            if (selfGroup.IsInRole((System.Security.Principal.SecurityIdentifier)ar.IdentityReference))
            {
                // See if the Read right is included
                if ((ar.FileSystemRights & System.Security.AccessControl.FileSystemRights.Read) == System.Security.AccessControl.FileSystemRights.Read)
                {
                    if (ar.AccessControlType == System.Security.AccessControl.AccessControlType.Allow)
                    {
                        // If all of the above are true,we do have read access to this directory
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }
        // If we didn't find anything
        return false;
    }
    catch
    {
        // If anything goes wrong,assume false
        return false;
    }
}

我跟上述情况很接近,但我仍然缺少一些巨大的东西.如果我右键单击文件夹来设置权限,我会看到(在我的示例中)3个组或用户名:“Administrators,myUserName和SYSTEM”.如果我为“管理员”或“myUserName”将“读取”设置为“拒绝”,则我无法再浏览该目录.如果我只将“系统”设置为“拒绝”,我仍然可以浏览它.

似乎存在某种隐含的权限层次结构,其中myUserName或Administrator取代SYSTEM组/用户.

上面的代码查找为我的用户标识找到的第一个允许“读取”并返回true.我也可以编写代码来查找Read的第一个“Deny”并返回false.

我可以设置一个文件夹为“ – 拒绝”为SYSTEM和读 – “允许”为其他两个帐户,仍然读取该文件夹.如果我更改代码以查找Deny并且它首先遇到SYSTEM用户身份,我的函数将返回“false”,这是… false.对于其他两个帐户,它可能很好地读取 – “允许”.

我仍然无法弄清楚的问题是,如何确定哪个用户身份权限优先于所有其他权限?

解决方法

它变得非常棘手,因为ACL允许继承,但它们也有一个限制性最强的访问模型.换句话说,如果您的资源的用户链中的任何地方都有DENY,无论有多少其他组可能给您一个ALLOW,您都会被拒绝. There is a good article on the subect on MSDN.

猜你在找的C#相关文章