[Gelöst] Herausfinden, ob Anwendung als Administrator ausgeführt wird?



  • Hallo,

    ist es möglich herauszufinden, ob das Programm als Administrator ausgeführt wird, also die Information einzuholen und ggf. darauf hinzuweisen, dass diese Rechte benötigt werden?

    Ich habe leider nichts dazu gefunden. Alles, was ich finde, ist, wie man ein Programm zur Laufzeit per runas-Methode als Administrator ausführen lassen kann (sofern der Benutzer zustimmt und ggf. Anmeldedaten eingibt). Aber mir geht es erst einmal darum, den Ist-Zustand zu ermitteln.

    Grüße
    heini

    Edit: Ich bin mir nicht sicher, ob das ins VCL-Forum überhaupt gehört, aber ich nutze halt den Borland C++ Builder 6. Vllt. ist das aber auch eine reine WinAPI-Sache?





  • Danke, der Code hat zwar so 1:1 nicht funktioniert, im BCB, aber mit gewissen Modifizierungen war er zumindest kompilierfähig. Allerdings funktioniert das nicht (getestet auf Windows 10):

    // Im Header vor der Form-Klasse:
    typedef struct _TOKEN_ELEVATION {
      DWORD TokenIsElevated;
    } TOKEN_ELEVATION, *PTOKEN_ELEVATION;
    
    //In der Form-Klasse unter _published folgendermassen deklariert:
    bool __fastcall IsElevated();
    
    // In der Unit:
    bool __fastcall TfMain::IsElevated() {
        bool fRet = false;
        HANDLE hToken = NULL;
        if( OpenProcessToken( GetCurrentProcess( ),TOKEN_QUERY,&hToken ) ) {
            TOKEN_ELEVATION Elevation;
            TOKEN_INFORMATION_CLASS TokenElevation;
            DWORD cbSize = sizeof( TOKEN_ELEVATION );
            if( GetTokenInformation( hToken, TokenElevation, &Elevation, sizeof( Elevation ), &cbSize ) ) {
                fRet = Elevation.TokenIsElevated;
            }
        }
        if( hToken ) {
            CloseHandle( hToken );
        }
        return fRet;
    }
    
    //Im OnActivate-Ereignis der Form:
            if(!IsElevated())
            {
                    MsgBox("No administrative privileges","Attention!\r\nYou're running this programm without administrative permissions. It means that it won't be able to create RAW packets for ICMP requests.",MSG_ICON_INFO|MSG_BTN_CANCEL);
                    //MsgBox ist meine eigene Implementierung von Dialogfenstern, zwecks Corporate Design.
            }
    

    Verhalten: Egal, ob ich das Programm als Administrator ausführe oder nicht, es erscheint die Meldung, es würde ohne administrativen Rechten ausgeführt.

    Was mache ich falsch?



  • Warte mal, bis es ins WinApi Forum verschoben wird, da gibts paar mehr Leute, die sich auskennen. Ich hab sowas zwar schon mal in der Arbeit gemacht, ist aber schon eine Weile her.



  • Ich habe jetzt folgendes gefunden und das scheint zu funktionieren:

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa376389%28v=vs.85%29.aspx

    Implementierung: Die Funktion muss so aussehen...

    bool __fastcall TfMain::IsElevated() {
    bool b;
    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
    PSID AdministratorsGroup;
    b = AllocateAndInitializeSid(
        &NtAuthority,
        2,
        SECURITY_BUILTIN_DOMAIN_RID,
        DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0,
        &AdministratorsGroup);
    if(b)
    {
        if (!CheckTokenMembership( NULL, AdministratorsGroup, (int*)&b))
        {
             b = false;
        }
        FreeSid(AdministratorsGroup);
    }
    
    return(b);
    }
    

    Und man kann sich das struct vor der Form-Klasse sparen.

    Ich teste das noch unter verschiedneen Windows-Versionen und gebe noch einmal Bescheid, sollte ich dabei Fehler feststellen.

    Vielen Dank soweit.



  • Also wenn dein Programm ohne Adminrechte nicht funktioniert, sollten diese per Manifest angefordert werden, dies bedeutet Programm startet ohne Adminrechte gar nicht.

    Um den Status zu prüfen gibt es verschiedene Varianten, und unter Win7 ist auch der UAC Level sehr interessant.
    Ich habe dies als Basis verwendet: https://code.msdn.microsoft.com/windowsapps/CppUACSelfElevation-5bfc52dd#content



  • Danke für den Hinweis.

    In meinem konkreten Fall wird noch weiter gedacht: Die derzeit angewandte Methode erfordert zwar administrative Rechte, jedoch plane ich eine andere Methode einzuführen, die das nicht erfordert. Sobald ich das getan habe, erscheint der Hinweis nur noch, wenn per Config diese Methode gewählt wurde, die administrative Rechte benötigt, das Programm aber ohne derselben gestartet wurde. Dann kann der Benutzer wählen, ob er zur anderen Methode wechseln möchte (für diesen Programmstart) oder nicht.

    Gegen das Manifest spricht aber noch ein Punkt: Wenn das Programm z. B. in einer Remote-Sitzung ausgeführt wird, per Teamviewer, und ich per Manifest administrative Rechte anfordere, während Teamviewer Quicksupport z. B. keine solche bekommen hat, dann ist die Sitzung für die Zeit der UAC-Abfrage gesperrt. Sitzt keiner vor dem Bildschirm, kann man sich gleich wieder schlafen legen.

    Wenn ich aber im Programm das nur abtaste und einen Hinweis liefere, kann der Supporter selbst noch einmal überlegen, wie er weiter vorgehen möchte (und ihm die andere MEthode nicht sogar schon ausreicht).

    Das ist vielleicht über viele Ecken gedacht, aber ich möchte das Programm so nützlich, wie nur irgend möglich gestalten. Und da beziehe ich auch solche Dinge mit ein.

    Nichts desto trotz schaue ich mir das mal grundsätzlich an, wie das mit dem Manifest funktioniert. Kann ich vllt. für andere Applikationen brauchen.

    VG, heini


Log in to reply