我正在用c ++ / c编写一个应用程序。 如何检测stream程是否以pipe理员身份启动(右键单击以pipe理员身份运行)?
假设问题陈述是“如何确定我的流程是否已经在UAC下提升”,
IsUserAnAdmin()
返回true TokenElevationTypeFull
如果所有三个测试都是真实的,那么在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. (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; }