生活的天平本不平衡,只有通过努力改变其偏向。

判断程序有无Administrator的权限

2008-03-13

涉及到的API
* OpenProcessToken
* GetCurrentProcess
* GetTokenInformation
* AllocateAndInitializeSid
* EqualSid
* FreeSid

具体方法:
1.用OpenProcessToken打开进程令牌对象 获得令牌句柄
2.通过令牌句柄 用GetTokenInformation 获得令牌信息
3.使用AllocateAndInitializeSid分配和初始化SID psidAdministrators
4.最后通过EqualSid检查令牌信息中的SID和psidAdministrators是否相等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 #include <stdio.h>  
  #include <windows.h>  
  /* 
  * 判断有无Administrator的权限 
  */ BOOL IsAdmin(void)  
  {  
  HANDLE hAccessToken;  
  BYTE * InfoBuffer = new BYTE[1024];  
  PTOKEN_GROUPS ptgGroups;  
  DWORD dwInfoBufferSize;  
  PSID psidAdministrators;  
  SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;  
 
  if(!OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hAccessToken))  
  {  
  delete InfoBuffer;  
  return FALSE;  
  }  
 
  if(!GetTokenInformation(hAccessToken,TokenGroups,InfoBuffer,1024,&dwInfoBufferSize))  
  {  
  delete InfoBuffer;  
  CloseHandle(hAccessToken);  
  return FALSE;  
  }  
 
  CloseHandle(hAccessToken);  
 
  if(!AllocateAndInitializeSid(&siaNtAuthority,  
  2,  
  SECURITY_BUILTIN_DOMAIN_RID,  
  DOMAIN_ALIAS_RID_ADMINS,  
  0,0,0,0,0,0,  
  &psidAdministrators))  
  {  
  delete InfoBuffer;  
  return FALSE;  
  }  
 
  ptgGroups = (PTOKEN_GROUPS)InfoBuffer;  
 
  for(UINT i = 0; i < ptgGroups->GroupCount; i++)  
  {  
  if(EqualSid(psidAdministrators,ptgGroups->Groups[i].Sid))  
  {  
  FreeSid(psidAdministrators);  
  delete InfoBuffer;  
  return TRUE;  
  }  
  }  
  return FALSE;  
  }  
  int main()  
  {  
  if(!IsAdmin())  
  printf("you don't have the administrator's authority!\n");  
  else  
  printf("you have the administrator's authority!\n");  
  return 0;  
  }
作者:lonkil | 分类目录:编程开发 | 标签:

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>