НАЗВА

virt-win-reg — програма для експортування та дописування записів реєстру Windows з гостьової системи Windows

КОРОТКИЙ ОПИС

 virt-win-reg назва_домену 'HKLM\Шлях\до\підключа'
 virt-win-reg назва_домену 'HKLM\Шлях\до\підключа' назва
 virt-win-reg назва_домену 'HKLM\Шлях\до\підключа' @
 virt-win-reg --merge назва_домену [вхідний.reg ...]
 virt-win-reg [--параметри] диск.img ... # замість назва_домену

ПОПЕРЕДЖЕННЯ

Не використовуйте "virt-win-reg" з параметром --merge для активних віртуальних машин. Якщо ви зробите це, ви невиправно ушкодите диск у віртуальній машині. "virt-win-reg" намагатиметься запобігти подібним діям, але програма не завжди може визначити усі можливі випадки.
Внесення змін до реєстру Windows є ризикованою дією. Формат реєстру доволі неясний і недокументований, а зміни у реєстрі можуть призвести до неможливості завантажити систему. Тому, якщо ви користуєтеся параметром --merge, не забувайте спочатку створити надійну резервну копію.

ОПИС

Ця програма може експортувати і дописувати записи реєстру Windows з гостьової системи Windows.
Першим параметром є назва гостьової системи libvirt або простого (raw) образу гостьової системи Windows.
Якщо не вказано параметр --merge, вибраний ключ реєстру буде показано або експортовано (рекурсивно). Приклад:
 $ virt-win-reg Windows7 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft'
Крім того, ви можете переглядати окремі значення у ключах реєстру. Приклад:
 $ cvkey='HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion'
 $ virt-win-reg Windows7 $cvkey ProductName
 Windows 7 Enterprise
За допомогою --merge ви можете дописати текстовий файл regedit до реєстру Windows:
 $ virt-win-reg --merge Windows7 changes.reg

ПРИМІТКА

Цю програму призначено лише для спрощення доступу до реєстру. Якщо вам потрібні якісь складні дії з реєстром, рекомендуємо вам отримати файли роїв реєстру з гостьової системи за допомогою libguestfs(3) або guestfish(1) і обробити їх локально, наприклад за допомогою hivex(3), hivexsh(1) або hivexregedit(1).

ПАРАМЕТРИ

--help
Показати коротку довідку.
--version
Показати дані щодо версії і завершити роботу.
--debug
Увімкнути показ діагностичних повідомлень.
-c адреса
--connect адреса
Якщо використовується libvirt, встановити з’єднання з вказаним URI. Якщо пропущено, з’єднання буде встановлено з типовим гіпервізором libvirt. Якщо вказати блокові пристрої гостьових систем безпосередньо, libvirt не буде використовуватися взагалі.
--format raw
Визначає формат образу диска, назву якого вказано у рядку команди. Якщо формат не вказано, його буде визначено автоматично на основі вмісту образу диска. Якщо вказаний диск походить з libvirt, ця програма надішле запит щодо даних до libvirt. У цьому випадку вказане значення параметра формату буде проігноровано. Якщо ви працюєте із образами дисків гостьових систем у форматі raw із ненадійних джерел, вам слід завжди вказувати назву формату.
--merge
У режимі об'єднання програма дописує текстовий файл regedit до реєстру Windows віртуальної машини. Якщо цей параметр не вказано, virt-win-reg показує або експортує записи реєстру. Зауважте, що --merge не безпечно використовувати для активних віртуальних машин. Використання цього параметра команди для активних віртуальних машин призводить до пошкодження вмісту диска. Втім, експортування (виконання команди без цього параметра) є завжди безпечним.
--encoding UTF-16LE|ASCII
При об'єднанні (і лише при ньому) у вас може виникнути потреба у визначення кодування рядків, які використовуються у файлі рою. Докладніший опис можна знайти у розділі "ENCODING STRINGS" in Win::Hivex::Regedit(3). Типово буде використано кодування UTF-16LE, яке має працювати у свіжих версіях Windows.
--unsafe-printable-strings
Під час експортування (і лише під час нього) припускати, що рядки записано у кодуванні UTF-16LE і виводити їх у форматі текстових рядків, а не послідовностей шістнадцяткових чисел. Вилучити завершальний нуль-символ з рядків, якщо такий буде виявлено. Така дія не є безпечною і не надає можливості зберегти точність запису початкових рядків реєстру з різних причин:
Припускається, що початковим кодуванням є UTF-16LE. Рядки ASCII і рядки у інших кодуваннях буде пошкоджено під час цього перетворення.
Припускається, що усі дані, які належать до типу 1 чи типу 2, є насправді рядками і що усі інші дані не є рядками, але визначений тип поля у реєстрах, зазвичай, не є надійним джерелом даних.
Втрачаються дані щодо того, чи завершувався рядок у реєстрі нуль-символом.
 
