Главная System Center, Новое Dublicate SMBIOS GUID
  • Dublicate SMBIOS GUID

    Многие коллеги, с которыми я общаюсь, знают, что я являюсь «счастливым» обладателем целого зоопарка компьютеров. Поэтому построение процесса OSD SCCM у меня в компании было далеко не тривиальной задачей: разное железо, и как результат разные наборы драйверов, уровней HAL. Одной из наиболее застарелых и болезненных проблем была проблема с совпадающими значениями SMBIOS GUID. Не так давно она меня окончательно довела и я постарался ее решить.

    В чем же заключается проблема?

    Чтобы понять проблему, нужно знать, как работает OSD SCCM, а точнее как ConfigMgr определяет, известен ли компьютер или нет и соответственно предлагает клиенту для выполнения тот или иной Task Sequence.

    И так, рассмотрим первую ситуацию. Мы пытаемся установить ОС с помощью ConfigMgr на компьютер, который никогда не был в нашей иерархии SCCM, т.е. записи о нем нет в базе. В терминах SCCM такой компьютер будет называться «неизвестным» (unknown). И при включенной поддержке "unknown computer", он будет получать Task Sequence, которые назначены на коллекцию All Unknown Computers.

    Если же компьютер уже был в иерархии, на нем был установлен агент ConfigMgr или информация о нем была вручную добавлена через механизм Computer Associations, то такой компьютер будет «известным» (known) , в терминологии SCCM. И чтобы установить ОС на него, мы должны такой компьютер добавить в коллекцию, на которую назначен один из Task Sequence.

    Рассмотрим ситуацию из жизни.

    У нас имеется рабочий процесс OSD. Приходит заявка на переустановку компьютера или на установку нового компьютера. Подключаем его к сети, загружаем Win PE и видим надпись Failed Task Sequence. После того, как начинаем проверять логи работы WinPE, обнаруживаем что SCCM считает наш компьютер «известным». Более того, почему то указывает его NETBIOS NAME как имя другого компьютера. Виноваты в этом производители (сборщики) компьютеров.

    Дело в том, что SCCM использует следующий механизм проверки, известен ей компьютер или нет:

    1. Определяется BIOS GUID компьютера, по нему производится выборка в БД. Если найдено несколько записей, то запись с наибольшим значением ResourceID будет признана искомым компьютером;
    2. Если поиск по BIOS GUID не дал результатов, то производится поиск по MAC-адресу компьютера. Аналогично BIOS GUID, при нахождении двух одинаковых значений MAC-адреса, сервер вернет клиенту информацию о более новой записи (со старшим ResourceID);
    3. Если MAC-адрес компьютера в базе так же не найден, такой компьютер считается не известным (unknown) SCCM и на него начинают действовать Task Sequence назначенные на коллекцию All unknown computers.

    Что такое SMBIOS GUID

    UUID (GUID) это 128 битовый уникальный идентификатор системы в сети. Механизм генерации его значения описан в RFC 4122 в 1998 и фактически является функцией от текущего времени. Данный идентификатор записывается в энергонезависимую память BIOS чипа. Более того, обновление BIOS не должно приводить к смене GUID. Отчистка или сброс BIOS так же не должны изменять его значение.

    Поставщики чипов для BIOS должны заполнять это поле значениями FFFF, а производители материнских плат должны вносить свои значений, перед поставкой платы конечному потребителю. К сожалению, многие сборщики компьютеров (в их числе, кстати, и такие гиганты как HP и Dell), не утруждают себя заполнением всех обязательных полей. По идее, производитель должен заполнить поля:

    • Manufacturer
    • Product Name
    • Version
    • Serial Number
    • GUID

    И если первые два поля производители все же стараются заполнять (хотя встречаются и такие записи в этих полях: «To Be Filled By O.E.M.», «123456», «System Product Name» ), то поле GUID многие из них оставляют не измененным (значения FFFF….) либо забивают нулями . Особо сознательные производители все же ставят после 31 нуля единичку .

    А между тем, поле GUID используется SCCM для определения «вхождения» в иерархию сайтов ConfigMgr. Напомню, это поле было определено в RFC 4122 в 1998 году! Кроме того, с 2005 года заполнение этого поля реальными данными является требованием для получения логотипа «Designed for Windows». (http://www.microsoft.com/whdc/system/platform/firmware/SMBIOS.mspx)

    И если HP или Dell признают такую проблему для некоторых своих старых систем и обеспечивают пользователя утилитами для регенерации GUID, то многочисленные поставщики оставляют пользователя один на один с этой проблемой.

    Группа риска

     

    Чтобы понять, коснулась вас проблема или нет, воспользуемся отчетом:

    select rs.Name0, rs.SMBIOS_GUID0, cnt

    from dbo.v_R_System as RS

    inner join ( select SMBIOS_GUID0, count (*) as cnt

    from dbo.v_R_System where SMBIOS_GUID0 is not NULL

    group by SMBIOS_GUID0 having count(Name0) > 2 ) as q

    on rs.SMBIOS_GUID0 = q.SMBIOS_GUID0

    order by rs.SMBIOS_GUID0

    Как приручить дракона?

    И так проблема известна, рассмотрим возможные варианты решения.

    Сценарий 1

    Вы являетесь пользователем «брендового железа» и обнаружили, что часть ваших компьютеров содержит неверный GUID. Обратитесь в службу технической поддержки производителя для получения утилиты регенерации GUID.

    Описание проблемы и метод решение для Dell: http://social.technet.microsoft.com/Forums/en-US/configmgrosd/thread/76198d2e-5957—4518-afd2-fe5ebee88dc0

    Описание проблемы и метод решения для HP: http://maksimov-ai.spaces.live.com/blog/cns!ECC51050AA7A91D8!749.entry

    Сценарий 2

    Если производитель материнской платы не идет на контакт, то придется решать проблему самостоятельно.

    Благодаря своему большому «зверинцу» различных материнских плат мне удалось обнаружить эту проблему в BIOS от компании Phoenix-Award и AMI.

    К сожалению, исправляемые параметры в AMI BIOS надежно защищены от перезаписи, по крайней мере мне не удалось изменить нужное мне поле ни одним методом, и сейчас я пытаюсь добиться признания проблемы от производителя этой материнской платы.

    Во всех остальных случаях нам поможет утилита DMICFG. Хотя она и предназначена в первую очередь для AWARD BIOS, с помощью нее я смог редактировать данные и в биосе других производителей.

    Рассмотрим работу программы на примере BIOS от AWARD.

    1. Создаем загрузочную дискету MSDOS и записываем на нее файл DMICFG.EXE
    2. Загружаем компьютер с данной дискеты и запускам утилиту
    3. В появившемся окне переходим к разделу System и нажимаем Enter

    1. Теперь мы можем внести необходимую нам информацию. Можно исправить все поля или ограничится сменой UUID. Для изменения поля, необходимо перейти на него с помощью стрелок и нажать Enter. Запись измененных значений производится по нажатию клавиши F10

    1. Теперь надо сформировать и заполнить поле UUID. Конечно, можно пойти по пути наименьшего сопротивления и просто вносить туда набор случайных чисел. Но есть стандарт и давайте хотя бы мы будем его придерживаться. К тому же это совершенно не сложно. Для этого запускаем PowerShell и выполняем следующую команду (Спасибо Василию Гусеву 😉 )

    1. Полученные данные вбиваем в поле UUID и нажимаем кнопку F10 – Update DMI
    2. Если появилась надпись «UPDATE SUCCESSFULLY» значит все прошло как надо и можно нормально устанавливать ОС через OSD процесс.

    Причиной ошибки записи в данные поля, могут быть настройки самого BIOS либо наличие специальной перемычки на материнской плате. В таком случае вам нужно будет обратиться к документации по вашей материнской плате и выяснить способ разрешения записи в эти поля.

    Сценарий 3

    Если ничего не помогло, поставщик оборудования на контакт не идет, утилиты записать данные не могут, остается только путь обмана J

    Обманывать мы будем ConfigMgr. И тут у нас есть два варианта, которые проистекают из механизма определения known\unknown computers

    Первый, самый простой.

    Через механизм Computer Associations – Import Computer мы создаем новую запись только для нашего компьютера. При этом используем поля Name и SMBIOS GUID. И в поле SMBIOS GUID вбиваем данные того реального дублирующего GUID который задан компьютеру в данный момент. Путем такой нехитрой операции мы создадим запись в базе данных, у которой будет самый новый ResourceID, соответственно именно эта запись будет проверятся на членство в коллекциях.

    Второй способ более сложен.

    Удалить записи всех объектов-компьютеров, которые имеют совпадающий GUID. После чего с помощью механизма Computer Associations – Import Computer добавить записи о них в базу данных, при этом заполняя поля Name и MAC адрес.

    Стоит отметить, что такой проблеме в основном подвержены старые материнские платы. В приложенном к статье архиве находится DMICFG и несколько похожих утилит для редактирования DMI области BIOS.

     

    Алексей Тараненко

    MVP: ConfigMgr 2007

    • Рубрика: System Center,Новое
    • Автор: Алексей Тараненко
    • Дата: Вторник 27 Апр 2010

Комментарии

  1. > многочисленные поставщики оставляют пользователя один на один с этой проблемой

    Вариантов несколько — либо потомки дедушки Ляо предпочитают OSD собственного изготовления (10 миллионов китайских админов), либо это такой тайный стимул покупать брендовое железо 🙂

    P.S. Проблему «инвертированной» записи GUID'ов повторить не получилось?

  2. >Проблему «инвертированной» записи GUID'ов повторить не получилось?

    Получилось, но я не считаю это проблемой. Инвертируется всегда. Т.е. с точки зрения ConfigMgr GUID там всегда один и тот же, к тому же уникальный. Конечно есть вариант что он внезапно совпадет. Но надеюсь что для 128 бит эт вероятность мала 🙂

    Хотя в процессе решения проблемы где-то видел, что порядок чтения GUID так же задается в BIOS.

  3. Если я гуиды буду забивать с дисплея, они просто работать не будут, так что скорее это всё-таки проблема 🙂

  4. Не, в таком ключе естественно проблема, тока зачем их забивать вручную?

  5. Коллеги, нет никакой проблемы просто представление GUID/UUID в текстовом формате имеет другую последовательность шестнадцатеричных блоков и цифр чем текстовое. Шестнадцатиричное обычно записывается непрерывной последовательностью или в формате xAAxBBxCCx11..., а текстовое представление всегда в формате {aaaaaaaa-bbb-ccc-ddd...}.

    Вот статься как их надо преобразовывать: support.microsoft.com/kb/325648

  6. Константин!

    Тут речь идет о том, что в процессе получения адреса от DHCP при работе PXE агента, GUID отображается в формате «aaaaaaaa-bbb-ccc-ddd...» и иногда (у меня случай один из десяти) WinPE воспринимает данный GUID уже по другому. Действительно по тому алгоритму что указан в статье. Но в большинстве случаев GUID отображаемый при работе PXE agent и получаемый WinPE совпадают.

  7. Мы столкнулись с аналогичной проблемой. Разница только, по всей, видимости в объемах. В нашем «зверинце» компьютеров с неуникальными GUID оказалось около трети (где-то до 3 тысяч). Разбросаны они по всей стране, поэтому первые два сценария категорически не подходят. Третий способ также не совсем удобен, т.к. требует каждый раз выполнять внесение новой записи (и GUID и MAC) или удаления дубликатов. Слишко много возни и велика вероятность ошибки при введении GUIDа.

    Мы пошли также по пути «обмана SCCM», но радикальным и в то же время более простым (с точки зрения дальнейшей эксплуатации) способом. В чем его суть?

    Во-первых, надо получить список неуникальных GUIDов в системе. (в подробности SQL-запроса не вникаем).

    Во-вторых, вносим изменения в текст одной процедуры. За поиск в БД SCCM требуемого компьютера отвечает хранимая процедура NBS_LookupDevice. Мы поменяли текст процедуры, а именно на входе процедуры поставили проверку GUIDа. В случае, если он принадлежит списку неуникальных GUIDов (полученном ранее), то переменной содержащей этот GUID присваивается выдуманное уникальное значение (на усмотрение исполнителя). Все. Дальше SCCM выполняет OSD на любую рабочую станцию с неуникальным ГУИДом, входящим в ранее приведенный перечень.

    В дальнейшие ньюансы логики работы SCCM вникать не будем — с точки зрения экономии времени читателя.

    Единственный недостаток этого способа — процедуру придется править каждый раз, когда будет выполнено кардинальное обновление SCCM, переписывающих структуру БД. (Но это событие из разряда «раз в год» 🙂

    Для ленивых привожу оператор, который надо вставить в текст процедуры:

    IF @SMBIOS_GUID IN ('FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF',

    '03000200-0400—0500-0006-000700080009',

    ,

    'FEFEFEFE-FEFE-FEFE-FEFE-FEFEFEFEFEFE')

    BEGIN

    SET @SMBIOS_GUID ='EFFEC315-EBA0-BAB3-EFFE-C315EBA01290';

    END

  8. Очень интересный метод. GUID «EFFEC315-EBA0-BAB3-EFFE-C315EBA01290» я так понимаю жестко забит?

  9. ну прям очень интересный метод. Изменил процедуру NBS_LookupDevice, как советует Александр Sh в 7ом отзыве, но так ничего и не заработало... 🙁 в SMSpxe.log все теже — MAC=00:19:66:D9:E1:C2 SMBIOS GUID=03000200-0400—0500-0006-000700080009 > Device found in the database. MacCount=0 GuidCount=19 smspxe 31.05.2010 17:12:33 2280 (0x08E8) и унылое ProcessDatabaseReply: No Advertisement found in Db for device smspxe 31.05.2010 17:12:37 2280 (0x08E8)

    ...впадаю в отчаянье, так как на в ответ на замену GUIDs в AMI BIOS слышится не менее унылое DMI ONLY READ

  10. BINGO!!!

    How to enable OSD with duplicate UUID in Configuration Manager

    When you have more then on machine with the same UUID, SCCM will not pick the correct ResourceID when receiving a PXE request but pick last one that was added, therefore advertisements may not be assigned (the no boot actions message) and the variables of another machine might be assigned by mistake. This can occur when the motherboard manufacturer assigns a single UUID per model (such as some ASUS motherboards)

    Workaround: use only the mac address as the identifier.

    Modify the following stored procedures:

    NBS_LookupDevice

    The line

    On xref.machineid = aux.itemkey and aux.smbios_guid0 = @smsbios_guidTo

    On xref.machineid = aux.itemkey and aux.smbios_guid0 = @smsbios_guid + '.'

    MP_GetClientIDFromSmbiosID

    The line

    Where (m.smbios_guid0 = @vchsmbiosid) and (isnull (m.obsolete0,0) != 1) To

    Where (m.smbios_guid0 = @vchsmbiosid + '.') and (isnull (m.obsolete0,0) != 1) And the line

    Where (upper (m.smbios_guid0) = upper (@vchsmbiosid)) and (isnull (m.obsolete0,0) != 1) To

    Where (upper (m.smbios_guid0) = upper (@vchsmbiosid + '.')) and (isnull (m.obsolete0,0) != 1)

    Do take note that those changes will have to be repeated after a service pack or site reset.

    Posted by idany | with no comments

    Filed under: ConfigMgr, OSD

    и если нужно ссылочка http://myitforum.com/cs2/blogs/idany/default.aspx

  11. >а замену GUIDs в AMI BIOS

    посмотри докуменацию на мат.плату, там либо джампер на плате может быть, либо в биосе параметр.

  12. По просьбе Алексея и с виртуального позволения Nikolay кладу прямую ссылку на How to enable OSD with duplicate UUID in Configuration Manager myitforum.com/cs2/blogs/i...ion-manager.aspx

  13. Как быть с AMI ?

    утилита dmicfg.exe вполне нормально видит данные, они редактируются

    при нажатии F10 вроде сохраняется, но после перезагрузки все возвращается на место

  14. Ну либо писать производителю материнской платы (кстати если не секрет что за мать?) либо пробовать искать джампер\параметры в биосе разрещающий редактирование этих параметров

  15. ноутбук Lenovo SL500

    все проги которые я нашел при попытке изменять DMI пишут что BIOS Write Disabled

    хотя в биосе все опции блокировки выключены

  16. UUID плат с биосами AMI меняется утилитой atidmi.exe

    www.wintotal.de/server/tipps/amidmi.zip

  17. сори имя файла amidmi.exe, конечн не atidmi.exe

  18. Исходя из вашей «ситуации из жизни» я понял, что у вас имеется два TS: один для коллекции «All Unknown Computers», второй TS для некой коллекции «известных» компьютеров. Предлагаю для решения проблемы объединить эти два TS в один, но разместить в разных группах объединенного TS и объявить новый TS в обеих коллекциях. В объединенном TS в самом начале TS нужно определить некую переменную Set Task Sequence Variable например «known-unknown» и добавить шаг Run Command Line со скриптом, который бы спрашивал у пользователя типа: «это известный комп или нет? Если да наберите 1, если нет наберите 2». Скрипт присвоит нашей переменной «known-unknown» значение «1» или «2».Далее в свойствах каждой из групп в TS выставить условие выполнения каждой группы в соответствии со значением нашей переменной.

  19. 2 Casperon

    эм... что-то я вас не совсем понял.

  20. [...] редко можно встретить небрендовые сборки ПК. В статье ITBand.ru – Dublicate SMBIOS GUID приводится пример SQL запроса для построения отчёта [...]

  21. утилита amidmi указанная здесь мне не помогла, после перезагрузки в BIOS поле UUID так и стоит все заполненное нулями

  22. Спасибо за статью, помогла с GA-X79-UD5.

  23. [...] редко можно встретить небрендовые сборки ПК. В статье ITBand.ru — Dublicate SMBIOS GUID приводится пример SQL запроса для построения отчёта [...]

  24. […] редко можно встретить небрендовые сборки ПК. В статье ITBand.ru — Dublicate SMBIOS GUID приводится пример SQL запроса для построения отчёта […]

Опубликовать

Я не робот.