Wie regelt man am besten das mit den Admin-Rechten?



  • Hallo,
    auf Windows 7 (denke das dan auf Vista auch so ist) habe ich jetzt Probleme mit dem Registry Schreiben wegen den fehlenden Admin-Rechten, wie macht man das am besten, das der user nicht immer Rechte Mouse Taste -> Eigenschaften -> Admin Rechte immer zulassen(oder so ähnlich)? Da bin ich ja mit Sicherheit nicht der Einzige der in die Registry schreibt, oder?

    Vielen Dank
    Johannes

    EDIT: Und es währe auch gut wenn da nicht überall in meinem Icon dan das Admin-Zeichen rumhängt, das hatte ich nehmlich auch schon.



  • Du könntest deiner Exe ein Admin Manifest geben,dann werden beim Start immer Admin Rechte angefordert. Oder du prüfst beim Start ob dein Programm Admin Rechte hat und wenn nicht forderst du welche mit

    ShellExecuteA(0,"runas","deinProgramm.exe",0,0,SW_SHOWNORMAL);
    

    an.



  • Danke für die Antwort, wenn ich einfach in den Projekt-Einstellungen oder im Manifest die Admi-Rechte anfordere, dan habe ich ja das icon Problem: das überall das Admin-Zeichen mit drin ist.
    Wie kann ich den prüfen ob ich Admin-Rechte habe?
    Und gibt es vieleicht auch einfach eine Möglichkeit während der Laufzeit des Programmes welche anzufordern wenn man Sie braucht? In die Registry muss man ja nicht immer schreiben, Zumbeispiel bei der Aktivierung muss man das aber dan doch.

    Vielen Dank
    Johannes



  • Johannes251298 schrieb:

    Und gibt es vieleicht auch einfach eine Möglichkeit während der Laufzeit des Programmes welche anzufordern wenn man Sie braucht?

    Viele Anwendungen machen das, indem sie sich einfach selbst neu als admin starten (z.B. via ShellExecuteEx() mit "runas"-Verb)

    Musst du denn überhaupt unbedingt in Teilen der Registry rumschreiben, wo ein nicht elevated-process nicht rumschreiben darf?



  • Admin-Rechte kannst du mit IsUserAnAdmin() prüfen 😃 .
    Wenn dein Programm nicht als Admin ausgeführt wird, startet es sich neu und fordert dabei Admin Rechte an.

    #include <iostream>
    #include <windows.h>
    #include <ShlObj.h>
    #include <string>
    
    using namespace std;
    
    string programm_pfad()
    {
    	char pfad[MAX_PATH] = {};
    	GetModuleFileName(0,pfad,MAX_PATH-1);
    	return pfad;
    }
    
    int main()
    {
    	string pfad = programm_pfad();
    
    	if(IsUserAnAdmin() == false)
    	{
    		ShellExecuteA(0,"runas",pfad.c_str(),0,0,SW_SHOWNORMAL);
    		exit(0);
    	}
    
        return 0;
    }
    


  • Vielen Dank für die Antworten.

    geeky schrieb:

    Musst du denn überhaupt unbedingt in Teilen der Registry rumschreiben, wo ein nicht elevated-process nicht rumschreiben darf?

    In welchen dürfte ich den einfach so rumschreiben? ich dachte das das ohne Admin-Rechte garnicht geht? 😕

    Und wenn ich es mit IsUserAdmin() mache dan kommt trotzdem die Meldung von Windows: Unbekannter Herausgeber möchten Sie das dieses Programm änderungen an ihrem System vornimmt...

    Oder gibt es eine Möglichkeit den "Unbekanten Herausgeber" irgendwie einzustellen?



  • In HKEY_CURRENT_USER\Software darf man glaube ich ganz normal rumschreiben.
    In HKEY_LOCAL_MACHINE\ nicht.

    Ich persönlich bevorzuge aber gute alte *.ini Dateien oder *.xml Dateien für Anwendungsdaten und packe die in einen von Windows dafür vorgesehenen Ordner, da gibt es z.B.:

    msdn schrieb:

    CSIDL_APPDATA / FOLDERID_RoamingAppData
    The file system directory that serves as a common repository for application-specific data. A typical path is C:\Documents and Settings\username\Application Data

    CSIDL_COMMON_APPDATA / FOLDERID_ProgramData
    The file system directory that contains application data for all users. A typical path is C:\Documents and Settings\All Users\Application Data.

    CSIDL_LOCAL_APPDATA / FOLDERID_LocalAppData
    The file system directory that serves as a data repository for local (nonroaming) applications. A typical path is C:\Documents and Settings\username\Local Settings\Application Data

    http://msdn.microsoft.com/de-de/library/windows/desktop/bb762494.aspx
    http://msdn.microsoft.com/de-de/library/windows/desktop/bb762181.aspx
    http://msdn.microsoft.com/de-de/library/windows/desktop/bb762188.aspx



  • Aber LOCAL_USER ist ja dan für jeden User anders, und ne Xml oder Ini datei ist gleich abgeändert, da gibt's kein Groses Versteck so wie in der Registry.

    Mir ist auch noch eingefallen: kann man in den Resources vierleicht Text abspeichern, ändern nachher und so? das währe dan nehmlich auch noch eine Möglichkeit.



  • Johannes251298 schrieb:

    Oder gibt es eine Möglichkeit den "Unbekanten Herausgeber" irgendwie einzustellen?

    Dafür muss deine Anwendung eine digitale Signatur besitzen.
    Kann man bei verisign, thawthe, etc. käuflich erwerben.
    Du kannst z.B. nach "makecert" und "signtool" googlen, dann wird man Tutorials finden, wo man sieht wie das mit einem Testzertifikat abläuft.

    Johannes251298 schrieb:

    Aber LOCAL_USER ist ja dan für jeden User anders, und ne Xml oder Ini datei ist gleich abgeändert, da gibt's kein Groses Versteck so wie in der Registry.

    Naja, wer in %APPDATA%, etc. rumguckt, der schaut auch in der Registry wenn er da nicht fündig wird. Quasi beides keine besonderen Verstecke 😉

    Johannes251298 schrieb:

    Mir ist auch noch eingefallen: kann man in den Resources vierleicht Text abspeichern, ändern nachher und so? das währe dan nehmlich auch noch eine Möglichkeit.

    Ich glaube da gibt es UpdateResource() oder so für - Da schlagen allerdings Virenscanner gerne mal Alarm 😉
    (Digitale Signaturen würden dabei außerdem auch kaputt gehen)



  • geeky schrieb:

    Johannes251298 schrieb:

    Oder gibt es eine Möglichkeit den "Unbekanten Herausgeber" irgendwie einzustellen?

    Dafür muss deine Anwendung eine digitale Signatur besitzen.
    Kann man bei verisign, thawthe, etc. käuflich erwerben.
    Du kannst z.B. nach "makecert" und "signtool" googlen, dann wird man Tutorials finden, wo man sieht wie das mit einem Testzertifikat abläuft.

    Man kann sich auch selbst ein Zertifikat erstellen.
    Ein "anerkanntes" braucht man IIRC nur wenn man einen weissen Dialog statt einem orangen haben will.
    (Bzw. natürlich auch für 64 bittige Treiber und für ActiveX Zeugs im Browser -- es sei denn der User hätte den Browser entsprechend umkonfiguriert, was wohl hoffentlich kaum jmd. tun wird)

    @david_k
    Ich hatte gedacht dass wir das Zeitalter der MBCS Strings hinter uns haben. Wie man sich täuschen kann.


Anmelden zum Antworten