Странное поведение UuidCreateSequential

У меня есть программное обеспечение, которое без проблем работает на более чем 2000 компьютеров в моей компании.

Это программное обеспечение иногда генерирует GUID (или UUID) с использованием UuidCreateSequential() (ссылка MSDN).

Вызов обычно возвращает RPC_S_OK на каждом компьютере. Но на одном из них он всегда возвращает RPC_S_UUID_LOCAL_ONLY.

В документации указано, что:

Функция UuidCreateSequential возвращает RPC_S_UUID_LOCAL_ONLY, если исходный компьютер не имеет адреса Ethernet/Token Ring (IEEE 802.x).

Однако с этим компьютером, кажется, нет проблем с сетью. У него есть сетевая карта с действительным и уникальным MAC-адресом и IP-адресом, и она работает отлично.

Что еще может привести к тому, что UuidCreateSequential() всегда будет возвращать RPC_S_UUID_LOCAL_ONLY ? Вы когда-нибудь сталкивались с похожей ситуацией?

Это может помочь, компьютер, на котором есть проблемы, работает под управлением обновленной Windows XP с пакетом обновления 3.


person ereOn    schedule 20.07.2010    source источник


Ответы (3)


Я связался с Microsoft, и кажется, что ошибка возникает только в Windows XP, когда первый байт MAC-адреса выше или равен 0x80.

Это было исправлено для Windows Vista и Windows Seven. Это не будет исправлено для Windows XP.

person ereOn    schedule 23.08.2010

Это была ошибка в Windows XP и Windows Server 2003.

MAC-адрес состоит из 48 бит и обычно представляется как:

00-01-02-0A-0B-0C
00:01:02:0a:0b:0c

Первые три байта представляют Организацию, остальные три байта — любую схему нумерации, которую организация хочет использовать. Идентификаторы организации выдаются IEEE.

Для всех общедоступных MAC-адресов 2-й младший (2-й наименее значащий бит) первого байта будет равен нулю. Если вы хотите сгенерировать свои собственные локальные MAC-адреса, вы можете установить бит в 1:

02-01-02-0A-0B-0C

   02   -   01   -   02   -   0A   -   0B   -   0C
/¯¯¯¯¯¯\ /¯¯¯¯¯¯\ /¯¯¯¯¯¯\ /¯¯¯¯¯¯\ /¯¯¯¯¯¯\ /¯¯¯¯¯¯\
00000010-00000001-00000010-00001010-00001011-00001100
      ^
      |
      +- 0: Universal 
         1: Locally Administered

Или изображение взято из Википедии:

введите здесь описание изображения

Windows проверила неправильный бит

Ошибка в Windows XP и Windows Server 2003 заключается в том, что они проверяли неправильный бит. Они ошибочно проверяли старший бит:

Мне не хочется бросать Рэймонда под автобус, но вот пример неверной информации????:

Последние 48 бит — это уникальный адрес сетевой карты компьютера. Если на компьютере нет сетевой карты, установите старший бит и используйте генератор случайных чисел для остальных 47. Ни у одной допустимой сетевой карты не будет установлен верхний бит в адресе, поэтому нет вероятность того, что идентификатор GUID, созданный на компьютере без сетевой карты, случайно столкнется с идентификатором GUID, созданным на компьютере с сетевой картой.

Акцент мой. Поправкой было бы сказать, что:

...установить 2-й младший значащий бит... Ни у одной допустимой сетевой карты не будет установлен 2-й младший значащий бит.

Тестирование

Я проверил это на своем компьютере. Мой компьютер имеет MAC-адрес:

‎C8-60-00-12-34-56  (Ok, i changed the serialized number, but it is a Realtek)

Если бы мы следовали правилам Windows XP, этот MAC-адрес был бы "локально администрируемым", а UuidCreateSequential возвращал бы RPC_S_UUID_LOCAL_ONLY.

Когда я запускаю UuidCreateSequential в Windows 7, все работает нормально:

{FBE65AFC-2588-11E5-9F09-C86000123456}
{FBE65AFD-2588-11E5-9F09-C86000123456}
{FBE65AFE-2588-11E5-9F09-C86000123456}
{FBE65AFF-2588-11E5-9F09-C86000123456}

Но если я запустил его на компьютере с Windows XP с таким же (или похожим) MAC-адресом:

введите здесь описание изображения

Функция не работает:

0x720 Выделен UUID, действительный только на этом компьютере.

Исправить

Эта ошибка проверки неправильного бита MAC-адреса была задокументирована в:

  • #P20# <блочная цитата> #P21#

Это также было задокументировано в UuidCreateSequential вместе с:

  • #P23# <блочная цитата> #P24#

Было связанное исправление, но я не верю, что оно было исправлено помимо этого (т. Е. Нет официального исправления в пакете обновления).

У вас есть три варианта:

  • измените свой MAC-адрес в настройках Windows XP, чтобы не устанавливать старший бит
  • обновление до Windows Vista или новее
  • если функция возвращает RPC_S_UUID_LOCAL_ONLY, и вы работаете до Windows Vista (dwMajor < 6), то предположим, что это действительно удалось (Опасно!)
person Ian Boyd    schedule 08.07.2015

Возможно, это проблема безопасности, пользователь звонит администратору? В противном случае драйвер сетевой карты может не предоставить MAC-адрес.

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

Если UUID должен быть гарантированно уникальным в глобальном масштабе (например, регистрация актива), то может быть лучшей идеей запросить другое поле (например, сервер регистрации).

person devstuff    schedule 20.07.2010
comment
Спасибо за ваш ответ (и за исправление опечатки;)!). К сожалению, UUID должен быть глобально уникальным, и я не могу изменить программное обеспечение (по крайней мере, не слишком сильно) и заставить его запрашивать UUID в другом поле. Интересно, почему это происходит только на одном компьютере. - person ereOn; 20.07.2010
comment
У этой машины другая сетевая карта и/или версия драйвера по сравнению с другими рабочими машинами? В этом случае попробуйте удалить драйвер сетевой карты, перезагрузить компьютер и, когда сетевая карта будет повторно обнаружена, используя версию производителя вместо версии Microsoft (или наоборот). - person devstuff; 21.07.2010