Vista + RegCreateKeyEx = Error(5): Zugriff verweigert ??



  • Hi ho.

    ich habe folgenden Code:

    CString reg_path;
    DWORD err;
    
    reg_path = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\DriveIcons";
    err = RegCreateKeyEx(HKEY_LOCAL_MACHINE, reg_path, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL);
    
    if(err != ERROR_SUCCESS && debug){
        DEBUGFILE << "ERROR 05: Unable to create registry key.\nReturned Error Message: " << debugmsg(err);
    }
    else{
        DEBUGFILE << "Success: Erstellt: " << reg_path << "\n";
    }
    

    Unter Windows 2000 und Windows XP läuft das.
    Egal ob der Key schon existiert, oder erst angelegt wird, es wird immer ERROR_SUCCESS zurückgegeben.

    Unter Vista krieg ich aber im Logfile für 'err' mit 'FormatMessage' dann 'Error(5): Zugriff verweigert' 😡

    Frage:
    Was solln der Schrott und wie kriegt man das weg? 😞

    mfg
    trequ

    PS:
    Sorry, wenn das jetzt das falsche Forum hierfür war, aber ich wusste nicht so recht wohin damit...


  • Mod

    Was für eun UAC Manifest hast Du dem Programm verpasst?

    asInvoker?
    Grundsätzlich hat ein Programm damit unter Vista einen eingeschränkten Zugriff, wenn es nicht als Admin gestartet wurde.

    D.h. Du bekommst niemals Zurgriff auf HKLM wenn Du nicht das Programm als Admin startest. Evtl. musst Du eben requireAdministrator als UAC Manifest setzen.


  • Mod

    Nachtrag. Solch ein Code der die Driveicons manipiliert sollte auch in einem entsprechenden Install Programm untergebracht sein. Und dieses sollte immer Admin-Rechte benötigen!

    Im Jan2007 MSDN Magazin (Englische Version) ist ein guter Artikel dazu!



  • Hi.

    erst mal thx für die Antworten.

    Martin Richter schrieb:

    Was für eun UAC Manifest hast Du dem Programm verpasst?

    asInvoker?
    Grundsätzlich hat ein Programm damit unter Vista einen eingeschränkten Zugriff, wenn es nicht als Admin gestartet wurde.

    D.h. Du bekommst niemals Zurgriff auf HKLM wenn Du nicht das Programm als Admin startest. Evtl. musst Du eben requireAdministrator als UAC Manifest setzen.

    Ich habe inzwischen herausgefunden, dass offenbar in Vista die Rechte anders sind. Gebe ich in Vista dem angemeldetem Benutzer die Rechte an dem übergeordnetem Key, funktioniert alles wieder.

    Frage:
    Ich bin noch recht "frisch" mit C++, komme eher aus der PHP Ecke...
    Ich verwende MS Visual C++ 6 und hab grad irgendwie überhaupt keinen Plan, wie das mit den Manifesten funktioniert.

    Ich habe das hier gefunden:
    https://blogs.msdn.com/shawnfa/archive/2006/04/06/568563.aspx

    Wenn ich das richtig verstanden habe, fügt man das in die Anwendung ein, und anschließend fragt die Anwendung beim Start den User nach Admin-Rechten, wenn er keine hat?

    Wenn ja, wäre ich sehr dankbar, wenn mir jemand erklären könnte, wie man das in eine Anwendung mit VS6 einbaut.

    Martin Richter schrieb:

    Nachtrag. Solch ein Code der die Driveicons manipiliert sollte auch in einem entsprechenden Install Programm untergebracht sein. Und dieses sollte immer Admin-Rechte benötigen!

    Du bist nicht der erste, der mir sagt, das sollte in einen Installer.
    Aber ich verstehe nicht, warum. Die DriveIcons von mir sind für einen Kartenleser. Der bindet 4 Laufwerke ein. Nun kann das sich ja duchaus ändern.
    z.B. wenn jemand (bei abgestecken Kartenleser) ein Netzlaufwerk verbindet, oder jemand die Laufwerkszuordnungen ändert. Dann müsste der Anwender ja immer wieder die Icons per Systemsteuerung -> Software deinstallieren, und dann neu installieren, damit sie wieder richtig sind.
    So hat er eine .exe, startet sie und drückt auf Install/Update. fertig.
    Ist doch einfacher, oder?

    mfg
    trequ


  • Mod

    trequ schrieb:

    Ich habe inzwischen herausgefunden, dass offenbar in Vista die Rechte anders sind. Gebe ich in Vista dem angemeldetem Benutzer die Rechte an dem übergeordnetem Key, funktioniert alles wieder.

    Sicher! Wenn Du Rechte hast ist alles kein Problem. Ansonten Filter die UAC diese Sachen aus.

    trequ schrieb:

    Ich bin noch recht "frisch" mit C++, komme eher aus der PHP Ecke...
    Ich verwende MS Visual C++ 6 und hab grad irgendwie überhaupt keinen Plan, wie das mit den Manifesten funktioniert.

    Manifeste sind XML Einträge, die einer Applikation über die Ressourcen verpasst werden.

    trequ schrieb:

    Wenn ich das richtig verstanden habe, fügt man das in die Anwendung ein, und anschließend fragt die Anwendung beim Start den User nach Admin-Rechten, wenn er keine hat?

    So ist es. Das wäre beu requiredAdministrator so!

    trequ schrieb:

    Wenn ja, wäre ich sehr dankbar, wenn mir jemand erklären könnte, wie man das in eine Anwendung mit VS6 einbaut.

    Das ist wurscht!
    Lies mal diesen Artikel von mir:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-167580.html

    trequ schrieb:

    Dann müsste der Anwender ja immer wieder die Icons per Systemsteuerung -> Software deinstallieren, und dann neu installieren, damit sie wieder richtig sind.
    So hat er eine .exe, startet sie und drückt auf Install/Update. fertig.
    Ist doch einfacher, oder?

    Und für diese Applikation wäre hier ein requiredAdministrator notwendig.



  • Martin Richter schrieb:

    trequ schrieb:

    Wenn ja, wäre ich sehr dankbar, wenn mir jemand erklären könnte, wie man das in eine Anwendung mit VS6 einbaut.

    Das ist wurscht!
    Lies mal diesen Artikel von mir:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-167580.html

    Was ist wurscht?

    Ich glaube wir reden leicht aneinander vorbei gerade...
    Ich kann zwar Sourcecode schreiben, aber wie man so ein Manifest einbindet.. kein Plan.

    Ich kopier den xml Code einfach irgendwo oben bei den Includes in eine .cpp Datei rein?


  • Mod

    Wir reden nicht aneinander vorbei!
    1. Es ist wurscht ob Du VC6 oder ein anderes Entwicklungssystem hast!
    2. In meinem Link wird ein Video angegeben. Da wird dies gezeigt!
    Zudem findest Du hunderte von Links in denen ein Manifest für den XP Stil erzeugt und eingebunden wird.
    Im Detail: xml Datei speichern. In der Resource Datei unter ID CREATEPROCESS_MANIFEST_RESOURCE_ID (1) mit dem Typ RT_MANIFEST (24) als benutzerdefinierte Ressource (In VC6) bzw. Typ Manifest (in VS200x) speichern.


Anmelden zum Antworten