判断当前进程是否具有管理员权限

·

测试结果

  • 用管理员权限运行,返回TRUE;
  • 在UAC环境下直接运行,返回FALSE;
  • 在SYSTEM权限服务进程中执行,返回TRUE。
//
BOOL IsAdmin()
{
	typedef BOOL(WINAPI *_LPFN_ISADMIN) (VOID);
	_LPFN_ISADMIN	fnIsAdmin;

	//	IsUserAnAdmin
	HMODULE	hShell32 = LoadLibraryA("Shell32.dll");

	fnIsAdmin = (_LPFN_ISADMIN)::GetProcAddress(hShell32, "IsUserAnAdmin");

	if (NULL != fnIsAdmin)
	{
		return fnIsAdmin();
	}
	return FALSE;
}
BOOL IsUserAdmin(VOID)
/*++ 
Routine Description: This routine returns TRUE if the caller's
process is a member of the Administrators local group. Caller is NOT
expected to be impersonating anyone and is expected to be able to
open its own process and process token. 
Arguments: None. 
Return Value: 
   TRUE - Caller has Administrators local group. 
   FALSE - Caller does not have Administrators local group. --
*/ 
{
	BOOL b;
	SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
	PSID AdministratorsGroup; 
	b = AllocateAndInitializeSid(
	    &NtAuthority,
	    2,
	    SECURITY_BUILTIN_DOMAIN_RID,
	    DOMAIN_ALIAS_RID_ADMINS,
	    0, 0, 0, 0, 0, 0,
	    &AdministratorsGroup); 
	if (b) 
	{
		if (!CheckTokenMembership( NULL, AdministratorsGroup, &b)) 
		{
			b = FALSE;
		} 
		FreeSid(AdministratorsGroup); 
	}
	return(b);
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注