
=head1 НАЗВА

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

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

 virt-win-reg назва_домену 'HKLM\Шлях\до\підключа'

 virt-win-reg назва_домену 'HKLM\Шлях\до\підключа' назва

 virt-win-reg назва_домену 'HKLM\Шлях\до\підключа' @

 virt-win-reg --merge назва_домену [вхідний.reg ...]

 virt-win-reg [--параметри] диск.img ... # замість назва_домену

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

I<Не> використовуйте C<virt-win-reg> з параметром I<--merge> для активних віртуальних машин. Якщо ви зробите це, ви I<невиправно> ушкодите диск у віртуальній машині. C<virt-win-reg> намагатиметься запобігти подібним діям, але програма не завжди може визначити усі можливі випадки.

Внесення змін до реєстру Windows є ризикованою дією. Формат реєстру доволі неясний і недокументований, а зміни у реєстрі можуть призвести до неможливості завантажити систему. Тому, якщо ви користуєтеся параметром I<--merge>, не забувайте спочатку створити надійну резервну копію.

=head1 ОПИС

Ця програма може експортувати і дописувати записи реєстру Windows з гостьової системи Windows.

Першим параметром є назва гостьової системи libvirt або простого (raw) образу гостьової системи Windows.

Якщо I<не> вказано параметр I<--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

За допомогою I<--merge> ви можете дописати текстовий файл regedit до реєстру Windows:

 $ virt-win-reg --merge Windows7 changes.reg

=head2 ПРИМІТКА

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

=head1 ПАРАМЕТРИ

=over 4

=item B<--help>

Показати коротку довідку.

=item B<--version>

Показати дані щодо версії і завершити роботу.

=item B<--debug>

Увімкнути показ діагностичних повідомлень.

=item B<-c адреса>

=item B<--connect адреса>

Якщо використовується libvirt, встановити з’єднання з вказаним I<URI>. Якщо пропущено, з’єднання буде встановлено з типовим гіпервізором libvirt.

Якщо вказати блокові пристрої гостьових систем безпосередньо, libvirt не буде використовуватися взагалі.

=item B<--format> raw

Визначає формат образу диска, назву якого вказано у рядку команди. Якщо формат не вказано, його буде визначено автоматично на основі вмісту образу диска.

Якщо вказаний диск походить з libvirt, ця програма надішле запит щодо даних до libvirt. У цьому випадку вказане значення параметра формату буде проігноровано.

Якщо ви працюєте із образами дисків гостьових систем у форматі raw із ненадійних джерел, вам слід завжди вказувати назву формату.

=item B<--merge>

У режимі об'єднання програма дописує текстовий файл regedit до реєстру Windows віртуальної машини. Якщо цей параметр I<не> вказано, virt-win-reg показує або експортує записи реєстру.

Зауважте, що I<--merge> I<не безпечно> використовувати для активних віртуальних машин. Використання цього параметра команди для активних віртуальних машин призводить до пошкодження вмісту диска. Втім, експортування (виконання команди без цього параметра) є завжди безпечним.

=item B<--encoding> UTF-16LE|ASCII

При об'єднанні (і лише при ньому) у вас може виникнути потреба у визначення кодування рядків, які використовуються у файлі рою. Докладніший опис можна знайти у розділі L<Win::Hivex::Regedit(3)/ENCODING STRINGS>.

Типово буде використано кодування UTF-16LE, яке має працювати у свіжих версіях Windows.

=item B<--unsafe-printable-strings>

Під час експортування (і лише під час нього) припускати, що рядки записано у кодуванні UTF-16LE і виводити їх у форматі текстових рядків, а не послідовностей шістнадцяткових чисел. Вилучити завершальний нуль-символ з рядків, якщо такий буде виявлено.

Така дія не є безпечною і не надає можливості зберегти точність запису початкових рядків реєстру з різних причин:

=over 4

=item *

Припускається, що початковим кодуванням є UTF-16LE. Рядки ASCII і рядки у інших кодуваннях буде пошкоджено під час цього перетворення.

=item *

Припускається, що усі дані, які належать до типу 1 чи типу 2, є насправді рядками і що усі інші дані не є рядками, але визначений тип поля у реєстрах, зазвичай, не є надійним джерелом даних.

=item *

Втрачаються дані щодо того, чи завершувався рядок у реєстрі нуль-символом.

=back

Усе це є наслідком того, що сам реєстр не містить даних щодо кодування рядків у ньому (див. L<Win::Hivex::Regedit(3)/ENCODING STRINGS>).

Цим параметром слід користуватися лише для найпростіших рішень та діагностування вмісту реєстру. I<Ніколи> не користуйтеся ним, якщо виведені дані має бути передано іншій програмі або збережено у іншому реєстрі.

=back

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

