M
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <Accctrl.h>
#include <Aclapi.h>
BOOL IsAdmin(PBOOL pbresult) {
DWORD dwbufsize = 0;
BOOL bSuccess = FALSE;
PTOKEN_GROUPS grouplist = NULL;
HANDLE hAccessToken = NULL;
PSID pSID = NULL;
*pbresult = FALSE;
SID_IDENTIFIER_AUTHORITY auth = SECURITY_NT_AUTHORITY;
//Prozesstoken öffnen
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hAccessToken)) {
goto exit;
}
//Gruppenliste des Tokens abrufen
if (!GetTokenInformation(hAccessToken,TokenGroups,grouplist,0,&dwbufsize)) {
if (GetLastError()!=ERROR_INSUFFICIENT_BUFFER) {
goto exit;
}
grouplist = (PTOKEN_GROUPS) new CHAR[dwbufsize];
if (!GetTokenInformation(hAccessToken,TokenGroups,grouplist,dwbufsize,&dwbufsize)) {
goto exit;
}
} else {
goto exit;
}
//SID erzeugen, die die gewünschte Gruppe repräsentiert
if (!AllocateAndInitializeSid(&auth,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,0,0,0,0,0,0,&pSID)) {
goto exit;
}
//Prüfen, ob die gewünschte Gruppe in der Gruppenliste des Tokens enthalten ist
for (UINT i=0;i<grouplist->GroupCount;i++) {
if (EqualSid(grouplist->Groups[i].Sid,pSID)) {
*pbresult = TRUE;
bSuccess = TRUE;
goto exit;
}
}
exit:
if (grouplist) {delete[] grouplist;}
if (hAccessToken) {CloseHandle(hAccessToken);}
if (pSID) {FreeSid(pSID);}
#if defined(_DEBUG) && defined(_CONSOLE)
if (!bSuccess) {std::cout << "Fehler beim Aufruf von " __FUNCTION__ " - Fehlercode:" << GetLastError();}
#endif
return bSuccess;
}
Zu der Sache mit der Erlangung von Administratorrechten musst du den Benutzer meines Wissens nach zuerst mit LogonUser anmelden und kannst dann das SecurityToken dieses Benutzers für CreateProcessAsUser nutzen. Die genaue Vorgehensweise, das bei einem laufenden Prozess zu machen, ist mir nicht bekannt.