Усе це є наслідком того, що сам реєстр не містить даних щодо кодування рядків у ньому (див. "ENCODING STRINGS" in Win::Hivex::Regedit(3)).
 
Цим параметром слід користуватися лише для найпростіших рішень та діагностування вмісту реєстру. Ніколи не користуйтеся ним, якщо виведені дані має бути передано іншій програмі або збережено у іншому реєстрі.

ПІДТРИМУВАНІ СИСТЕМИ

У поточній версії цієї програми передбачено підтримку гостьових систем, які походять від Windows NT, починаючи з Windows XP і до, принаймні, Windows 8.
Передбачено підтримку таких ключів реєстру:
"HKEY_LOCAL_MACHINE\SAM"
"HKEY_LOCAL_MACHINE\SECURITY"
"HKEY_LOCAL_MACHINE\SOFTWARE"
"HKEY_LOCAL_MACHINE\SYSTEM"
"HKEY_USERS\.DEFAULT"
"HKEY_USERS\SID"
де SID — SID користувача Windows (наприклад "S-1-5-18").
"HKEY_USERS\користувач"
де користувач — назва облікового запису локального користувача (це розширення libguestfs).
Ви можете використовувати "HKLM" як скорочення від "HKEY_LOCAL_MACHINE", та "HKU" як скорочення від "HKEY_USERS".
Підтримки буквальних ключів "HKEY_USERS\$SID" і "HKEY_CURRENT_USER" не передбачено (немає «поточного користувача»).

WINDOWS 8

«Швидкий запуск» Windows 8 може заважати virt-win-reg редагувати реєстр. Див. "ПРИСИПЛЯННЯ WINDOWS ТА ШВИДКИЙ ЗАПУСК WINDOWS 8" in guestfs(3).

КОДУВАННЯ

"virt-win-reg" вважає, що вміст файлів regedit вже перекодовано до локального кодування. Зазвичай, у основних системах Linux це означає, що використано UTF-8 із символами завершення рядків у стилі Unix. Оскільки файли regedit Windows часто записуються у кодуванні UTF-16LE із символами завершення рядків у стилі Windows, ймовірно, вам доведеться виконати перекодування усього файла до або після обробки.
Для перекодування файла з формату Windows до формату Linux (до обробки його за допомогою команди з параметром --merge) вам слід зробити щось таке:
 iconv -f utf-16le -t utf-8 < win.reg | dos2unix > linux.reg
Щоб виконати зворотне перетворення після експортування і перед надсиланням файла користувачеві Windows, слід зробити щось таке:
 unix2dos linux.reg | iconv -f utf-8 -t utf-16le > win.reg
Щоб дізнатися більше про кодування, ознайомтеся зі сторінкою підручника щодо Win::Hivex::Regedit(3).
Якщо ви не певні щодо поточного кодування, скористайтеся командою file(1). У свіжих версіях Windows regedit.exe створює файли кодування UTF-16LE із символами завершення рядків у стилі Windows (CRLF), ось такі:
 $ file software.reg
 software.reg: Little-endian UTF-16 Unicode text, with very long lines,
 with CRLF line terminators
Цей файл потребуватиме перетворення, перш ніж ви зможете скористатися для нього параметром --merge.

CurrentControlSet тощо.

Ключі реєстру, подібні до "CurrentControlSet", насправді не існують у реєстрі Windows на рівні файла рою, і тому ви не зможете вносити до них зміни.
Насправді, "CurrentControlSet" є альтернативною назвою "ControlSet001". За певних обставин це може бути посиланням на інший керівний набір. Визначити набір можна за допомогою ключа "HKLM\SYSTEM\Select":
 # virt-win-reg WindowsGuest 'HKLM\SYSTEM\Select'
 [HKEY_LOCAL_MACHINE\SYSTEM\Select]
 "Current"=dword:00000001
 "Default"=dword:00000001
 "Failed"=dword:00000000
 "LastKnownGood"=dword:00000002
«Поточним» є той набір, який Windows вибере під час завантаження.
Аналогічно, інші ключі "Current..." у шляху можуть потребувати заміни.

ВИЛУЧЕННЯ КЛЮЧІВ ТА ЗНАЧЕНЬ РЕЄСТРУ

Для вилучення усього ключа реєстру скористайтеся такою синтаксичною конструкцією:
 [-HKEY_LOCAL_MACHINE\Foo]
Для вилучення окремого значення у ключі скористайтеся такою синтаксичною конструкцією:
 [HKEY_LOCAL_MACHINE\Foo]
 "Value"=-

ПІДКАЗКИ ЩОДО WINDOWS

Зауважте, що у результаті деяких із команд у підказках буде змінено образ диска гостьової системи. Гостьову систему має бути вимкнено, щоб запобігти пошкодженню даних на диску.

