A rendszergazda jog meghatározásához készítettünk egy függvényt, az IsAdministrator-t.
function IsAdministrator: Boolean;
A függvény visszatérési értéke igaz, ha a bejelentkezett felhasználó rendszergazda joggal rendelkezik. Ellenkező esetben hamis.
Most nézzük azokat a lépéseket, amelyeket meg kell tennünk a jog lekérdezéséhez.
Először az OpenThreadToken függvény segítségével, elérjük az aktuális szálhoz tartozó jogok azonosítóját.
bOK:=OpenThreadToken(GetCurrentThread,TOKEN_QUERY,True,TokenHandle);

OpenThreadToken
function OpenThreadToken(
ThreadHandle: THandle;
DesiredAccess: DWORD;
OpenAsSelf: BOOL;
var TokenHandle: THandle
): BOOL;
Egy szálhoz tartozó, hozzáférési jogok elérésére szolgál.
Paraméterek
ThreadHandle: THandle
A szál azonosítója.
DesiredAccess: DWORD
A hozzáférés típusa. A TOKEN_QUERY konstans megadásával, a jogok információihoz férünk hozzá.
OpenAsSelf: BOOL
Hamis érték megadása esetén a hozzáférés az adott szál alapján történik. Ha igaz értéket adunk meg, akkor pedig a szál processze alapján.
var TokenHandle: THandle
Ebbe a változóba kerül a megnyitott token azonosítója.
Visszatérési érték
Igaz, ha a függvény lefutása sikeres volt.
Az OpenProcessToken működése hasonlít az előző függvényéhez. A függvény az aktuális folyamat jogait kérdezi le. A TokenHandle fogja azonosítani a token-t.
bOK:=OpenProcessToken(GetCurrentProcess,TOKEN_QUERY,TokenHandle);
Miután meghatároztuk a szükséges token azonosítóját a GetTokenInformation függvénnyel lekérdezhetjük annak információit.
GetMem(ptgGroups,1024);
bOK:=GetTokenInformation(TokenHandle,TokenGroups,ptgGroups,1024,dwInfoBufferSize);
CloseHandle(TokenHandle);

GetTokenInformation
function GetTokenInformation(
TokenHandle: THandle;
TokenInformationClass: TTokenInformationClass;
TokenInformation: Pointer;
TokenInformationLength: DWORD;
var ReturnLength: DWORD
): BOOL;
A megadott token információinak lekérdezésére szolgál.
Paraméterek
TokenHandle: THandle
A token azonosítója.
TokenInformationClass: TTokenInformationClass
A lekérdezendő információ osztálya. Az itt megadott osztálynak megfelelő struktúrával rendelkező információt kapunk vissza. Használható osztályok: TokenUser, TokenGroups, TokenPrivileges, TokenOwner, TokenPrimaryGroup, TokenDefaultDacl,TokenSource, TokenType, TokenImpersonationLevel, TokenStatistics.
TokenInformation: Pointer
Az itt megadott változóba kerül a lekérdezés eredménye.
TokenInformationLength: DWORD
A TokenInformation struktúra mérete, bájtokban.
var ReturnLength: DWORD
A struktúrában elhelyezett adatok méretét adja vissza, bájtokban.
Visszatérési érték
Igaz, ha a függvény lefutása sikeres volt, ellenkező esetben hamis.
Az AllocateAndInitializeSid függvény létrehoz és inicializál egy biztonsági azonosítót (SID), maximum 8 joggal.
AllocateAndInitializeSid(SECURITY_NT_AUTHORITY,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,
0,0,0,0,0,0,psidAdministrators);

AllocateAndInitializeSid
function AllocateAndInitializeSid(
const pIdentifierAuthority: TSIDIdentifierAuthority;
nSubAuthorityCount: Byte;
nSubAuthority0,
nSubAuthority1: DWORD;
nSubAuthority2,
nSubAuthority3,
nSubAuthority4: DWORD;
nSubAuthority5,
nSubAuthority6,
nSubAuthority7: DWORD;
var pSid: Pointer
): BOOL;
Létrehoz és inicializál egy biztonsági azonosítót (SID), maximum 8 aljoggal.
Paraméterek
const pIdentifierAuthority: TSIDIdentifierAuthority
Egy TSIDIdentifierAuthority struktúra, amely a fő jogot határozza meg.
nSubAuthorityCount: Byte
Az aljogok száma, 1-8-ig.
nSubAuthority0
Aljog 1.
nSubAuthority1: DWORD
Aljog 2.
nSubAuthority2
Aljog 3.
nSubAuthority3
Aljog 4.
nSubAuthority4: DWORD
Aljog 5.
nSubAuthority5
Aljog 6.
nSubAuthority6
Aljog 7.
nSubAuthority7: DWORD
Aljog 8.
var pSid: Pointer
Az itt megadott változóba kerül a létrehozott struktúra.
Visszatérési érték
Igaz, ha a függvény lefutása sikeres volt, ellenkező esetben hamis.
Ha a psidAdministrators változóban szereplő SID értéke megegyezik a ptgGroups struktúrában szereplő SID értékével, akkor az azt jelenti hogy a felhasználó rendszergazda jogokkal rendelkezik.
for i:=0 to ptgGroups.GroupCount-1 do
if EqualSid(psidAdministrators,ptgGroups.Groups[i].Sid) then begin
Result:=True;
Break;
end;