如何检查进程是否具有管理权限

时间:2011-11-08 04:54:24

标签: c++ winapi

如何使用管理权限正确检查进程是否正在运行?

我检查了IsUserAnAdim function in MSDN,但不推荐使用它,因为它可能会在后续版本的Windows中被更改或不可用。相反,建议使用CheckTokenMembership函数。

然后,我从CheckTokenMembership函数的描述中查看了MSDN中的备用示例。但是,Stefan Ozminski在MSDN中的评论提到,如果禁用UAC,此示例在Windows Vista中无法正常运行。

最后,我尝试使用来自MSDN的Stefan Ozminski的代码,但它确定该进程具有管理权限,即使我在没有Windows 7管理权限的普通用户下启动它。

2 个答案:

答案 0 :(得分:44)

这将告诉您是否使用提升的权限运行。如果要提示,可以将清单设置为尽可能运行。还有其他方法可以通过代码向窗口询问备用凭据。

BOOL IsElevated( ) {
    BOOL fRet = FALSE;
    HANDLE hToken = NULL;
    if( OpenProcessToken( GetCurrentProcess( ),TOKEN_QUERY,&hToken ) ) {
        TOKEN_ELEVATION Elevation;
        DWORD cbSize = sizeof( TOKEN_ELEVATION );
        if( GetTokenInformation( hToken, TokenElevation, &Elevation, sizeof( Elevation ), &cbSize ) ) {
            fRet = Elevation.TokenIsElevated;
        }
    }
    if( hToken ) {
        CloseHandle( hToken );
    }
    return fRet;
}

答案 1 :(得分:0)

您可以使用LsaOpenPolicy()功能。 LsaOpenPolicy函数打开本地或远程系统上Policy对象的句柄。

您必须以“管理员”身份运行流程,以便通过ERROR_ACCESS_DENIED进行通话。

Source: MSDN

相关问题