#include <sddl.h>

bool __fastcall IsAdministratorPrivilege(void)

{

DWORD dwSize;

HANDLE hToken;

PTOKEN_MANDATORY_LABEL ptml;

LPWSTR szSid;


::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &hToken);

::GetTokenInformation(hToken, TokenIntegrityLevel, NULL, 0, &dwSize);

ptml = (PTOKEN_MANDATORY_LABEL)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);

try {

::GetTokenInformation(hToken, TokenIntegrityLevel, ptml, dwSize, &dwSize);

::ConvertSidToStringSid(ptml->Label.Sid, &szSid);

try {

return (_wcscmpi(szSid, __TEXT("S-1-16-12288")) == 0);

} __finally {

::LocalFree(szSid);

}

} __finally {

::HeapFree(::GetProcessHeap(), 0, (LPVOID)ptml);

}

return false;

}



BCB6 에서는 PTOKEN_MANDATORY_LABEL 과 ToeknIntegrityLevel 이 없다.

다음 코드를 앞에 추가하면 잘 동작할 것이다.


typedef struct _TOKEN_MANDATORY_LABEL {

    SID_AND_ATTRIBUTES Label;

} TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL;

#define TokenIntegrityLevel ((TOKEN_INFORMATION_CLASS)25)


+ Recent posts