检测程序是不是以完全管理员权限运行

Posted

技术标签:

【中文标题】检测程序是不是以完全管理员权限运行【英文标题】:Detect if program is running with full administrator rights检测程序是否以完全管理员权限运行 【发布时间】:2011-05-12 22:47:58 【问题描述】:

我需要确定我的程序是否以完全管理员权限运行。我的意思是如果 uac 已打开(对于 win vista/7),我需要确定程序是否真正具有管理员权限(例如用户右键单击并选择“以管理员身份运行”)并且不受 uac 限制。我如何在 C++ 中做到这一点?

【问题讨论】:

不要将 [tags] 放在主题行中。这就是标签的用途。 你可以尝试做你需要权限的操作。 How to check if a process has elevated privileges in windows 7 using native C++ ? 的可能重复项 How to check if a process has the administrative rights的可能重复 【参考方案1】: Win9x:每个人都是“管理员” NT4:OpenThreadToken/OpenProcessToken + GetTokenInformation(...,TokenGroups,...) on DOMAIN_ALIAS_RID_ADMINS SID in a loop 2000+:OpenThreadToken/OpenProcessToken + DOMAIN_ALIAS_RID_ADMINS SID 上的CheckTokenMembership

其他选择是:IsUserAnAdmin 或 AccessCheck

检查令牌中的 TOKEN_ELEVATION* 内容不是测试当前进程所必需的,但如果您需要确定用户是否可以提升,因为他们有一个拆分令牌等,这很有用。

【讨论】:

【参考方案2】:

Anders 对那些(像我一样)不太懂 Windows 的人的回答的扩展:

    BOOL isMember;
    PSID administratorsGroup = NULL;
    SID_IDENTIFIER_AUTHORITY SIDAuthNT =
        SECURITY_NT_AUTHORITY;

    if (!AllocateAndInitializeSid(&SIDAuthNT, 2,
        SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0,
        &administratorsGroup))
    
        throw(oops_t(GetLastError(), "AllocateAndInitializeSid"));
    

    if (!CheckTokenMembership(nullptr, administratorsGroup, &isMember))
    
        throw(oops_t(GetLastError(), "CheckTokenMembership"));
    

    if (!isMember)
    
        throw(oops_t(ERROR_ACCESS_DENIED, "Test for Admin privileges"));
    

【讨论】:

以上是关于检测程序是不是以完全管理员权限运行的主要内容,如果未能解决你的问题,请参考以下文章

检测 Java 应用程序是不是以 Windows 管理员身份运行

以提升的权限运行时如何正确检测网络驱动器

用于检查应用程序是不是以提升的权限运行的 PowerShell 命令

win10激活时(管理员权限运行)报 0x80070005 拒绝访问:所请求的操作需要提升

win7中运行bat批处理管理员权限问题

如何检查用户是不是在win32中具有本地管理员权限