Ici je charge en dynamique les fonctions pour que puisse tourner sur les winbebes. Tu adaptes en + simple si tu vises seulement les noyaux NT.
typedef BOOL (__stdcall *pOPENPROCESSTOKEN) (HANDLE,DWORD,PHANDLE); typedef BOOL (__stdcall *pGETTOKENINFORMATION) (HANDLE,TOKEN_INFORMATION_CLASS,LPVOID,DWORD,PDWORD); typedef BOOL (__stdcall *pALLOCINITSID) (PSID_IDENTIFIER_AUTHORITY,BYTE,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,PSID*); typedef BOOL (__stdcall *pEQUALSID) (PSID,PSID); typedef PVOID (__stdcall *pFREESID) (PSID);
DWORD IsUserAdmin() // RETOURNE != 0 SI APPELANT EST ADMIN { HANDLE htoken; BYTE infos[1024]; PTOKEN_GROUPS pgroups = (PTOKEN_GROUPS)infos; DWORD dwlen; PSID psidAdmins; SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY; BOOL b = 0; pOPENPROCESSTOKEN pOPTK; pGETTOKENINFORMATION pGTINF; pALLOCINITSID pALLIS; pEQUALSID pEQSID; pFREESID pFRSD; HINSTANCE hdll = LoadLibrary("Advapi32.dll"); if(!hdll) return 0; pOPTK = (pOPENPROCESSTOKEN) GetProcAddress(hdll, "OpenProcessToken"); if(!pOPTK) goto relDll; pGTINF = (pGETTOKENINFORMATION) GetProcAddress(hdll, "GetTokenInformation"); if(!pGTINF) goto relDll; if(!pOPTK(GetCurrentProcess(),TOKEN_READ,&htoken)) goto relDll; b = pGTINF(htoken,TokenGroups,infos, 1024, &dwlen); CloseHandle(htoken); if(b) goto relDll; pALLIS = (pALLOCINITSID) GetProcAddress(hdll, "AllocateAndInitializeSid"); if(!pALLIS) goto relDll; pEQSID = (pEQUALSID) GetProcAddress(hdll, "EqualSid"); if(!pEQSID) goto relDll; pFRSD = (pFREESID) GetProcAddress(hdll, "FreeSid"); if(!pFRSD) goto relDll; if(!pALLIS(&siaNtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &psidAdmins)) goto relDll; for(UINT x=0; x < pgroups->GroupCount; x++) { if(pEQSID(psidAdmins, pgroups->Groups[x].Sid)) {b = 1; break;} } pFRSD(&psidAdmins); relDll: FreeLibrary(hdll); return b; }
ciao... BruNews, MVP VC++
|