如何检查管理员权限C#

时间:2011-09-26 13:59:42

标签: c# admin-rights

如何检查我的应用程序是以管理员权限开始的?我现在使用这个代码:

public static bool IsUserAdministrator()
        {
            //bool value to hold our return value
            bool isAdmin;
            try
            {
                //get the currently logged in user
                WindowsIdentity user = WindowsIdentity.GetCurrent();
                WindowsPrincipal principal = new WindowsPrincipal(user);
                isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
            }
            catch (UnauthorizedAccessException ex)
            {
                isAdmin = false;
            }
            catch (Exception ex)
            {
                isAdmin = false;
            }
            return isAdmin;
        }

此代码检查用户权限,我需要检查应用程序具有的权限。例如,我不是管理员,但是当应用程序以管理员权限启动时,此代码返回false。谢谢!

1 个答案:

答案 0 :(得分:2)

这是执行检查的正确方法,我在PowerShell配置文件中自己使用它来区分提升的会话。

我怀疑您没有考虑用户访问控制(UAC)的影响。当用户登录时,他们会获得分配的安全令牌对象。它包含自己的安全ID(SID),它们所属的组的SID以及它们拥有的权限列表(以及是否启用了这些权限)。

启用UAC后,当您进行交互式登录时,如果您具有某些权限或者是本地管理员的成员,则会获得两个*令牌:一个包含所有内容,另一个包含管理访问权限,并删除了SID和权限。前一个令牌用于每个启动的进程,除非在使用后一个令牌时启动升级。

因此,如果没有额外的步骤,管理员就无法充分发挥其功能 - 这有助于防止恶意软件在完全控制系统的情况下启动。

查看此操作的最佳工具是Process Explorer。进程属性对话框的“安全”选项卡显示进程安全令牌的内容(并将“完整性级别”列添加到主显示中将显示提升的进程) - 运行Process Explorer以查看完整信息。

因此,您的代码仅对管理员运行的进程返回true,该管理器也已提升(以管理员身份运行)。