Mover mediante programación las claves de registro
Pregunta
¿Alguien sabe cómo puedo mover programáticamente un registro de HKEY_LOCAL_MCAHINE a HKEY_CURRENT_USER?
Escribí una función recursiva que usa RegEnumKeyEx y RegEnumValue, pero parece que RegEnumValue devuelve todos los valores bajo la clave de nivel superior.
Por ejemplo, si la clave es HKEY_LOCAL_MACHINE \ SOFTWARE \ MyApp \ KeyName1 y tiene 3 valores debajo, tengo HKEY_LOCAL_MACHINE \ SOFTWARE \ MyApp \ KeyName2 y tiene 2 valores. Parece que RegEnumKeyEx está devolviendo las claves adecuadas, pero cuando llamo a RegEnumValue para la primera Clave (es decir, KeyName1) obtengo los 5 valores devueltos y no solo los 3 bajo esa clave.
Espero que todo tenga sentido ... ¿estoy haciendo algo mal?
Gracias por cualquier ayuda
Aquí hay un fragmento, si ayuda:
void CArgusApp::RecurseSubKeys(CString csStartKey)
{
CQERegistry reg;
HRESULT hr = reg.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\" + csStartKey, KEY_QUERY_VALUE );
CStringArray csaDataNames;
reg.GetAllDataNames(csaDataNames);
for (int j = 0; j < csaDataNames.GetSize(); j++)
{
CString csValueName = csaDataNames.ElementAt(j);
TRACE(csStartKey + " - " + csValueName);
}
CStringArray csaKeys;
reg.GetAllSubKeys(csaKeys);
for (int i = 0; i < csaKeys.GetSize(); i++)
{
CString csKey = csaKeys.ElementAt(i);
this->RecurseSubKeys(csStartKey + "\\" + csKey);
}
reg.Close();
}
es decir GetAllDataNames anterior simplemente llama a RegEnumValue y GetAllSubKeys llama a RegEnumKeyEx.
Solución
Mirando a través de todas las funciones de registro, encontré esto: SHCopyKey o puedo usar esto: RegCopyTree para Vista y posterior.
Gracias por la ayuda.
Otros consejos
No soy un experto en esto, pero intente algo como esto.
RegistryKey myKey = Registry.LocalMachine.OpenSubKey(
@"SOFTWARE\\" + csStartKey,
false);
Registry.CurrentUser.CreateSubKey
(myKey.ToString());