【发布时间】:2016-12-11 07:00:03
【问题描述】:
我正在用 c++/c 编写一个应用程序。如何检测进程是否以管理员身份启动(右键以管理员身份运行)?
【问题讨论】:
-
根据您的术语,我相信此应用程序旨在在 Windows 上运行。对吗?
-
很抱歉,我忘了提到操作系统:p 是的,它是 windows
标签: c windows winapi elevated-privileges
我正在用 c++/c 编写一个应用程序。如何检测进程是否以管理员身份启动(右键以管理员身份运行)?
【问题讨论】:
标签: c windows winapi elevated-privileges
假设问题陈述是“如何确定我的进程是否在 UAC 下被提升”,
IsUserAnAdmin()是否返回trueTokenElevationTypeFull
如果所有三个测试都为真,则您的进程已在 UAC 下提升。请注意,GetProcessElevationType 本身检查可能就足够了,但在我们自己的代码中,我们会执行其他检查,以防将来有其他类型的拆分令牌。
详情:
可能还有其他方法可以做到这一点,但最简单的方法是查看注册表。如果值EnableLUA 存在于注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 下,则启用UAC。
IsUserAnAdmin()是否返回true这很简单——只需调用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;
}
【讨论】: