如何检查可执行文件是否以管理员身份 运行?
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",
- 检查 UAC 是否启用
- 检查是否
IsUserAnAdmin()
returns 为真
- 检查进程令牌的提升类型是
TokenElevationTypeFull
如果所有三个测试都为真,则您的进程已在 UAC 下提升。请注意,GetProcessElevationType
检查本身可能就足够了,但在我们自己的代码中,我们会执行其他检查,以防将来出现其他类型的拆分令牌。
详情:
- 检查 UAC 是否启用
可能还有其他方法可以做到这一点,但最简单的方法是查看注册表。如果值 EnableLUA
存在于注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
下,则 UAC 已启用。
- 检查是否
IsUserAnAdmin()
returns 为真
这很简单 - 只需调用 IsUserAnAdmin()
函数即可。请注意,此功能已弃用;您还可以使用 CheckTokenMembership()
函数。
- 检查进程令牌的提升类型是
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;
}
我正在用 c++/c 编写应用程序。如何检测该进程是否以管理员身份启动(右键单击 运行 以管理员身份)?
假设问题陈述是"how to determine if my process has been elevated under UAC",
- 检查 UAC 是否启用
- 检查是否
IsUserAnAdmin()
returns 为真 - 检查进程令牌的提升类型是
TokenElevationTypeFull
如果所有三个测试都为真,则您的进程已在 UAC 下提升。请注意,GetProcessElevationType
检查本身可能就足够了,但在我们自己的代码中,我们会执行其他检查,以防将来出现其他类型的拆分令牌。
详情:
- 检查 UAC 是否启用
可能还有其他方法可以做到这一点,但最简单的方法是查看注册表。如果值 EnableLUA
存在于注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
下,则 UAC 已启用。
- 检查是否
IsUserAnAdmin()
returns 为真
这很简单 - 只需调用 IsUserAnAdmin()
函数即可。请注意,此功能已弃用;您还可以使用 CheckTokenMembership()
函数。
- 检查进程令牌的提升类型是
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;
}