gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:16:36 25 4
gpt4 key购买 nike

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

最佳答案

假设问题陈述是“如何确定我的进程是否已在 UAC 下提升”,

  1. 检查 UAC 是否启用
  2. 检查 IsUserAnAdmin() 是否返回 true
  3. 检查进程 token 的提升类型是 TokenElevationTypeFull

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

详细信息:

  1. 检查 UAC 是否启用

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

  1. 检查 IsUserAnAdmin() 是否返回 true

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

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

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

// 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 - 如何检查可执行文件是否以管理员身份运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38779450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com