Миграция сетевых принтеров из Windows XP в Windows 7

В нынешнем проекте столкнулся с интересной задачей – необходимо было мигрировать все настроенные принтера из профиля пользователя из 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

Загрузился под пользовательским аккаунтом и как результат – подключенные принтера.

Advertisements

About sccmgeek
IT Pro consultant

12 Responses to Миграция сетевых принтеров из Windows XP в Windows 7

  1. Melkii says:

    добрый день. А как в SCCM это проделать?

    • sccmgeek says:

      Очень просто. В шаге “Capture User State” выберите “Customize how user profiles are captured”, нажмите кнопку Files и добавьте все XML файлы, которые вы используете в USMT. Все тоже необходимо повторить с шагом “Restore User State”. Удачи!

  2. Melkii says:

    ещё: я данный текст кода копирую в блокнот и сохраняю в .xml и больше никаких итераций не нужно делать?)

    • sccmgeek says:

      Не забудьте добавить шаг в TS описанный здесь http://support.microsoft.com/kb/2018593

      • Melkii says:

        Да, я добавил шаг, указал файлы, также использовал http://blogs.technet.com/b/configurationmgr/archive/2010/06/30/how-to-use-usmt-4-hardlinking-in-a-configuration-manager-2007-task-sequence.aspx ,но у меня не мигруруются принтеры, если добавляю Ваш файл…
        Файл сохранять в кодировке UTF-8 и расширением xml?
        Заранее благодарен!

      • sccmgeek says:

        Хм, странно. А какие ошибки в лог файлах scanstate и loadstate? Вы не забыли добавить шаг в TS описанный здесь http://support.microsoft.com/kb/2018593? Попробуйте запустить USMT вручную, из командной строки, на XP, проверить лог, а потом на W7 и проверить лог опять. Трудно что-то посоветовать не видя вашей инфраструктуры, но я бы действовал следующим образом:
        1. Запустил бы USMT вручную, как указал выше
        2. Если не работает, но попытался бы найти причину и устранить ее
        3. Если все заработало вручную, то повторил бы все в TS с SMP (state migration point)
        4. Если есть ошибки, то сконцентрировался бы их устранении
        5. Изменил бы сценарий TS и подключил бы использование hardlinks

        Удачи!

  3. Melkii says:

    Добрый день. Запустил вручную USMT, как указано выше. Выдало ошибку : 2011-12-14 13:41:41, Error [0x08055b] MXE Agent: XML parse error while loading script C:\Program Files\USMT\x86\custom.xml. Message: hResult = 0x0, Line = 1, Position = 15; A string literal was expected, but no opening quote character was found.
    .
    2011-12-14 13:41:41, Error [0x000000] EngineStartup caught exception: XmlException: hResult = 0x0, Line = 1, Position = 15; A string literal was expected, but no opening quote character was found.
    . void __thiscall UnBCL::XmlDocument::Load(class UnBCL::String *)

    Хотя Ваш код скопировал и вставил, никаких изменений не делал….

  4. Melkii says:

    в продолжении: я данный код копирую в блокнот- сохранию с расширением .xml и кодировкой UTF-8. Так нужно его сохранять?
    Заранее благодарен!

    • sccmgeek says:

      Похоже что проблема с custom.xml файлом. Я всегда сохраняю все фалы в формате unicode

      • Melkii says:

        нашел в чем проблема была. это в коде. исправил. когда запускал вручную – принтеры смигрировал. Когда запустил с помощью sccm – не получилось. А где логи scanstate и loadstate хранятся?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: