判断程序是否运行在管理员权限下 - C Pointer

时间:2024-03-02 14:52:51

判断程序是否运行在管理员权限下

1.提出两个概念(成立条件是系统是Vista后续版本,这是因为引入了UAC)

  • 一个是运行程序的账号是管理员账号
  • 另一个是当前运行环境是管理员环境

2.判断程序是否运行在管理员权限,直接使用函数IsUserAnAdmin就可以判断

#include <ShlObj.h>
#include <tchar.h>

int _tmain()
{
	BOOL bIsAdmin = IsUserAnAdmin();
	if(bIsAdmin)
		_tprintf_s(_T("Run As administrator"));
	else
		_tprintf_s(_T("Run As user"));
	system("pause");
	return 0;
}

3.测试运行

(1)管理员账号登陆系统

     _1.直接运行程序

直接运行

         使用Process Explorer查看进程的属性

image

         发现此时用户User为管理员账户(Wind),在用户组列表中,有管理员用户组(Administrators),但是Flags为Deny,这是由于UAC控制下,管理员账号登陆的系统运行的程序默认运行在标准用户权限下。

     _2.Run As Administrator

admin运行

         使用Process Explorer查看进程的属性

admin

         发现此时Users属性为管理员账户(Wind),管理员用户组(Administrators)的Flags为Owner

(2)标准用户登陆系统

     _1.直接运行

直接运行

         使用Process Explorer查看进程属性

直接运行-pe

          发现此时运行的用户为Test(普通用户),用户组中没有管理员用户组

     _2.Run As Administrator

admin运行

          使用Process Explorer查看进程属性

admin

          发现User属性变为管理员账户(Wind)了,而且Group列表中有管理员用户组,其中Flags为Owner

4.由运行测试可以知道,判断是否运行在管理员权限下,有两个条件

  • 进程运行用户为管理员账户
  • 管理员用户组的Flags为Owner

5.因此可以自己编写IsUserAnAdmin函数

参考http://www.cnblogs.com/cpointer/p/4138574.html中的Am_I_In_Admin_Group函数

个人觉得这个函数即可以判断进程运行的用户是否属于管理员用户组,又可以判断是否运行权限为管理员。