Registry-Backup Programm Problem
-
Warum verwendest Du KEY_ALL_ACCESS wenn Du die Daten nur lesen willst?
Warum ein Programm schreiben wenn es REGEDIT auch schon kann?
http://support.microsoft.com/kb/168589/en-us
-
Martin Richter schrieb:
Warum verwendest Du KEY_ALL_ACCESS wenn Du die Daten nur lesen willst?
Warum ein Programm schreiben wenn es REGEDIT auch schon kann?
http://support.microsoft.com/kb/168589/en-usIch will ein Backup erstellen. Und das soll automatisch laufen. Du meinst, wieso ich KEY_ALL_ACCESS bei RegOpenKey benutze? Hab's so gelernt. Falsch?
-
Ja! Weil Du dann Admin sein musst um es laufen zu lassen.
Wieso kann man REGEDIT nicht automatisch laufen lassen? Man kann den Job mit dem Scheduler planen.
Wofür muss ich eine EXE schreiben, wenn es eine EXE gibt, die macht was Du willst?
-
Martin Richter schrieb:
Ja! Weil Du dann Admin sein musst um es laufen zu lassen.
Wieso kann man REGEDIT nicht automatisch laufen lassen? Man kann den Job mit dem Scheduler planen.
Wofür muss ich eine EXE schreiben, wenn es eine EXE gibt, die macht was Du willst?Mag ja alles stimmen, ich hätte es aber gern zu lernzwecken als C++ Code. Wenn ich KEY_ALL_ACCESS auf 0 stelle, erstellt er die .reg Datei nicht.
-
RegSaveKey -> Remarks -> The calling process must have the SE_BACKUP_NAME privilege enabled.
Ne Frage - wozu etwas automatisch laufen lassen, wenn es gibt Systemwiederhershellungdienst?
C:\System Volume Information\_restore{MACHINE_GUID}\RP***\snapshot\ _REGISTRY_MACHINE_SOFTWARE _REGISTRY_MACHINE_SYSTEM _REGISTRY_USER_NTUSER_**SID** usw.
MACHINE_GUID ist hier zu lesen: HKLM\SYSTEM\CurrentControlSet\Services\sr\Parameters oder %windir%\system32\Restore\MachineGuid.txt.
Du kannst also mit SRSetRestorePoint api o. WMI::SystemRestore::CreateRestorePoint ein Wiederherstellungspunkt erstellen.
RegSaveKey ist system-modal.
-
skullyan schrieb:
Mag ja alles stimmen, ich hätte es aber gern zu lernzwecken als C++ Code. Wenn ich KEY_ALL_ACCESS auf 0 stelle, erstellt er die .reg Datei nicht.
Wie wäre es mit etwas Studium der MSDN?
Du willst lesen?
Was hällst Du von KEY_READ?
-
Martin Richter schrieb:
skullyan schrieb:
Mag ja alles stimmen, ich hätte es aber gern zu lernzwecken als C++ Code. Wenn ich KEY_ALL_ACCESS auf 0 stelle, erstellt er die .reg Datei nicht.
Wie wäre es mit etwas Studium der MSDN?
Du willst lesen?
Was hällst Du von KEY_READ?Ja! Das ist hier wohl das Sinnvollste.
-
skullyan schrieb:
Martin Richter schrieb:
Wie wäre es mit etwas Studium der MSDN?
Du willst lesen?
Was hällst Du von KEY_READ?Ja! Das ist hier wohl das Sinnvollste.
Auf welche Frage war das die Antwort:
Wie wäre es mit etwas Studium der MSDN?
Du willst lesen?
Was hällst Du von KEY_READ?<duck&wech>
-
Martin Richter schrieb:
Auf welche Frage war das die Antwort:
Wie wäre es mit etwas Studium der MSDN?
Du willst lesen?
Was hällst Du von KEY_READ?Auf die Frage wegen dem Studium der MSDN. Ich sehe meinen Fehler allerdings immer noch nicht.
Kann es vielleicht etwas mit den Rechten unter Vista zu tun haben? (bin als normaler User angemeldet)
-
Also um in HKEY_LOCAL_MACHINE SCHREIBEN zu können brauchst du Adminrechte. Beim lesen glaube ich aber nicht. Probiers aber einfach mal aus. Meld dich als Admin an und führ dein Prgramm als Administrator aus und schau ob es tut.
-
Zusatz:
1. Ein Progamm ohne Vista Manifest unterliegt der Virtualisierung und hat "scheinbar" Schreibrechte auf die Registry.
2. Wenn man sich selbst als Admin unter Vista anmeldet wird dennoch jedes normal gestartete Programm ohne Admin-Token gestartet, sofern UAC aktiv ist.
3. Nur ein Programm mit Vista-Manifest und das elevated gestartet wird, hat Schreibzugriff auf HKLM!
-
Martin Richter schrieb:
1. Ein Progamm ohne Vista Manifest unterliegt der Virtualisierung und hat "scheinbar" Schreibrechte auf die Registry.
2. Wenn man sich selbst als Admin unter Vista anmeldet wird dennoch jedes normal gestartete Programm ohne Admin-Token gestartet, sofern UAC aktiv ist.
3. Nur ein Programm mit Vista-Manifest und das elevated gestartet wird, hat Schreibzugriff auf HKLM!Machen die bei M$ eigentlich alles falsch? *scnr
-
Martin Richter schrieb:
Zusatz:
1. Ein Progamm ohne Vista Manifest unterliegt der Virtualisierung und hat "scheinbar" Schreibrechte auf die Registry.
2. Wenn man sich selbst als Admin unter Vista anmeldet wird dennoch jedes normal gestartete Programm ohne Admin-Token gestartet, sofern UAC aktiv ist.
3. Nur ein Programm mit Vista-Manifest und das elevated gestartet wird, hat Schreibzugriff auf HKLM!Bedeutet das, dass ich in mein Programm so etwas wie ein "Vista-Manifest" hinzufügen muss? Wie schaut sowas denn aus? Kann mir da jemand helfen?
-
Gesucht hast Du nicht oder?
http://blog.m-ri.de/index.php/2006/12/12/vista-und-die-notwendigkeit-eines-manifestes-fur-die-uac/
-
Martin Richter schrieb:
Gesucht hast Du nicht oder?
http://blog.m-ri.de/index.php/2006/12/12/vista-und-die-notwendigkeit-eines-manifestes-fur-die-uac/
Sehr Ausführlich, danke. Ich habe die Headerfile in das Programm eingebunden. So etwa:
#include <windows.h> #include <wininet.h> #include <process.h> #include <iostream> #include <fstream> #include <stdio.h> #include <conio.h> #include "header.h" // HIER DIE HEADERFILE EINGEBUNDEN using namespace std; void save(); int main() { save(); return EXIT_SUCCESS; } void save() { RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\", 0, KEY_ALL_ACCESS, 0); RegSaveKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\", "C:\\data.reg", 0); }
Diese Headerfile:
// Version 2.0 by Martin Richter [WWJD] // Supports VC-2005 and VC-2008 #pragma once #ifndef RC_INVOKED // Avoid problems with the resource compiler if included // This defines bock the creation in the header files #pragma message("Using private assemblies for the MS runtimes") #define _STL_NOFORCE_MANIFEST #define _CRT_NOFORCE_MANIFEST #define _AFX_NOFORCE_MANIFEST //#define _ATL_NOFORCE_MANIFEST // The next statements block the linker from including object files in the // CRT and the MFC, that would create manifest pragmas too. #ifdef __cplusplus extern "C" { /* Assume C declarations for C++ */ #endif __declspec(selectany) int _forceCRTManifest; __declspec(selectany) int _forceMFCManifest; // __declspec(selectany) int _forceAtlDllManifest; // The next symbols are used by the several versions of VC 9.0 __declspec(selectany) int _forceCRTManifestRTM; __declspec(selectany) int _forceMFCManifestRTM; __declspec(selectany) int _forceMFCManifestCUR; #ifdef __cplusplus } /* __cplusplus */ #endif // We use crtassem.h with the defines there. It just gives us the // versions and name parts for the dependencies. // Note that there is also a MFCassem.h but this include file has the // manifest pragma's already in it. So we can't use it // // Three files are controlling this crtassem.h, MFCassem.h and atlassem.h! // Happily __LIBRARIES_ASSEMBLY_NAME_PREFIX is used in CRT, MFC and ATL! // Doing it right would need to use _MFC_ASSEMBLY_VERSION for the MFC // but in fact _CRT_ASSEMBLY_VERSION and _MFC_ASSEMBLY_VERSION and // _ATL_ASSEMBLY_VERSION are the same // - VC-2005 SP1 8.0.50727.762 // - VC-2008 RTM 9.0.21022.8 // - VC-2008 Feature Pack 9.0.30411.0 (used if _BIND_TO_CURRENT_VCLIBS_VERSION // and _BIND_TO_CURRENT_MFC_VERSION are defined to 1) #include <crtassem.h> // We don't have a seperate block for the Debug version. We just handle // this with a extra define here. #ifdef _DEBUG #define __LIBRARIES_SUB_VERSION "Debug" #else #define __LIBRARIES_SUB_VERSION "" #endif // Manifest for the CRT #pragma comment(linker,"/manifestdependency:\"type='win32' " \ "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX "." __LIBRARIES_SUB_VERSION "CRT' " \ "version='" _CRT_ASSEMBLY_VERSION "' " \ "processorArchitecture='x86' \"") // Manifest for the MFC #pragma comment(linker,"/manifestdependency:\"type='win32' " \ "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX "." __LIBRARIES_SUB_VERSION "MFC' " \ "version='" _CRT_ASSEMBLY_VERSION "' " \ "processorArchitecture='x86'\"") // #pragma comment(linker,"/manifestdependency:\"type='win32' " \ // "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFCLOC' " \ // "version='" _CRT_ASSEMBLY_VERSION "' " \ // "processorArchitecture='x86'\"") // Manifest for the ATL // #pragma comment(linker,"/manifestdependency:\"type='win32' " \ // "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".ATL' " \ // "version='" _CRT_ASSEMBLY_VERSION "' " \ // "processorArchitecture='x86' \"") #endif // RC_INVOKED
Das Programm kompiliert, meldet aber Fehler. Ich weiß auch nicht, wie ich das XML-Manifest einbinden soll...
<?xml version=”1.0″ encoding=”utf-8″?> <assembly xmlns=”urn:schemas-microsoft-com:asm.v1″ manifestVersion=”1.0″> <trustInfo xmlns=”urn:schemas-microsoft-com:asm.v3″> <security> <requestedPrivileges> <requestedExecutionLevel level=”asInvoker” /> <!-- Ich hab gelesen, dass man mit "asInvoker" die niedrigste Stufe von Rechten hat. Ich brauche aber doch Admin Rechte, oder habe ich was falsch verstanden? --> </requestedPrivileges> </security> </trustInfo> </assembly>
Verzeiht, wenn ich alles falsch gemacht habe, bin noch blutiger Anfänger...
Danke im Voraus.
-
MSDN lesen bildet!
asInvoker heißt was es sagt: Du bekommst die rechte die der aufrufende hat. Ist er bereits elevated dann bist Du auch elevated. Ist er nicht elevated wirst Dein neuer Prozess auch nicht elevated.requireAdministrator heißt Du benötigst Admin rechte. Die Folge: UAC-Prompt und evtl., Eingabe der Credentials notwendig.
-
Martin Richter schrieb:
MSDN lesen bildet!
asInvoker heißt was es sagt: Du bekommst die rechte die der aufrufende hat. Ist er bereits elevated dann bist Du auch elevated. Ist er nicht elevated wirst Dein neuer Prozess auch nicht elevated.requireAdministrator heißt Du benötigst Admin rechte. Die Folge: UAC-Prompt und evtl., Eingabe der Credentials notwendig.
Okay, das war aber nicht meine einzige Frage
-
Und was war Deine Frage?
Ich sehe nur das Du Manifest Code für das Laden der CRTs mit dem Manifest Code für UAC durcheinander wirfst...
Ansonsten hast Du keine Frage gestellt, sondern eine Feststellung ohne Inhalt gemacht "Das Programm kompiliert, meldet aber Fehler."Wenn die Datei die Endung Manifest hat, dann kannst Du diese einfach dem Projekt hinzufügen.
In VS2008 wird das Manifest automatisch erzeugt...Nochmal: MSDN lesen bildet!
-
Martin Richter schrieb:
Und was war Deine Frage?
Ich sehe nur das Du Manifest Code für das Laden der CRTs mit dem Manifest Code für UAC durcheinander wirfst...
Ansonsten hast Du keine Frage gestellt, sondern eine Feststellung ohne Inhalt gemacht "Das Programm kompiliert, meldet aber Fehler."Wenn die Datei die Endung Manifest hat, dann kannst Du diese einfach dem Projekt hinzufügen.
In VS2008 wird das Manifest automatisch erzeugt...Nochmal: MSDN lesen bildet!
Der Inhalt des Fehlers lautet: Die Anwendung konnte aufgrund einer falschen Anwendungskonfiguration nicht gestartet werden. Überprüfen Sie die Manifestdatei auf mögliche Fehler.
Ich hab ja nur die Headerdatei von Dir da eingefügt. Was muss ich sonst noch machen?
-
Meine Header Daten sind nicht notwendig.
UseMSPrivateAssmeblies hat einen ganz anderen Zweck.Es geht um dieses:
http://blog.m-ri.de/index.php/2006/12/12/vista-und-die-notwendigkeit-eines-manifestes-fur-die-uac/