PDA

Показать полную графическую версию : [решено] Реестр - копирование всего в другой


crashtuak
12-12-2009, 15:26
Прошу показать пример на конкретной задачи:
Нужно скопировать раздел "HKEY_LOCAL_MACHINE\SOFTWARE\Diskeeper Corporation\" в "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Diskeeper Corporation\" с перезаписью всех существующих параметров. Кто поможет?

FlatX007
12-12-2009, 16:08
А консольные команды ни кто не отменял :)

REG COPY /? - справка по команде.

Creat0R
12-12-2009, 23:09
Расширенная библиотека для работы с реестром (http://creator-lab.ucoz.ru/load/3-1-0-49)

Пример с её использованием:

#include <Array.au3>
#include <Registry_UDF.au3>

$aArr = _RegEnumKeys2Array("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run")

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aArr[0][0]
$sPath = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($aArr[$i][0], "\\Run\\", "\\Run_Test\\") ;Копируем в Run_Test
$sPath = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($sPath, "\\[^\\]*$", "")
$sKey = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($aArr[$i][0], "^.*\\", "")
$sKey = StringReplace (http://www.autoitscript.com/autoit3/docs/functions/StringReplace.htm)($sKey, "!", "! ") ;этот символ на конце почему то блокирует запись

$sRet = RegWrite (http://www.autoitscript.com/autoit3/docs/functions/RegWrite.htm)($sPath, $sKey, $aArr[$i][2], $aArr[$i][1])
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

amel27
15-12-2009, 04:05
может вместо копирования создать символическую ссылку на нужный ключ реестра?

crashtuak
28-12-2009, 19:42
Creat0R, спасибо, ваш вариант работает идеально.

Yashied
30-12-2009, 01:39
IMHO так быстрее и надежнее.

Global Const $HKEY_LOCAL_MACHINE = 0x80000002


$hKey = _WinAPI_RegCreateKey($HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\Diskeeper Corporation')
_WinAPI_RegCopyTree($HKEY_LOCAL_MACHINE, 'SOFTWARE\Diskeeper Corporation', $hKey)
_WinAPI_RegCloseKey($hKey)

Func _WinAPI_RegCloseKey($hKey)

Local $Ret = DllCall('advapi32.dll', 'long', 'RegCloseKey', 'ulong_ptr', $hKey)

If @error Then
Return SetError(1, 0, 0)
Else
If $Ret[0] Then
Return SetError(1, $Ret[0], 0)
EndIf
EndIf
Return 1
EndFunc ;==>_WinAPI_RegCloseKey

Func _WinAPI_RegCopyTree($hSrcKey, $sSrcSubKey, $hDestKey)

Local $Ret = DllCall('shlwapi.dll', 'long', 'SHCopyKeyW', 'ulong_ptr', $hSrcKey, 'wstr', $sSrcSubKey, 'ulong_ptr', $hDestKey, 'dword', 0)

If @error Then
Return SetError(1, 0, 0)
Else
If $Ret[0] Then
Return SetError(1, $Ret[0], 0)
EndIf
EndIf
Return 1
EndFunc ;==>_WinAPI_RegCopyTree

Func _WinAPI_RegCreateKey($hKey, $sSubKey = '', $iDesired = 0xF003F, $iOptions = 0, $tSecurity = 0)

Local $Ret = DllCall('advapi32.dll', 'long', 'RegCreateKeyExW', 'ulong_ptr', $hKey, 'wstr', $sSubKey, 'dword', 0, 'ptr', 0, 'dword', $iOptions, 'dword', $iDesired, 'ptr', DllStructGetPtr($tSecurity), 'ulong_ptr*', 0, 'dword*', 0)

If @error Then
Return SetError(1, 0, 0)
Else
If $Ret[0] Then
Return SetError(1, $Ret[0], 0)
EndIf
EndIf
Return SetError(0, Number($Ret[9] = 1), $Ret[8])
EndFunc ;==>_WinAPI_RegCreateKey

semiono
30-12-2009, 22:11
Тут важно чтобы приложения были 64-битными, иначе некорректно может отображаться реестр.




© OSzone.net 2001-2012