Сохранность Registry своими руками

в 10:59, , рубрики: backup, Registry, windows, реестр, системное администрирование, метки: , ,

Недавно пострадал от потери NTUser.dat и с ним всего HKCU под Windows7 да так, что Windows Restore не помог — пришлось подниматься из бакапа месячной давности. В результате сильно озаботился вопросом резервирования реестра. Как выяснилось, Win7/Vista никакого резервирования «чисто» реестра (в отличии от XP) не предлагают. В этом посте расскажу о том, что можно сделать своими руками по этому поводу с помошью утилиты ERUNT и User Profile Hive Cleanup Service (UPHClean). В завершение привожу пример того, как это сделал я.

Историческая справка.

Registry, каким мы его знаем, впервые появился в Win95, и сразу стало понятно, что терять/портить его не стоит. Благо, в OC семейства Win9x реестр автоматически бекапился при старте системы. При этом держалось от двух (Win95) до пяти (Win98/ME) уровней отката. Ручной бакап тоже не представлял проблем, т.к. достаточно было перегрузить компьютер в DOS-режиме и скопировать несколько файлов в безопасное место. Также Microsoft предоставляла утилиту ERU, которая бакапила реестр прямо из Windows.

С приходом Win2000 и ее производных (WinXP/Vistal/7) ситуация изменилась в корне. В системах на основе NT файлы Registry (C:WindowsSystem32Config и %userprofile%ntuser.dat) всегда открыты и используются. В итоге стали проявляться неприятные баги, некоторые из которых встречаются и по сей день. Почти все они являются последствиями одного сценария: какая-то программка открывает ключ в Registry и забывает его закрыть. В результате, может происходить ряд интересных побочных эффектов:

* Во-первых, если не закрыт ключ в HKCU, logoffперезагрузка/выключение компьютера может занять оооооочень много времени — Windows терпеливо ждет, пока все программы освободят HKCU, чтобы отлогинить пользователя (чего не происходит, если глючная программка прописана как системный сервис).

* Во-вторых, некоторые изменения так и не «сбрасывались» в реестр, и в итоге не сохранялись после перезагрузки. Особенно сильно это напрягало корпоративных пользователей с Roaming профайлами, которым зачастую приходилось, к примеру, каждый раз наблюдать сообщение «Please wait while Windows configures <программка>» при запуске какого-нибудь офисного приложения. В результате в Vista/W7 мы имеем файлы транзакций реестра (regtrans-ms), которые иногда занимают больше места, чем сами файлы реестра :)

* В худшем случае при перезагрузке нарушалась целостность реестра и можно было лишиться хайва целиком (чаще всего, опять же, HKCU). Это, кстати, продолжается по сей день, довольно много шума поднимается по поводу сервиса обновляющего Google Chrome, который любит открывать много дескрипторов и забывает закрывать некоторые из них.

Проблема была настолько серьезной, что Microsoft выпустила специальный сервис "User Profile Hive Cleanup Service", который насильно отключает всех от registry при перезагрузке (правда, только для HKCU/ntuser.dat). Очень рекомендую.

Все это показало насколько целостность реестра критична для систем на базе WinNT. Тем не менее,

  • В NT/2000 вообще нет автоматического бакапа реестра.
  • В WinXP бакап реестра производится только в процессе общего резервирования системы (если выбрать Backup System State). При этом файлы ОС (~500MB) кладутся в указанный пользователем каталог, а резервная копия реестра оказывается в C:WindowsRepair, откуда ее надо скопировать ручками (ну, или удалить 500М барахла, если вам нужно было забакапить только реестр). К сожалению, графический интерфейс Windows не позволяет выбирать подкаталоги в NUL :)
  • В Vista/W7 бакап производится в VHD всего целиком и никакого WindowsRepair нет впомине. Налицо оптимизм MS.

Другого простого способа бакапить реестр не было, и его пришлось придумать. Так появилась ERUNT (ERU для NT).

ERUNT.

