Adminrechte ergattern - Vista.



  • Hallo,

    Mein program ( in C, ohne schnickschnack) schreibt und liest aus einer Datei die im gleichen Verzeichniss wie die exe steht. Eigentlich kein Problem, aber wenn die Datei in c:\program files\folder steht kann nicht geschrieben werden.

    Viele Programme fragen nach adminrechten, so das der user entscheiden kann, was gemacht wird.
    Wie kann man dieses Verhalten in C(falls möglich) erreichen.

    "code":

    getAdminRights();
    writeFile();
    releaseAdminRights();
    

    oder bessere Variante

    doINeedAdminrights(writeFile());
    getAdminRights();
    writeFile();
    releaseAdminRights();
    

    Ich brauche ein Beispiel, beziehungsweise das geignete Stichwort, damit google mir geschickt weiterhilft.



  • Nachträglich mit Admin-Rechten hantieren:
    Developing Applications that Require Administrator Privilege

    Die meisten scheinen mir momentan die "ShellExecute mit runas-verb"-Variante zu wählen: D.h. einfach sich selbst über ShellExecute dank "runas"-Verb mit Admin-Rechten starten und als Kommandozeilen-Argument mit angeben welcher Dialog/welche Aktion mit Admin-Rechten durchgeführt werden soll. Wenn die Aktion fertig ist, beendet sich das Programm mit Admin-Rechten und es geht im 1. Programm weiter.

    ------

    Sofern die Daten nicht tatsächlich zwangsweise im Programme-Ordner rumliegen müssen:
    1. Gucken ob die Datei im Anwendungsdatenordner liegt und ggf. die benutzen, falls nicht:
    2. Versuchen die Datei direkt im Programme-Ordner zu beschreiben und wenn es nicht klappt:
    3. Datei in einen passenden Anwendungsdaten-Ordner (der dafür ohnehin gedacht ist) kopieren und dann dort darauf zugreifen.

    An den Pfad zum Anwendungsdatenordner kommt man über:
    SHGetSpecialFolderPath

    Die verschiedenen Anwendungsdaten-Ordner wären (Win7-Standardordner):
    CSIDL_APPDATA - C:\Users\Username\AppData\Roaming
    Nicht Rechner gebunden ("Roaming User Profiles"). Diesen Ordner verwenden die meisten Programme.

    CSIDL_LOCAL_APPDATA - C:\Users\Username\AppData\Local
    Rechnergebunden

    CSIDL_COMMON_APPDATA - C:\Users\Default\AppData\Local
    Rechnergebunden und da kann jeder Benutzer drauf zugreifen

    (Die Anwendungsdaten-Ordner werden von gescheiter Backup-Software und dem Windows-eigenen Datensicherungstool mitgesichert)



  • Über das /MANIFESTUAC Linker Flag kannst du den erforderlichen UAC level für deine Anwendung einstellen. Es gibt keinen Weg den UAC Privileg Level eines laufenden Prozesses zu erhöhen.



  • Wie jetzt? Man kann einen Prozess, der nicht elevated ist, nachträglich Dinge tun lassen, die man nur elevated tun kann? Ein COM Objekt erstellen?
    Wie was? Hilfe



  • Nur das COM-Objekt hat mehr Rechte, nicht der Prozess selbst.
    Außerdem kommt natürlich der UAC-Dialog.
    http://msdn.microsoft.com/en-us/library/ms679687.aspx


  • Mod

    geeky schrieb:

    Nur das COM-Objekt hat mehr Rechte, nicht der Prozess selbst.

    Und das COM Objekt muss Out-Of-Process sein!



  • Lösung: eine zweite .exe die per system() aufgerufen wird.
    Diese exe wird min einem manifest ausgestattet, so dass sie als admin startet.

    Danke für die hilfe, hat mich weit gebracht.


  • Mod


Anmelden zum Antworten