|
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;
|