如何检查可执行文件是否以管理员身份 运行?

How can I check that an executable is being run as an administrator?

我正在用 c++/c 编写应用程序。如何检测该进程是否以管理员身份启动(右键单击 运行 以管理员身份)?

假设问题陈述是"how to determine if my process has been elevated under UAC",

  1. 检查 UAC 是否启用
  2. 检查是否 IsUserAnAdmin() returns 为真
  3. 检查进程令牌的提升类型是 TokenElevationTypeFull

如果所有三个测试都为真,则您的进程已在 UAC 下提升。请注意,GetProcessElevationType 检查本身可能就足够了,但在我们自己的代码中,我们会执行其他检查,以防将来出现其他类型的拆分令牌。

详情:

  1. 检查 UAC 是否启用

可能还有其他方法可以做到这一点,但最简单的方法是查看注册表。如果值 EnableLUA 存在于注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 下,则 UAC 已启用。

  1. 检查是否 IsUserAnAdmin() returns 为真

这很简单 - 只需调用 IsUserAnAdmin() 函数即可。请注意,此功能已弃用;您还可以使用 CheckTokenMembership() 函数。

  1. 检查进程令牌的提升类型是 TokenElevationTypeFull

您可以使用以下函数获取令牌的海拔类型:

// TokenElevationTypeDefault -- User is not using a split token. (e.g. UAC disabled or local admin "Administrator" account which UAC may not apply to.)
// TokenElevationTypeFull    -- User has a split token, and the process is running elevated.
// TokenElevationTypeLimited -- User has a split token, but the process is not running elevated.
bool GetProcessElevationType(TOKEN_ELEVATION_TYPE *pOutElevationType)
{
    *pOutElevationType = TokenElevationTypeDefault;
    bool fResult = false;

    HANDLE hProcToken = NULL; 

    if (::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &hProcToken))
    {
        DWORD dwSize = 0;
        TOKEN_ELEVATION_TYPE elevationType = TokenElevationTypeDefault;

        if (::GetTokenInformation(hProcToken, TokenElevationType, &elevationType, sizeof(elevationType), &dwSize)
        &&  dwSize == sizeof(elevationType))
        {
            *pOutElevationType = elevationType;
            fResult = true;
        }

        ::CloseHandle(hProcToken);
    }

    return fResult;
}