Programm unter Adminkontext ausführen



  • Hi,

    2 Fragen:

    1.) wie kann ich ich einem Programm feststellen, ob der angemeldete benutzer lok. Adminrechte besitzt
    2.) wenn nicht .. wie kann ich ihm erlauben das Programm unter einer Adminkennung auszuführen (ohne system("runas ... ..."))

    viele Grüße



  • 1. man kann eine funktion aufrufen, die nur admins aufrufen dürfen
    --> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/openscmanager.asp
    2. admin einloggen usw. guckst du: http://codeproject.com/system/RunUser.asp



  • #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.


Anmelden zum Antworten