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查看進程的屬性
發現此時用戶User為管理員賬戶(Wind),在用戶組列表中,有管理員用戶組(Administrators),但是Flags為Deny,這是由於UAC控制下,管理員賬號登陸的系統運行的程序默認運行在標准用戶權限下。
_2.Run As Administrator
使用Process Explorer查看進程的屬性
發現此時Users屬性為管理員賬戶(Wind),管理員用戶組(Administrators)的Flags為Owner
(2)標准用戶登陸系統
_1.直接運行
使用Process Explorer查看進程屬性
發現此時運行的用戶為Test(普通用戶),用戶組中沒有管理員用戶組
_2.Run As Administrator
使用Process Explorer查看進程屬性
發現User屬性變為管理員賬戶(Wind)了,而且Group列表中有管理員用戶組,其中Flags為Owner
4.由運行測試可以知道,判斷是否運行在管理員權限下,有兩個條件
- 進程運行用戶為管理員賬戶
- 管理員用戶組的Flags為Owner
5.因此可以自己編寫IsUserAnAdmin函數
參考http://www.cnblogs.com/cpointer/p/4138574.html中的Am_I_In_Admin_Group函數
個人覺得這個函數即可以判斷進程運行的用戶是否屬於管理員用戶組,又可以判斷是否運行權限為管理員。