ERUNT была разработана немецким специалистом по имени Lars Hederer, и, собственно, резервирует реестр любой WinNT-подобной ОС (NT/2K/2K3/XP/Vistal/7) в заданный каталог «по-живому» (т.е. не при перезагрузке, а в любое время в процессе работы ОС).

Подробности применения можно почитать в файле readme, я же расскажу о том, чем она понравилась лично мне, и как я ее использую.

  • Обладает GUI и CLI для резервирования и восстановления. Очень удобно использовать GUI для тестирования, а потом закатать все в параметры командной строки и создать Task (о чем ниже). Аналогично для воостановления: для полного восстановления можно сделать простой батник, для каких-то особенных ситуаций можно запустить GUI и выбрать то, что нужно.
  • Позволяет выбирать хайвы (системные и пользовательские) — можно бакапить: систему, профайл пользователя, профайлы других пользователей, все вместе. Вначале у меня был план «бакапить все раз в неделю, бакапить профайл каждый день», но программка работает настолько быстро, и бакапы занимают настолько мало места, что теперь просто бакаплю все каждый день.
  • Восстанавливает реестр из специального загрузчика или Windows Recovery Console. Обычно, хватает консоли (т.к., фактически происходит банальная перезапись файлов).
  • Устанавливается через инсталлер, но, вроде, никаких файлов за пределы своего каталога не кладет, так что годна к portable-применению. В каталоге хранится .INI файл, в который можно записать значения по умолчанию, что позволяет уменьшить количество задаваемых каждый раз ключей командной строки. В любом случае, утилита восстановления работает полностью независимо.
  • Куча интересных опций автоматизированного бакапа. Для себя сделал следующее:
    • В каталоге D:Install__BackupsRegBackup-ERUNT создаются подкаталоги с датой-временем в нужном мне формате (прим. RegBackup-ERUNT2012-04-19-17.00.04).
    • В каждом таком подкаталоге лежат, собственно, хайвы registry и утилита восстановления (чтобы не напрягаться).
    • Хранится история бакапов за 30 дней (можно настроить по количеству, скажем, 5 последних, или по времени). Старые удаляются автоматически (отключаемо).
    • Если сегодня бакап уже делали — второй (третий, и т.д.) раз пропускается. (полезно, т.к. в Task Scheduler'е стоит опция «если пропущено время запуска задачи — запустить при первой возможности», таким образом могут быть запущены два бакапа за день).
    • Стандартные опции вроде тихого режима и т.д.
    • Особенно впечатлило то, что в тоге я избавился от большей части ключей командной строки, т.к. значения, по умолчанию выставленные автором, делают как раз то, что мне нужно! :) Остальное было выставлено в INI-файле и в итоге огромная командная строка была сведена к AUTOBACK.EXE <имя каталога для бакапов>#Date#-#Time#.

В завершение прилагаю ERUNT.INI и .XML для Task Scheduler'a.

ERUNT.INI (в каталог с ERUNT):

[ERUNT]
DefaultDestinationFolder=D:Install__Backups
DateFormat=yyyy/mm/dd
DateSeparator=-
TimeFormat=hh:mm:ss
TimeSeparator=.

ERUNT.XML (импортируется в Task Scheduler, подправьте имя юзера и пути):

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2012-04-01T21:27:40.026817</Date>
<Author>APCNBapc</Author>
</RegistrationInfo>
<Triggers>
<CalendarTrigger>
<StartBoundary>2012-04-01T17:00:00</StartBoundary>
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>APCNBapc</UserId>
<LogonType>S4U</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>false</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
<Priority>7</Priority>
<RestartOnFailure>
<Interval>PT1H</Interval>
<Count>3</Count>
</RestartOnFailure>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:binERUNTAUTOBACK.EXE</Command>
<Arguments>D:Install__BackupsRegBackup-ERUNT#Date#-#Time#</Arguments>
<WorkingDirectory>C:binERUNT</WorkingDirectory>
</Exec>
</Actions>
</Task>

В общем, автор утилиты занимается этим вопросом с 2001 года и свое дело знает — очень рекомендую к применению!

Автор: apcsb

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js