ЗАПУСК ПАКЕТНОГО СКРИПТУ ПІД ЧАС ВХОДУ КОРИСТУВАЧА ДО СИСТЕМИ

Приготуйте пакетний скрипт DOS (.bat), скрипт VBScript або виконуваний файл. Вивантажте його до гостьової системи за допомогою guestfish(1). У цьому прикладі скрипт називається "test.bat" і його вивантажено до "C:\":
 guestfish -i -d WindowsGuest upload test.bat /test.bat
Приготуйте файл regedit, який міститиме зміни до реєстру:
 cat > test.reg <<'EOF'
 [HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce]
 "Test"="c:\\test.bat"
 EOF
У цьому прикладі ми використовуємо ключ "RunOnce", який означає, що скрипт буде запущено лише один раз під час першого входу користувача до системи. Якщо вам потрібно, щоб скрипт запускався кожного разу, коли користувач входить до системи, замініть "RunOnce" на "Run".
Оновіть регістр:
 virt-win-reg --merge WindowsGuest test.reg

ВСТАНОВЛЕННЯ СЛУЖБИ

У цьому розділі ми припускаємо, що ви обізнані із роботою служб Windows і маєте програму, яка обробляє протокол керування службами Windows безпосередньо або хочете запустити будь-яку програму за допомогою обгортки служби, наприклад SrvAny або безкоштовної RHSrvAny.
Спочатку вивантажте програму і, якщо потрібно, обгортку служби. У нашому прикладі тестова програма має назву "test.exe" і використано обгортку RHSrvAny:
 guestfish -i -d WindowsGuest <<EOF
   upload rhsrvany.exe /rhsrvany.exe
   upload test.exe /test.exe
 EOF
Приготуйте файл regedit зі змінами до реєстру. У нашому прикладі перша зміна до реєстру потрібна для самої служби або обгортки служби (якщо така використовується). Друга зміна потрібна лише через те, що ми використовуємо обгортку служби RHSrvAny.
 cat > service.reg <<'EOF'
 [HKLM\SYSTEM\ControlSet001\services\RHSrvAny]
 "Type"=dword:00000010
 "Start"=dword:00000002
 "ErrorControl"=dword:00000001
 "ImagePath"="c:\\rhsrvany.exe"
 "DisplayName"="RHSrvAny"
 "ObjectName"="NetworkService"
 
 [HKLM\SYSTEM\ControlSet001\services\RHSrvAny\Parameters]
 "CommandLine"="c:\\test.exe"
 "PWD"="c:\\Temp"
 EOF
Нотатки:
Щодо використання "ControlSet001" див. розділ вище на цій сторінці підручника. Ймовірно, вам слід скоригувати цей запис відповідно до керівного набору, який використовується вашою гостьовою системою.
"ObjectName" керує правами доступу, які матиме служба. Альтернативою є "ObjectName"="LocalSystem", яка надає права доступу найпривілейованішого облікового запису.
Щодо значення «магічних чисел» ознайомтеся із цією статтею бази даних знань Microsoft: http://support.microsoft.com/kb/103000.
Оновіть регістр:
 virt-win-reg --merge WindowsGuest service.reg

ЕКРАНУВАННЯ СИМВОЛІВ У ОБОЛОНЦІ

Будьте обережні із передаванням параметрів, які містять символ "\" (зворотну похилу риску), до командної оболонки. Зазвичай, вам слід використати одинарні лапки або подвійні зворотні похилі риски (але не те і інше одразу) для захисту від обробки інтерпретатором командної оболонки.
Регістр символів шляхів і назв значень береться до уваги під час обробки.

ТАКОЖ ПЕРЕГЛЯНЬТЕ

hivex(3), hivexsh(1), hivexregedit(1), guestfs(3), guestfish(1), virt-cat(1), virt-tail(1), Sys::Guestfs(3), Win::Hivex(3), Win::Hivex::Regedit(3), Sys::Virt(3), http://libguestfs.org/.

АВТОР

Richard W.M. Jones http://people.redhat.com/~rjones/

АВТОРСЬКІ ПРАВА

©Red Hat Inc., 2010

LICENSE

BUGS

To get a list of bugs against libguestfs, use this link: https://bugzilla.redhat.com/buglist.cgi?component=libguestfs&product=Virtualization+Tools
To report a new bug against libguestfs, use this link: https://bugzilla.redhat.com/enter_bug.cgi?component=libguestfs&product=Virtualization+Tools
When reporting a bug, please supply:
The version of libguestfs.
Where you got libguestfs (eg. which Linux distro, compiled from source, etc)
Describe the bug accurately and give a way to reproduce it.
Run libguestfs-test-tool(1) and paste the complete, unedited output into the bug report.