В предудущем посте, мы выяснили, что за сохранность Registry администрация ответственности не несет. В этом расскажу о том, что можно сделать своими руками по этому поводу с помошью User Profile Hive Cleanup Service (UPHClean) и утилиты ERUNT. В завершение привожу пример того, как это сделал я.
Историческая справка.
Registry, каким мы его знаем, впервые появился в Win95, и сразу стало понятно, что терять/портить его не стоит. Благо, в OC семейства Win9x реестр автоматически бекапился при старте системы. При этом держалось от двух (Win95) до пяти (Win98/ME) уровней отката. Ручной бакап тоже не представлял проблем, т.к. достаточно было перегрузить компьютер в DOS-режиме и скопировать несколько файлов в безопасное место. Также Microsoft предоставляла утилиту ERU, которая бакапила реестр прямо из Windows.
С приходом Win2000 и ее производных (WinXP/Vistal/7) ситуация изменилась в корне. В системах на основе NT файлы Registry (C:\Windows\System32\Config и %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. Тем не менее,
Другого простого способа бакапить реестр целиком не было, и его пришлось придумать. Так появилась ERUNT (ERU для NT).
ERUNT.
ERUNT была разработана немецким специалистом по имени Lars Hederer, и, собственно, резервирует реестр любой WinNT-подобной ОС (NT/2K/2K3/XP/Vistal/7) в заданный каталог "по-живому" (т.е. не при перезагрузке, а в любое время в процессе работы ОС).
Подробности применения можно почитать в файле readme, я же расскажу о том, чем она понравилась лично мне, и как я ее использую.
В завершение прилагаю ERUNT.INI и .XML для Task Scheduler'a (к сожалению, похоже, CMS КО не позволяет грузить на сервер произвольные файлы - только картинки).
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>APCNB\apc</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>APCNB\apc</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:\bin\ERUNT\AUTOBACK.EXE</Command>
<Arguments>D:\Install\__Backups\RegBackup-ERUNT\#Date#-#Time#</Arguments>
<WorkingDirectory>C:\bin\ERUNT\</WorkingDirectory>
</Exec>
</Actions>
</Task>
В общем, автор утилиты занимается этим вопросом с 2001 года и свое дело знает - очень рекомендую к применению!