How to edit the Windows registry offline via Command-Line
Napsal K5   
Saturday, 24. March 2012
Na Internetu najdete celou řadu návodů, jak editovat Windows registry na běžících Windows pomocí Regedit.exe, tedy online. Pokud před sebou ale máte neběžící Windows, potřebujete editovat Windows registry offline. Na to je na Internetu taky pár návodů. A to doslova pár, tedy DVA. Já přidám třetí.

Ony dva druhy návodů ukazují dva rozdílné způsoby. Jeden z nich se dá charakterizovat jako jak z Linuxu editovat Windows Registry, zatím co ten druhý je o tom, jako do Windows připojit cizí Windows registry pomocí Regedit.exe a Načtení a uvolnění podregistrů.

To všechno je sice super, ale jen v okamžiku, kdy u toho sedíte a kdy takovýto úkon potřebujete provést jednorázově. Jakmile se dostanete do situace, kdy potřebujete například změnit Windows registry na 300 napadených počítačích offline, tak budete hledat způsob, jak toto naskriptovat, aby se to udělalo takříkajíc samo. Například s využitím bootovatelného USB flash disku nebo ještě lépe s pomocí serveru PXE a upravených Windows PE.

Jde to vůbec? Dobrá zpráva je, že ANO, jde to. A dokonce to jde pomocí nativních prostředků Windows a sice příkazem Reg.exe. Ten je určen pro práci z příkazového řádku, což je přesně to, co ve skriptech potřebujeme.
REG Operation [Parameter List]

  Operation  [ QUERY   | ADD    | DELETE  | COPY    |
               SAVE    | LOAD   | UNLOAD  | RESTORE |
               COMPARE | EXPORT | IMPORT ]

Return Code: (Except of REG COMPARE)

  0 - Successful
  1 - Failed

For help on a specific operation type:

  REG Operation /?

Examples:

  REG QUERY /?
  REG ADD /?
  REG DELETE /?
  REG COPY /?
  REG SAVE /?
  REG RESTORE /?
  REG LOAD /?
  REG UNLOAD /?
  REG COMPARE /?
  REG EXPORT /?
  REG IMPORT /?
Z výše uvedeného je pro náš případ zajímavá dvojice příkazů REG LOAD subkey file a REG UNLOAD subkey. Je to "neklikací" ekvivalent toho, co dělá Regedit.exe a jeho Načtení a uvolnění podregistrů.

Dejmež tomu, že potřebujeme z Windows registry na disku D: nahradit nějaký klíč (na disku D: jsou Windows, které momentálně neběží a my jsme v běžících Windows na jiném disku). Princip je ten, že si do Windows registry na běžících Windows připojíme Windows registry z neběžících Windows jako podklíč (příkazem REG LOAD podklíč). S ním pak pracujeme obvyklým způsobem ať už pomocí *.REG souborů (import souboru s příkazem pro přidání/smazání klíče/větve) nebo příkazů REG ADD či REG DELETE nebo REG IMPORT (příkaz pro přidání/smazání klíče/větve). Až jsme s tím ve skriptu hotovi, podklíč uvolníme (příkazem REG UNLOAD podklíč). Veškeré změny, pokud jsme důsledně používali správný odkaz - podklíč - na připojený podregistr, proběhnou v připojeném registru a nikoli v registru běžících Windows.

K tomu je ještě potřeba říct toto: Windows registry jsou rozprostřeny do několika různých souborů, takzvaných Registry Hive. Tyto je potřeba připojovat jednotlivě do různých podklíčů. Seznam aktuálně používaných Registry Hives v běžících Windows najdete ve Windows registry zde:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist]
Popis, co je který Registry Hive zač, je například v článku Informace o registru systému Windows pro pokročilé uživatele. Další užitečné informace jsou například v MSDN.

Příklad připojení dvou Registry Hives:
pushd "D:\Windows\System32\config\"
reg load "HKLM\Offline_Software" SOFTWARE
reg load "HKLM\Offline_System"   SYSTEM
reg import "%SystemDrive%\RegistryRepair\RemoveMalware.reg"
reg unload "HKLM\Offline_System"
reg unload "HKLM\Offline_Software"
popd
V našem příkladu pak v souboru REG mají odkazy na větve oproti online stavu změněnou hodnotu SOFTWARE na \Offline_Software\ případně SYSTEM na \Offline_System\, viz ukázka:
[HKEY_LOCAL_MACHINE\Offline_Software\Microsoft\Windows NT\CurrentVersion\Winlogon]
"Shell"="Explorer.exe"
Podobně pak vypadají odkazy na SYSTEM, například [HKEY_LOCAL_MACHINE\Offline_System\ControlSet001\Control].

A to je celá "věda" :-)