Registry >= Win Vista: nach HKEY_CURRENT_USER schreiben, oder UAC Elevate Button



  • Hallo,

    ich versuche in die Registry zu schreiben um einen Autostarteintrag anzulegen (HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run), jedoch klappt das nicht mit aktivierten UAC. Wenn ich als Administrator ausführe geht es natürlich.
    Wie kann ich einen Autostart-Eintrag anlegen ohne Admin-Privilegien bzw. ohne Admin-Manifest?

    Alternativ würde auch ein Button gehen, der einmalig die Privilegien einfordert, aber halt nicht zum Programmstart.

    Ich arbeite mit BCB6.

    Was kann man in so einem Fall tun?



  • Hallo

    Mit der WinAPI kannst du den User nach Admin-Rechten fragen.

    bis bald
    akari



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Das verschieben nach WinApi finde ich nicht so toll, denn ich suche mehr oder weniger einen BCB6 oder Delphi7 Port weil mir die richtigen Header fehlen.

    Das habe ich gefunden, aber die Hälfte der Deklarationen werden nicht gefunden:
    http://code.msdn.microsoft.com/windowsdesktop/CppUACSelfElevation-5bfc52dd

    Warum kann ich nicht in den USER-Bereich der Registry schreiben? Das soll doch gehen? Hmmm...



  • SO wie ich das kenne, brauchst du für das Schreiben in HKEY_CURRENT_USER keine Administratorrechte. Hast du schon überprüft, ob du vielleicht nicht versehentlich in HKEY_LOCAL_MACHINE schreibst?

    norbertwill



  • Was bekommst du denn mit GetLastError() zurück?



  • Das ist mein Code der nicht funktioniert:

    void TfrmMain::writeStartupEntry()
    {
        AnsiString S;
    
        TRegistry *Reg = new TRegistry(KEY_ALL_ACCESS | KEY_WOW64_32KEY);
        try
        {
            Reg->RootKey = HKEY_CURRENT_USER;
            Reg->Access = /*KEY_WRITE |/* KEY_SET_VALUE |*/ KEY_ALL_ACCESS | KEY_WOW64_32KEY;
    
            if (Reg->OpenKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", false))
            {
                try
                {
                    Reg->WriteString("<app>", Application->ExeName + " FORCE");
                    Reg->CloseKey();
                }
                catch (...)
                {
                    MessageBox(NULL, "Autostart-Funktion konnte nicht installiert werden", "Fehler", MB_OK | MB_ICONERROR);
                }
            }
        }
        __finally
        {
            delete Reg;
        }
    
        return;
    }
    

    Das hier funktoniert:

    Reg->RootKey = HKEY_CURRENT_USER;
            if (Reg->OpenKey("SOFTWARE\\xxx\\<app>", true))
            {
    

    Liegt es am Pfad?


  • Mod

    1. Schmeiß bitte den KEY_WOW64_32KEY raus. Warum das? HKCU gibt es nur einmal.
    2. Gewöhn Dich daran nicht KEY_ALL_ACCESS zu verwenden, sondern das was Du möchtest. Also KEY_READ und KEY_WRITE!



  • Ich würde den Schlüssel an deiner Stelle mit KEY_SET_VALUE statt mit KEY_ALL_ACCESS zu öffnen.
    Du solltest dir angewöhnen immer nur die Rechte, die du auch wirklich benötigst anzufordern.

    norbertwill



  • akari schrieb:

    Hallo

    Mit der WinAPI kannst du den User nach Admin-Rechten fragen.

    bis bald
    akari

    Wie geht das?



  • Indem du ShellExecute mit "runas" als lpOperation und mit dem Namen deiner Anwendung als lpFile aufrufst.
    norbertwi



  • Ich benutze jetzt nur KEY_WRITE, die anderen hatte ich alle testhalber weil es nicht funktioniert.

    Es funktioniert trotzdem nicht, mit VCL oder WinAPI -> Access Denied. Der Schlüssel lässt sich nicht öffen.

    Habe auch die Schnauze voll. Habe mir eine Helper-EXE gemacht mit Admin-Privilegien (und dem gleichen Source zum Schreiben in die REG!!) und damit gehts.

    Ich hatte meine COMODO Firewall in Verdacht, aber selbst nach dem Deinstallieren geht es nicht. 😡

    Noch Vorschläge dazu? Wie gesagt Schreiben nur nach "Software" geht problemlos.



  • Hast du dir mal die Permissions auf dem Pfad angesehen (Regedit -> Key auswählen -> Permissions...).
    Bei mir würden die das zwar erlauben, aber vielleicht is dein System ja etwas komisch.

    Ansonsten... hast du vielleicht irgend eine "Sicherheitssoftware" (Virenscanner/Firewall/...) laufen? Vielleicht funkt dir die dazwischen.
    EDIT: OK, die Frage erübrigt sich wohl - hab erst jetzt das mit der COMODO gelesen. /EDIT



  • int02h schrieb:

    Das ist mein Code der nicht funktioniert:

    void TfrmMain::writeStartupEntry()
    {
        AnsiString S;
    
        TRegistry *Reg = new TRegistry(KEY_ALL_ACCESS | KEY_WOW64_32KEY);
    
    ...
    

    Das scheint nur mit RAD Studio, Embarcadero, Borland zu laufen. VisualStudio kann weder mit AnsiString noch
    mit der TRegistry Klasse was anfangen.

    Was die danach aufgerufenen Methoden machen ist nicht klar.

    Ich würde anraten den Code etwas unabhängiger von der Entwicklungsumgebung zu schreiben. Hier im WinAPI-Forum wäre die WinAPI die erwartete Schnittstelle.

    So gehört der Code in VCL-Forum und nicht hierher.



  • hustbaer schrieb:

    Hast du dir mal die Permissions auf dem Pfad angesehen (Regedit -> Key auswählen -> Permissions...).
    Bei mir würden die das zwar erlauben, aber vielleicht is dein System ja etwas komisch.

    Danke für den Tipp. "Jeder" darf nur lesen und mein Benutzer-Name fehlt. Kann sein das es eine Härtungsmaßnahme der Comodo war. (???)
    Ich bleibe bei der Helper-Exe, man weiß nie wie die Lage beim Benutzer ist.



  • int02h schrieb:

    "Jeder" darf nur lesen und mein Benutzer-Name fehlt. Kann sein das es eine Härtungsmaßnahme der Comodo war. (???)

    Könnte ich mir schon vorstellen.


Anmelden zum Antworten