M
Hallo MuhKuh_DD!
Also ich habe bis jetzt folgendes mit Hilfe des Forums realisert!
Das ist der Code ( Global hinterlegt ) zum speicher nvon Registry Keys und deren SubKeys.
LONG SaveRegistrySubKey(
HKEY hKey, // handle of key to save
LPTSTR szSubKey, // pointer to subkey name to save
LPTSTR szSaveFileName // pointer to save path/filename
)
{
HKEY hKeyToSave; // Handle of subkey to save
LONG rc; // result code from RegXxx
DWORD dwDisposition;
if((rc=RegCreateKeyEx(hKey,
szSubKey, // Name of subkey to open
0,
NULL,
REG_OPTION_BACKUP_RESTORE, // in winnt.h
KEY_QUERY_VALUE, // minimal access
NULL,
&hKeyToSave,
&dwDisposition)
) == ERROR_SUCCESS)
{
// Save registry subkey. If the registry is remote, files will
// be saved on the remote machine
rc=RegSaveKey(hKeyToSave, szSaveFileName, NULL);
// close registry key we just tried to save
RegCloseKey(hKeyToSave);
}
// return the last registry result code
return rc;
}
DWORD SaveReg(HKEY hKey)
{
TOKEN_PRIVILEGES tp;
HANDLE hToken;
LUID luid;
LONG rc; // contains error value returned by Regxxx()
DWORD dwSubKeyIndex=0; // index into key
char szSubKey[_MAX_FNAME]; // this should be dynamic.
// _MAX_FNAME is good because this
// is what we happen to save the
// subkey as
DWORD dwSubKeyLength=_MAX_FNAME; // length of SubKey buffer
if(!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES,
&hToken ))
{
AfxMessageBox("OpenProcessToken");
return GetLastError();
}
if(!LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &luid))
{
AfxMessageBox("LookupPrivilegeValue");
return GetLastError();
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
NULL, NULL );
if (GetLastError() != ERROR_SUCCESS)
{
AfxMessageBox("AdjustTokenPrivileges");
return GetLastError();
}
while((rc=RegEnumKeyEx(
hKey,
dwSubKeyIndex,
szSubKey,
&dwSubKeyLength,
NULL,
NULL,
NULL,
NULL)
) != ERROR_NO_MORE_ITEMS) { // are we done?
if(rc == ERROR_SUCCESS)
{
LONG lRetVal; // return value from SaveRegistrySubKey
// save registry subkey szSubKey to filename szSubKey
if( (lRetVal=SaveRegistrySubKey(hKey, szSubKey, szSubKey)
) != ERROR_SUCCESS)
{
AfxMessageBox("SaveRegistrySubKey");
return (DWORD) lRetVal;
}
// increment index into the key
dwSubKeyIndex++;
// reset buffer size
dwSubKeyLength=_MAX_FNAME;
// Continue the festivities
continue;
}
else
{
//
// note: we need to watch for ERROR_MORE_DATA
// this indicates we need a bigger szSubKey buffer
//
AfxMessageBox("RegEnumKeyEx");
return (DWORD) rc;
}
} // RegEnumKeyEx
// Revoke all privileges this process holds (including backup)
AdjustTokenPrivileges( hToken, TRUE, NULL, 0, NULL, NULL);
// close handle to process token
CloseHandle(hToken);
return 0;
}
Das ganze Rufe ich über folgenden Code auf:
void CRegistryneuDlg::OnButton1()
{
UpdateData(TRUE);
if (m_check1 == TRUE)
{
// CreateDirectory("C:\\ISDNAPL",NULL);
HKEY hkey;
DWORD err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",0, KEY_ALL_ACCESS, &hkey);
SaveReg(hkey);
RegCloseKey(hkey);
}
else
MessageBox("Es wurde kein Key exportiert!", "Reg Export");
}
Wenn ich also den Button anklicke und die Checkbox ist nicht aktiviert kommt eine Msgbox mit dem Hinweis "Es wurde kein Key exportiert!". Wenn aber die Checkbox aktiviert ist, dann wird der RegKey und deren SubKeys auch exportiert, allerdings in das Hauptverzeichnis des Programmes. Es sollte aber so sein, das ( da noch mehrere Checkboxen folgen ) für jede aktivierte Checkbox ein Ordner angelegt wird, wo dann auch der entsprechende RegKey und seine SubKeys drin abgelegt werden. Das ganze muss ich sehr wahrscheinlich mit einer Schleife lösen die um folgende Funktion programmiert wird:
// Save registry subkey. If the registry is remote, files will
// be saved on the remote machine
rc=RegSaveKey(hKeyToSave, szSaveFileName, NULL);
Da in diesem Aufruf durch die Variable "szSaveFileName" das hinterlegen der RegKeys beeinflusst wird.
Und darin liegt halt mein Problem.
- Welche Schleife soll ich verwenden?
- Wie soll ich das ganze angehen?
Danke für Eure weitere Mithilfe!