如何使用管理权限正确检查进程是否正在运行?
我检查了IsUserAnAdim
function in MSDN,但不推荐使用它,因为它可能会在后续版本的Windows中被更改或不可用。相反,建议使用CheckTokenMembership
函数。
然后,我从CheckTokenMembership
函数的描述中查看了MSDN中的备用示例。但是,Stefan Ozminski在MSDN中的评论提到,如果禁用UAC,此示例在Windows Vista中无法正常运行。
最后,我尝试使用来自MSDN的Stefan Ozminski的代码,但它确定该进程具有管理权限,即使我在没有Windows 7管理权限的普通用户下启动它。
答案 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
进行通话。