Home | Chi sono | Contattami
 

Progr. lineare

Delphi
 
Componenti
  Database
 
Miei articoli

Windows

Miei articoli 

 

Determinare se l' utente corrente appartiene al gruppo Administrators locale


Nell' articolo Privilegi utente si è parlato del concetto di Privilegio ed è stato introdotto il concetto di Token di accesso. Per una descrizione più approfondita sui Token di accesso si possono studiare gli articoli agli indirizzi seguenti:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthz/security/access_tokens.asp

http://www.secinf.net/windows_security/Windows_NT_Security_Part_1.html

http://www.secinf.net/windows_security/Windows_NT_Security_Part_2.html

Il Token di accesso contiene, tra i tanti elementi, anche i SID dei gruppi di appartenenza. Il gruppo Administrators locale ha il seguente SID:

S-1-5-32-544

dare un' occhiata agli indirizzi

http://support.microsoft.com/?kbid=243330

Windows XP Well-Known Security Identifiers

per l' elenco dei SID predefiniti (well-known).

Per verificare che un SID appartenga ad un determinato Token di accesso e sia abilitato, si può usare la funzione CheckTokenMembership. Per tradurre un SID dalla rappresentazione a stringa (S-R-X-Y1-Y2-...-Y(n-1)-RID)al tipo SID definito come record useremo la funzione ConvertStringSidToSid. Di seguito la Unit con le dichiarazioni delle funzioni e le definizioni dei tipi ed a seguire il codice della funzione per verificare se l' utente corrente fa parte del gruppo Administrators locale o meno

unit uTypes; interface const {$IFDEF UNICODE} AWSuffix = 'W'; {$ELSE} AWSuffix = 'A'; {$ENDIF UNICODE} advapi32 = 'advapi32.dll'; type PSID_IDENTIFIER_AUTHORITY = ^SID_IDENTIFIER_AUTHORITY; SID_IDENTIFIER_AUTHORITY = record Value: array [0..5] of Byte; end; PSid = ^SID; SID = record Revision: Byte; SubAuthorityCount: Byte; IdentifierAuthority: SID_IDENTIFIER_AUTHORITY; SubAuthority: array [0..0] of Cardinal; //array di qualsiasi dimensione end; function ConvertStringSidToSidA(StringSid: pAnsiChar; var Sid: PSID): Boolean; stdcall; function ConvertStringSidToSidW(StringSid: pWideChar; var Sid: PSID): Boolean; stdcall; function ConvertStringSidToSid(StringSid: PChar; var Sid: PSID): Boolean; stdcall; function ConvertSidToStringSidA(Sid: PSID; var StringSid: PAnsiChar): Boolean; stdcall; function ConvertSidToStringSidW(Sid: PSID; var StringSid: PWideChar): Boolean; stdcall; function ConvertSidToStringSid(Sid: PSID; var StringSid: PChar): Boolean; stdcall; function CheckTokenMembership(TokenHandle: Cardinal; SidToCheck: PSID; var IsMember: BOOL): Boolean; stdcall; implementation function ConvertStringSidToSidA; external advapi32 name 'ConvertStringSidToSidA'; function ConvertStringSidToSidW; external advapi32 name 'ConvertStringSidToSidW'; function ConvertStringSidToSid; external advapi32 name 'ConvertStringSidToSid' + AWSuffix; function ConvertSidToStringSidA; external advapi32 name 'ConvertSidToStringSidA'; function ConvertSidToStringSidW; external advapi32 name 'ConvertSidToStringSidW'; function ConvertSidToStringSid; external advapi32 name 'ConvertSidToStringSid' + AWSuffix; function CheckTokenMembership; external advapi32 name 'CheckTokenMembership'; end.

function IsUserAdmin(): Boolean; var b: LongBool; AdministratorsGroup: PSID; begin ConvertStringSidToSid(pChar('S-1-5-32-544'), AdministratorsGroup); CheckTokenMembership(0, AdministratorsGroup, b); Result := b; end;

 

 

 

 
 
Your Ad Here