В нынешнем проекте столкнулся с интересной задачей – необходимо было мигрировать все настроенные принтера из профиля пользователя из Windows XP в Windows 7. Все это надо реализовать через два сценария – refresh или in place, это когда мы проводим установку Windows 7 из Windows XP с миграцией всех пользовательских данных в SCCM State Migration Point (SMP) и второй – replace или side by side, это когда есть два компьютера: один с Windows XP и второй с Windows 7, при этом SMP не используем (идея не моя, а Заказчика, я бы сделал все через SCCM), а данные мигруем через ручной запуск USMT и все пользовательское барахло складываем на внешний винт. Далее подключаем этот винт в Windows 7 и запускаем скрипт USMT для восстановления данных. Почему был выбран ручной метод – потому что не во всех удаленных офисах Заказчика есть SCCM, а мигровать надо. Ну да ладно, мне только лучше, т.к. задачка интересная и к тому времени я ее уже решил с помощью SCCM, а теперь вот надо все это повторить в скриптованном виде.
Для решения первой задачи воспользовался статьей с Технета «When using USMT 4 in a Configuration Manager 2007 SP2 OSD Task Sequence, files are captured successfully but settings are not» http://support.microsoft.com/kb/2018593. После добавления соответствующего шага в Task Sequence, я получил требуемый результат – все принтера из пользовательского профиля успешно перекочевали в Windows 7.
Решение второй части через скрипты заняло у меня какое-то время и предыдуший совет не работал. Все мигровалось, кроме принтеров. Помощь пришла неожидано – от коллеги Alexey Semibratov’а (http://blogs.msdn.com/b/alex_semi). Я давненько почитываю его блог, но решения моей задачи там не было. Не долго думая я нашел его в майкрософтовском OCS’е и «постучался» с вопросом. Ответа он не знал, но дал очень занимательную переписку из внутреннего дистрибьюшен листа (на который я сразу же подписался), информация из которого и дала мне ключ к разгадке. Так вот, для использования USMT 4.0 с ручным запуском команд scanstate и loadstate, необходимо подготовить отдельный XML файл, я назвал его custom.xml, куда поместил следующий код:
<?xml version=”1.0″ encoding=”UTF-8″?>
<migration urlid=”http://www.microsoft.com/migration/1.0/migxmlext/miguser/NetworkPrinters”>
<component context=”UserAndSystem” type=”System” defaultSupported=”FALSE”>
<displayName _locID=”migsys.Printer”>Printer</displayName>
<role role=”Settings”>
<detects>
<detect>
<condition>MigXmlHelper.DoesOSMatch(“NT”,”*”)</condition>
</detect>
</detects>
<rules>
<destinationCleanup>
<objectSet>
<pattern type=”Registry”>HKCU\Printers\* [*]</pattern>
<pattern type=”Registry”>HKCU\software\microsoft\windows NT\currentVersion\Windows\* [*]</pattern>
</objectSet>
</destinationCleanup>
<include>
<objectSet>
<pattern type=”Registry”>HKCU\Printers\* [*]</pattern>
<pattern type=”Registry”>HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices\* [*]</pattern>
<pattern type=”Registry”>HKCU\software\microsoft\windows NT\CurrentVersion\printerPorts\* [*]</pattern>
<pattern type=”Registry”>HKCU\software\microsoft\windows NT\CurrentVersion\Windows\* [*]</pattern>
<pattern type=”Registry”>HKLM\software\microsoft\Windows NT\CurrentVersion\Print\Printers\* [*]</pattern>
<pattern type=”Registry”>HKLM\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows NT x86\Drivers\* [*]</pattern>
<pattern type=”Registry”>HKLM\SYSTEM\ControlSet001\Control\Print\Environments\Windows NT x86\Drivers\* [*]</pattern>
<pattern type=”Registry”>HKLM\SYSTEM\CurrentControlSet\Control\Print\Printers\* [*]</pattern>
<pattern type=”Registry”>HKLM\SYSTEM\ControlSet001\Control\Print\Printers\* [*]</pattern>
<pattern type=”Registry”>HKLM\SYSTEM\CurrentControlSet\Services\lanmanserver\Shares\* [*]</pattern>
<pattern type=”Registry”>HKLM\SYSTEM\ControlSet001\Services\lanmanserver\Shares\* [*]</pattern>
</objectSet>
</include>
</rules>
</role>
</component>
</migration>
Далее я запустил следующую команду на Windows XP:
scanstate.exe .\UserDataStore /o /localonly /c /efs:copyraw /all /progress:.\scanstateprogress.log /i:. \x86\migapp.xml /i:.\x86\miguser.xml /i:.\x86\custom.xml
Все данные пользователя мигранули в папку UserDataStore\USMT, в файл USMT.MIG. После этого переключил внешний винт в Windows 7 и запустил следующую команду:
loadstate.exe .\UserDataStore /c /all /progress:.\loadstateprogress.log /i:.\x86\migapp.xml /i:.\x86\miguser.xml /i:.\x86\custom.xml
Загрузился под пользовательским аккаунтом и как результат – подключенные принтера.