如何在没有UAC的情况下检查非管理员的管理员权限?

时间:2015-12-08 08:43:21

标签: c# winforms

我正在尝试检查管理员是否具有给定文件夹的写入权限。

它适用于当前用户,但我希望此方法为管理进程提供结果,因为稍后我将从当前模式进入管理模式。只有在这个地方才需要检查。

这是我的winform应用程序的代码。

public static bool DirectoryCanCreate(string DirectoryPath)
    {
        if (string.IsNullOrEmpty(DirectoryPath)) return false;

        try
        {

            FileIOPermission writePermission = new FileIOPermission(FileIOPermissionAccess.Write, DirectoryPath);
            if (!SecurityManager.IsGranted(writePermission))
            {
                return false;
            }
            AuthorizationRuleCollection rules = Directory.GetAccessControl(DirectoryPath).GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier));
            WindowsIdentity identity = WindowsIdentity.GetCurrent();

            foreach (FileSystemAccessRule rule in rules)
            {
                if (identity.Groups.Contains(rule.IdentityReference))
                {
                    if ((FileSystemRights.Write & rule.FileSystemRights) == FileSystemRights.Write)
                    {
                        if (rule.AccessControlType == AccessControlType.Deny)
                            return false;
                        if (rule.AccessControlType == AccessControlType.Allow)
                            return true;
                    }
                }
            }
        }
        catch { 

        }
        return false;
    }

1 个答案:

答案 0 :(得分:0)

您的代码当前获取当前用户身份,并仅检查该身份的权限。您应该更改它以检查其他用户的身份(某些' Admin'帐户)。您可以获得“管理员”的Identity对象。用户致电WindowsIdentity.Impersonate(IntPtr);

WindowsIdentity identity = WindowsIdentity.Impersonate(IntPtr OtherUserPtr);

但是要获取IntPtr OtherUserPtr值,您需要调用一些WinAPI代码。有关详细信息,请参阅此链接:https://msdn.microsoft.com/en-us/library/chf6fbt4(v=vs.110).aspx

或者,您可以将GetAccessRulles()来电更改为获取typeof(System.Security.Principal.NTAccount),然后将字符串rule.IdentityReference.Value与您想要的用户或群组匹配。

变化:

AuthorizationRuleCollection rules = Directory.GetAccessControl(DirectoryPath).GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier));

对此:

AuthorizationRuleCollection rules = Directory.GetAccessControl(DirectoryPath).GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));

然后在循环规则集合时不要检查:

if (identity.Groups.Contains(rule.IdentityReference))

而是检查要检查的用户NT帐户名称:

if( rule.IdentityReference.Value == @"BUILTIN\Administrators")