1

如何检查我的应用程序是否以管理员权限启动?我现在使用这段代码:

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。谢谢!

4

1 回答 1

2

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

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

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

因此,管理员无法在没有额外步骤的情况下行使全部权力——这有助于防止恶意软件在完全控制系统的情况下启动。

看到这一点的最佳工具是 Process Explorer。进程属性对话框的“安全”选项卡显示进程安全令牌的内容(将“完整性级别”列添加到主显示将显示提升了哪些进程)——运行提升的进程资源管理器以查看完整信息。

因此,您的代码只会为由管理员运行且也被提升(以管理员身份运行)的进程返回 true。

于 2011-09-26T14:11:58.357 回答