У поточній версії цієї програми передбачено підтримку гостьових систем, які походять від Windows NT, починаючи з Windows XP і до, принаймні, Windows 8.

Передбачено підтримку таких ключів реєстру:

=over 4

=item C<HKEY_LOCAL_MACHINE\SAM>

=item C<HKEY_LOCAL_MACHINE\SECURITY>

=item C<HKEY_LOCAL_MACHINE\SOFTWARE>

=item C<HKEY_LOCAL_MACHINE\SYSTEM>

=item C<HKEY_USERS\.DEFAULT>

=item C<HKEY_USERS\I<SID>>

де I<SID> — SID користувача Windows (наприклад C<S-1-5-18>).

=item C<HKEY_USERS\I<користувач>>

де I<користувач> — назва облікового запису локального користувача (це розширення libguestfs).

=back

Ви можете використовувати C<HKLM> як скорочення від C<HKEY_LOCAL_MACHINE>, та C<HKU> як скорочення від C<HKEY_USERS>.

Підтримки буквальних ключів C<HKEY_USERS\$SID> і C<HKEY_CURRENT_USER> не передбачено (немає «поточного користувача»).

=head2 WINDOWS 8

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

=head1 КОДУВАННЯ

C<virt-win-reg> вважає, що вміст файлів regedit вже перекодовано до локального кодування. Зазвичай, у основних системах Linux це означає, що використано UTF-8 із символами завершення рядків у стилі Unix. Оскільки файли regedit Windows часто записуються у кодуванні UTF-16LE із символами завершення рядків у стилі Windows, ймовірно, вам доведеться виконати перекодування усього файла до або після обробки.

Для перекодування файла з формату Windows до формату Linux (до обробки його за допомогою команди з параметром I<--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

Щоб дізнатися більше про кодування, ознайомтеся зі сторінкою підручника щодо L<Win::Hivex::Regedit(3)>.

Якщо ви не певні щодо поточного кодування, скористайтеся командою L<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

Цей файл потребуватиме перетворення, перш ніж ви зможете скористатися для нього параметром I<--merge>.

=head1 CurrentControlSet тощо.

Ключі реєстру, подібні до C<CurrentControlSet>, насправді не існують у реєстрі Windows на рівні файла рою, і тому ви не зможете вносити до них зміни.

Насправді, C<CurrentControlSet> є альтернативною назвою C<ControlSet001>. За певних обставин це може бути посиланням на інший керівний набір. Визначити набір можна за допомогою ключа C<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 вибере під час завантаження.

Аналогічно, інші ключі C<Current...> у шляху можуть потребувати заміни.

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

Для вилучення усього ключа реєстру скористайтеся такою синтаксичною конструкцією:

 [-HKEY_LOCAL_MACHINE\Foo]

Для вилучення окремого значення у ключі скористайтеся такою синтаксичною конструкцією:

 [HKEY_LOCAL_MACHINE\Foo]
 "Value"=-

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

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

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

Приготуйте пакетний скрипт DOS (.bat), скрипт VBScript або виконуваний файл. Вивантажте його до гостьової системи за допомогою L<guestfish(1)>. У цьому прикладі скрипт називається C<test.bat> і його вивантажено до C<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

У цьому прикладі ми використовуємо ключ C<RunOnce>, який означає, що скрипт буде запущено лише один раз під час першого входу користувача до системи. Якщо вам потрібно, щоб скрипт запускався кожного разу, коли користувач входить до системи, замініть C<RunOnce> на C<Run>.

Оновіть регістр:

 virt-win-reg --merge WindowsGuest test.reg

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

У цьому розділі ми припускаємо, що ви обізнані із роботою служб Windows і маєте програму, яка обробляє протокол керування службами Windows безпосередньо або хочете запустити будь-яку програму за допомогою обгортки служби, наприклад SrvAny або безкоштовної RHSrvAny.

Спочатку вивантажте програму і, якщо потрібно, обгортку служби. У нашому прикладі тестова програма має назву C<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

Нотатки:

=over 4

=item *

Щодо використання C<ControlSet001> див. розділ вище на цій сторінці підручника. Ймовірно, вам слід скоригувати цей запис відповідно до керівного набору, який використовується вашою гостьовою системою.

=item *

C<"ObjectName"> керує правами доступу, які матиме служба. Альтернативою є C<"ObjectName"="LocalSystem">, яка надає права доступу найпривілейованішого облікового запису.

=item *

Щодо значення «магічних чисел» ознайомтеся із цією статтею бази даних знань Microsoft: L<http://support.microsoft.com/kb/103000>.

=back

Оновіть регістр:

 virt-win-reg --merge WindowsGuest service.reg

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

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

Регістр символів шляхів і назв значень береться до уваги під час обробки.

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

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

=head1 АВТОР

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

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

©Red Hat Inc., 2010

