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

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

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

  1. 检查UAC已启用
  2. 检查IsUserAnAdmin()返回true
  3. 检查进程标记的标高类型是TokenElevationTypeFull

如果所有三个测试都是真实的,那么在UAC下你的过程已经被提升了。 请注意,有可能GetProcessElevationType检查本身就足够了,但是在我们自己的代码中,我们做了其他的代码,以防将来有其他类型的分割令牌。

细节:

  1. 检查UAC已启用

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

  1. 检查IsUserAnAdmin()返回true

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

  1. 检查进程标记的标高类型是TokenElevationTypeFull

您可以使用以下函数获取标记的标高类型:

 // TokenElevationTypeDefault -- User is not using a split token. (eg 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; }