SCCM 2012 - Возвращаясь к проблеме Double UUID

imageС приходом новой версии Configuration Manager вернулась старая проблема невозможности развёртывания ОС при наличии совпадающих аппаратных идентификаторов Universal Unique Identifier (UUID или BIOS GIUD) материнских плат. Эксперименты с новой версией SCCM показали, что, как и в прошлой версии, проблема проявляет себя на начальном этапе развёртывания ОС в двух местах :

1) При загрузке по PXE не загружается первичная среда установки WinPE
2) При загрузке с носителя CD/USB после успешной инициализации WinPE возникает ошибка получения последовательности задач Task Sequence.

Разумеется самым правильным методом решения этих проблем можно считать регенерацию аппаратного идентификатора на тех компьютерах, где это возможно технически. Если такой подход не рассматривается в силу каких-то сложностей, воспользуемся обходными решениями, которые удалось успешно проверить.

Для решения первой проблемы с PXE воспользуемся статьёй "No Assigned Task Sequence when initiating deployments caused by duplicate SMBIOS GUIDs in System Center Configuration Manager 2007" и соответствующей ей статьёй в базе знаний KB2591483
В документе
How PXE Requests Work в разделе Banned GUIDs описан параметр реестра службы Windows Deployment Services (WDS) (из статьи Windows Deployment Services Registry Entries), с помощью которого можно задать перечень значений UUID которые попадаются в нашем окружении на более чем одном компьютере.

Куст реестра: HKEY_LOCAL_MACHINE
Ветка: SYSTEM\CurrentControlSet\Services\WDSServer\Providers\WDSPXE
Ключ: BannedGuids
Тип значения:
REG_MULTI_SZ

В указанной документации можно увидеть, что значение этого ключа реестра может содержать перечень дублирующихся UUID по одному значению в каждой отдельной строке в виде A1BA312E-681C-458D-AF75-3F0D2A7D0FE0 (регистр, как я понял, значения не имеет)

Также значения в этот ключ можно добавлять с помощью утилиты wdsutil:

wdsutil /set-server /bannedguidpolicy /add /GUID:A1BA312E-681C-458D-AF75-3F0D2A7D0FE0

Я пробовал использовать как первый, так и второй метод. Работают оба, правда при втором методе значение UUID попадает в ключ реестра в каком-то преобразованном в другой формат виде, поэтому для большей ясности для себя я решил использовать метод прямого редактирования ключа реестра.

image

После изменения реестра нужно перезапустить службу WDS:

net stop WDSServer & net start WDSServer

После этого загрузка по PXE должна проходить успешно, но сразу после инициализации среды WinPE мы столкнёмся со второй проблемой, – невозможностью получения последовательности задач. Её мы решим с помощью обходного решения описанного в замет Idan at myITforum.com - How to enable OSD with duplicate UUID in Configuration Manager. Несмотря на то что решение описано довольно давно и в нём речь идёт о SCCM 2007, его удалось успешно проверить и на SCCM 2012.

Откроем SQL Server Management Studio, подключимся к базе данных SCCM и найдём хранимую процедуру NBS_LookupDevice (Programmability > Stored Procedures > dbo.NBS_LookupDevice)

Найдём и закомментируем строку:

ON xref.MachineID = aux.ItemKey AND aux.SMBIOS_GUID0 = @SMBIOS_GUID

Ниже добавим строку:

ON xref.MachineID = aux.ItemKey AND aux.SMBIOS_GUID0 = @SMBIOS_GUID + '.'

Выполним указанный код (Execute)
В итоге фрагмент изменённого кода хранимой процедуры будет выглядеть так:

image

Затем найдём хранимую процедуру MP_GetClientIDFromSmbiosID (Programmability > Stored Procedures > dbo.MP_GetClientIDFromSmbiosID)

Найдём и закомментируем строку:

(M.SMBIOS_GUID0 = @vchSmbiosID)

Ниже добавим строку:

(M.SMBIOS_GUID0 = @vchSmbiosID + '.')

Выполним указанный код (Execute)
В итоге фрагмент изменённого кода хранимой процедуры будет выглядеть так:

image

Таким образом мы обманем механизм проверки существования UUID в БД. То есть при проверке к оригинальному BIOS GUID компьютера в конце просто будет добавляться лишний символ - точка, а компьютера с таким UUID в БД разумеется обнаруживаться не будет, и процедура проверки будет считать что компьютер уникален и будет разрешать запуск процесса развёртывания ОС.

Стоит помнить, что после применений обновлений к Configuration Manager, возможно код хранимой процедуры будет возвращён в исходное состояние, и нам снова потребуется его корректировка.

Немного не по теме. Пока игрался с виртуальными машинами Hyper-V выяснил, что для того, чтобы создать две виртуальные машины с одинаковым UUID достаточно выполнить обычное штатное клонирование ВМ. Для того чтобы узнать UUID виртуальной машины есть три способа:

  • UUID отображается во время включения и загрузки виртуальной машины с устаревшим сетевым адаптером (Legacy Network Adapter) при загрузке по PXE
  • Посмотреть содержимое {VMGUID}.xml файла расположенного в подкаталоге Virtual Machines каталога хранения виртуальной машины. В файле нужно найти значение тэга bios_guid
  • На хосте виртуализации через PowerShell:

    Get-WmiObject –Namespace "RootVirtualization" –class "Msvm_VirtualSystemSettingData" | Select ElementName, BIOSGUID | Where {$_.ElementName -eq "KOM-AD01-WS302"} | ft -auto

Всего комментариев: 3 Комментировать

  1. iadmin /

    Спасибо за статью, в своё время сталкивался с проблемой, но поленился написать развернуто об этом.

  2. Калин Димитров /

    100% working!! Thanks from Bulgaria!

  3. Евгений /

    Где тут ставят плюсик в карму! спасибо!

Добавить комментарий