Adminrechte prüfen



  • Hallo,
    Habe einen kleinen Algorithmus geschrieben, der prüfen soll, ob das Programm mit Adminrechten gestartet wurde. Dies geschieht durch das simple öffnen der Hosts Datei. Anhand des Rückgabewertes wird dann geprüft, ob der Nutzer Administrator ist. Jedoch gibt es einige Programme, wie Anti Viren Programme oder Spybot Search and Destroy, die wohl etwas dagegen haben und keinen Zugriff zulassen. So kann das Programm trotz Adminrechten nicht ausgeführt werden. Die Adminrechte sind jedoch zwingend für die Ausführung erforderlich. Das ganze soll am Schluss eine Art automatische Installation für alle möglichen Programme werden. (http://de.wikipedia.org/wiki/Unbeaufsichtigte_Installation) Kann mir jemand Alternativen nennen, wie ich noch überprüfen kann, ob der Nutzer Administrator ist? Hier mein bisheriger Code:

    //Auf Adminrechte prüfen
    	SetFileAttributes("C:\\Windows\\System32\\drivers\\etc\\hosts",FILE_ATTRIBUTE_NORMAL);
    
    fstream a;
    a.open("C:\\Windows\\System32\\drivers\\etc\\hosts", ios::out | ios::app);
    
    if (a == NULL)
    {
    	a.close();
    	FreeConsole();
    MessageBox(NULL, "Damit dieses Programm ordnungsgemäß funktioniert, sind Adminrechte nötig!", "InstallMe", MB_ICONERROR);
    return 0;
    }else{
    a.close();
    }
    




  • Wie wär's denn mit IsUserAnAdmin()?



  • Habe mir mal den Source geladen und in ein Tesprojekt gepackt. Jedoch wird folgendes ausgegeben: "NetUserGetInfo(): The current User is an Administrator". Jedoch habe ich die Datei ohne Adminrechten unter Windows 7 gestartet. Warum dies?



  • HighLigerBiMBam schrieb:

    http://win32.mvps.org/security/is_admin.html

    Diese Funktonsweise dieses Codes ist veraltet und unzuverlässig.
    Dieser Code berücksichtigt nicht, dass es ein sogenanntes Restricted Token geben kann.
    Theoretisch ist dies schon seit Windows 2000 möglich.
    Nur richtig problematisch wird dies unter Vista und 7, denn diese Restricted Token werden hier auch entsprechend verwendet.

    Marcus Humann schrieb:

    Wie wär's denn mit IsUserAnAdmin()?

    Also, ich würde lieber CheckTokenMembership() http://msdn.microsoft.com/en-us/library/aa376389.aspx verwenden.
    Das ist sauberer und Microsoft garantiert dies auch in zukünftigen Versionen (im Gegensatz zu IsUserAnAdmin() !!!)

    Im Link ist auch ein Beispiel dabei, um festzustellen, ob der User Mitglied einer Administrators local group ist.

    HTH,
    Martin


  • Mod

    Es gibt einen unterschied ob Deine aktuelle Session den Amdin Token hat, oder ob Dein User Accout einen Admin Token haben kann.

    http://blog.m-ri.de/index.php/2007/03/15/ermitteln-ob-ein-prozess-als-administrator-lauft-oder-nicht/



  • Marcus Humann schrieb:

    Wie wär's denn mit IsUserAnAdmin()?

    Habe dies nochmal ausprobiert:

    #include <Windows.h>
    #include <iostream>
    #include <Shlobj.h>
    using namespace std;
    int main()
    {
    if (BOOL IsUserAnAdmin = true)
    {
    	cout << "Adminrechte vorhaden" << endl;
    	cin.get();
    	return 0;
    }else{
    	cout << "Adminrechte nicht vorhanden" << endl;
    	cin.get();
    	return 0;
    }
    return 0;
    }
    

    Auch hier spuckt das Programm "Adminrechte vorhanden" aus, obwohl keine Adminrechte vorhanden sind.



  • Du weißt schon, wie man Funktionen aufruft oder?



  • Zeile 7 muss so lauten:

    if(IsUserAnAdmin())
    

    Ein " == true " ist hier überflüssig, falsch wäre es jedoch nicht.
    (Man beachte auch die beiden Gleichheitszeichen).

    Ich rate dir, dich nochmal mit den Grundlagen zu befassen.

    MfG, Jochen


Log in to reply