Часто бывает необходимо узнать, запущена ли программа с правами администратора или же с правами простого пользователя. Нижеприведенная функция вернет истину, если программа запущена под админом.
1 | {Определение "под кем" запущена программа} |
2 | uses Windows; |
3 | function isAdmin: Boolean ; |
4 | const |
5 | SECURITY_BUILTIN_DOMAIN_RID = $00000020 ; |
6 | DOMAIN_ALIAS_RID_ADMINS = $00000220 ; |
7 | siaNtAuthority: TSIDIdentifierAuthority = (Value: ( 0 , 0 , 0 , 0 , 0 , 5 )); |
8 | var |
9 | hAccessToken: Cardinal ; |
10 | ptgGroups: PTokenGroups; |
11 | dwInfoBufferSize: DWORD; |
12 | psidAdmins: PSID; |
13 | i: Integer ; |
14 | begin |
15 | Result:= false ; |
16 | if OpenProcessToken(GetCurrentProcess, TOKEN_READ, hAccessToken) then begin |
17 | ptgGroups:= GetMemory( 1024 ); |
18 | try |
19 | if GetTokenInformation(hAccessToken, |
20 | TokenGroups, |
21 | ptgGroups, |
22 | 1024 , |
23 | dwInfoBufferSize) then begin |
24 |
25 | if AllocateAndInitializeSid(siaNtAuthority, |
26 | 2 , |
27 | SECURITY_BUILTIN_DOMAIN_RID, |
28 | DOMAIN_ALIAS_RID_ADMINS, |
29 | 0 , 0 , 0 , 0 , 0 , 0 , |
30 | psidAdmins) then |
31 | try |
32 | for i:= 0 to ptgGroups^.GroupCount - 1 do |
33 | if EqualSid(psidAdmins, ptgGroups^.Groups[i].Sid) then begin |
34 | Result:= True ; |
35 | Break; |
36 | end ; |
37 | finally |
38 | FreeSid(psidAdmins); |
39 | end ; { End AllocateAndInitializeSid } |
40 | end ; |
41 | finally |
42 | FreeMemory(ptgGroups); |
43 | end ; { End ptgGroups } |
44 | end ; { End OpenProcessToken } |
45 | end ; |