C++ Application unter Vista (Registry Zugriff)



  • Heyho liebe Community,
    Ich hoffe ich bin hier im richtigen Forum gelandet, anderweitig, bitte verschieben.

    Ich habe folgendes Problem und bin nach endlosem googeln, suchen und probieren, auf keine Lösung gestoßen.
    Undzwar habe ich eine Anwendung, welche Einträge bzw. einen Eintrag in die Registry vornimmt. Dieser Eintrag soll unter dem HKEY HKEY_LOCAL_MACHINE getätigt werden.
    Unter WinXP funktioniert alles reibungslos, nur wenn ichs unter Vista ausprobieren, dann versucht er vergebens auf diesen Zweig der Registry zuzugreifen bzw. einen neuen Schlüssel und ein neues Value hinzuzufügen.
    Nun bin ich natürlich schon bereits auf das Thema "der VS6 Anwendung ein Manifest für die UAC hinzufügen" gestoßen, jedoch brachte das manuelle Hinzufügen eines Manifestes nicht den erwünschten Erfolg, zudem ich mir hier auch nicht weiter zu helfen wußte, dass Manifest mit einem notepad erstellt habe und es einfach in das gleiche Verzeichnis, in welchem auch die .exe Datei liegt, gelegt habe. Ob ich dieses Manifest noch irgendwie einbinden muss bzw. wie ich das machen kann unter VS6 weiß ich nicht, dazu waren auch keine Info's zu ergattern. Nun hilft mir der VirtualStore leider auch nicht weiter, weil dieser ja leider User spezifisch ist, oder irre ich?
    Ich habe es auch bereits mit ausgeschalteter UAC versucht, jedoch erhielt ich immernoch keinen Zugriff auf die Registry zur Bearbeitung.
    Nun mußte ich aber bei einem Blick in den SOFTWARE Zweig des HKEY_LOCAL_MACHINE Root-Keys feststellen, dass andere Anwendungen wie z.B. der Adobe, der VMWare Inc. oder JavaSoft es gelungen war einen Eintrag dort zu erstellen.
    Hat jemand eine Idee bzw. einen Ansatz um sich der Administratorrechte zu bemächtigen und Einträge in die Registry zu machen?
    Der Account unter dem das Programm läuft verfügt ebenfalls über Administratorrechte.

    Ich hoffe mein Problem gut beschrieben zu haben und auf Antworten und hilfreiche Vorschläge eurerseits!

    Im Voraus bereits vielen Dank,

    Liebe Grüße,
    inva



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ 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.



  • inva schrieb:

    Nun mußte ich aber bei einem Blick in den SOFTWARE Zweig des HKEY_LOCAL_MACHINE Root-Keys feststellen, dass andere Anwendungen wie z.B. der Adobe, der VMWare Inc. oder JavaSoft es gelungen war einen Eintrag dort zu erstellen.

    Wenn man es richtig macht, geht es auch. 😉

    Wie viel Bit hat dein Programm und wie viel Bit dein Vista?



  • Luckie schrieb:

    Wenn man es richtig macht, geht es auch. 😉

    Wie viel Bit hat dein Programm und wie viel Bit dein Vista?

    Mein Vista hat 32 Bit, und da das Programm schon etwas älter ist, ich es aber leider nicht mit implementiert habe, sondern es hauptsächlich nur flott für Vista machen muss, würde ich mal vermuten das es sich hierbei auch um ein 32Bit-Programm handelt. Zwar hat das ja nicht zwingend was mit dem Alter zu tun, aber da wohl ein "Standartprojekt" und ne "Standartimplementierung" war würde ich auf 32Bit tippen. Mir wäre auch leider nicht bewußt wo ich das nachschauen könnte.

    *edit*
    Es handelt sich sicher um eine 32Bit Anwendung 🙂

    Nunja, ich glaube ja das ich alles richtig gemacht habe, nur weiß ich eben, dass mir die Vista ristriktionen im Weg stehen.



  • Du brauchst Admin Rechte, dann kannst Du da schreiben (also "requireAdministrator" im Vista Manifest angeben).

    Oder Du lässt Deinen Installer diese Einträge machen.



  • Jochen Kalmbach schrieb:

    Du brauchst Admin Rechte, dann kannst Du da schreiben (also "requireAdministrator" im Vista Manifest angeben).

    Oder Du lässt Deinen Installer diese Einträge machen.

    Wie gesagt, dessen bin ich mir bewußt und habe auch bereits ein Manifest angefertigt, was eigentlich genau dies implementiert, aber jedoch funktioniert es mit dem Manifest genauso wenig. Wie gesagt, verwende ich Visual Studio 6 und kanns auch nicht nach Visual Studio 2005 portieren.
    Das es im 2005er Studio eine Einstellung dafür gibt weiß ich und mein Manifest was ich mir manuell für meine Anwendung erstellt habe ist auch richtig, meiner Ansicht nach. Aber wie bereits gesagt tut sich da bei mir die Frage auf, reicht es wenn ich die Manifestdatei einfach ins gleiche Verzeichnis tue, in welchem auch die .exe liegt oder muss ich es einbinden ins Programm, falls ja wie?

    Hier mein Manifest:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
      <assemblyIdentity version="1.0.0.0"
         processorArchitecture="X86"
         name="ApplicationName"
         type="win32"/> 
      <description>Description of your application</description> 
      <!-- Identify the application security requirements. -->
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
            </requestedPrivileges>
        </security>
      </trustInfo>
    </assembly>
    

    Die Namensgebung ist konsistent, was Anwendungsnamen, Dateinamen etc. pp anbelangt.
    Wie ich das Manifest "einbinde" habe ich mitlerweile rausbekommen.
    Ich erhalte dennoch mit dem obenstehendem Manifest keinen Zugriff auf die Registry, bzw. keinen Schreibzugriff auf HKEY_LOCAL_MACHINE\SOFTWARE.

    Grüße,



  • WIE hast Du es denn eingebunden?
    Du musst es als Resource einbinden...

    resource.h

    #define IDR_MANIFEST 1
    #define RT_MANIFEST 24
    

    res.rc2:

    IDR_MANIFEST RT_MANIFEST MOVEABLE PURE "res\YourAppName.manifest"
    

    Auch ist Deine manifest-Datei falsch, da das "trustInfo" den falschen Namespace hat! Korrekt wäre:

    <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
    <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel level='requireAdministrator' uiAccess='false' />
          </requestedPrivileges>
        </security>
      </trustInfo>
    </assembly>
    


  • Vielen Dank erstmal für eure zahl- und hilfreichen Antworten.

    Jochen Kalmbach schrieb:

    WIE hast Du es denn eingebunden?
    Du musst es als Resource einbinden...

    Ja, das war auch mein letzter Versuch den ich unternommen hatte, es als resource einzubinden. Leider hat das auch nicht funktioniert.
    Ich hatte dabei mein Manifest, danke fürs berichtigen dessen, und folgenden Code eingefügt unter Propertiers - "Compile-time directives" Box in den Resource includes

    CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "AppName.Manifest"
    

    Leider mußt ich auch feststellen, dass ich gar keine .rc2 Datei habe.
    Bei dem Projekt wurden alle Resourcen in ein extra Projekt ausgelagert.
    Aber selbst dort läßt sich keine .rc2 Datei finden.

    Aber ich werds erstmal mit dem berichtigtem Manifest probieren.

    Grüße,


  • Mod

    Hast Du eine externe Mainfest Datei, die wie das Programm heißt? Oder willst Du das Manifest einbetten.

    Wenn Du die EXE öffnest im Ressourcen-Editor. Ist das Manifest dann sichtbar?



  • Martin Richter schrieb:

    Hast Du eine externe Mainfest Datei, die wie das Programm heißt? Oder willst Du das Manifest einbetten.

    Wenn Du die EXE öffnest im Ressourcen-Editor. Ist das Manifest dann sichtbar?

    Hallo,
    Ich hatte bisher immer eine externe Manifestdatei die den Namen der Applikation hatte (AppName.exe.Manifest). Es war also nicht direkt im Code eingebettet.

    Grüße,

    *edit*
    Ich habs gerade mal, wie oben beschrieben, nur mit dem korrigiertem Manifest ausprobiert und ich erhalte immernoch keinen Zugriff auf den Registryzweig 😞



  • Kommt denn die UAC-Meldung beim Start?



  • Was sagt denn GetLastError eigentlich?



  • sri schrieb:

    Kommt denn die UAC-Meldung beim Start?

    Ja.

    Luckie schrieb:

    Was sagt denn GetLastError eigentlich?

    GetLastError() sagt mir das der Vorgang erfolgreich abgeschlossen wurde, was aber nicht sein kann, weil mir die Messagebox, in welcher dies angezeigt wird, gar nicht erst angezeigt werden würde, wenn die Funktion, welche den RegistryKey öffnet, TRUE zurückliefern würde.

    -> Die Funktion, welche einen RegistryKey öffnet, liefert FALSE zurück, daher wird mir eine Messagebox angezeigt, in welcher der Fehlercode als String von GetLastError() ausgegeben wird.



  • Na, dann vermute ich mal stark, dass Du ein Vista x64 hast und Deine Anwendung x86 ist...
    Dann lies mal:
    http://www.codeproject.com/KB/system/Reflection.aspx



  • Jochen Kalmbach schrieb:

    Na, dann vermute ich mal stark, dass Du ein Vista x64 hast und Deine Anwendung x86 ist...
    Dann lies mal:
    http://www.codeproject.com/KB/system/Reflection.aspx

    Also, ich weiß nicht, unter Computer -> Eigenschaften steht aber explizit das es sich um ein 32Bit Betriebssystem handelt 😕



  • Wie lautet denn der Code zum Öffnen des Schlüssels?



  • sri schrieb:

    Wie lautet denn der Code zum Öffnen des Schlüssels?

    if ( RegOpenKeyEx(
            kHKey,							// handle to an open key
            lpSubKey,							// address of subkey name
            0,									// reserved
            KEY_WRITE | KEY_READ,				// desired security access
            &m_HKey								// address of buffer for opened handle
            ) != ERROR_SUCCESS )
        {
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    

    Nichts besonderes ... das ist die Standartregistryfunktion...



  • Und wie heißt der zu öffnende Key?



  • sri schrieb:

    Und wie heißt der zu öffnende Key?

    HKEY_LOCAL_MACHINE\software\company\Application\testkey1
    

    Hast du wohl eine Idee ?



  • Und der Schlüssel existiert auch wirklich? Was passiert, wenn Du anstatt RegOpenKeyEx einmal RegCreateKeyEx verwendest?



  • sri schrieb:

    Und der Schlüssel existiert auch wirklich? Was passiert, wenn Du anstatt RegOpenKeyEx einmal RegCreateKeyEx verwendest?

    Nein er existiert natürlich nicht ... weil, wenn ich den nichtmal öffnen kann, konnte ich ihn vorher auch nicht anlegen 😉
    Da liegt ja mein Problem, das ich gänzlich keinen Zugriff auf die Registry unter HKEY_LOCAL_MACHINE habe.

    Aber danke das du dir da solch einen Kopf drum machst 🙂


Anmelden zum Antworten