UuidCreateSequential的怪异举动

问题描述 投票:4回答:3

我公司有一个软件,运行2000多台电脑,没有任何问题。

这个软件,在某些时候,会产生一个 GUID (或 UUID)使用 UuidCreateSequential() (MSDN链接).

该调用通常返回 RPC_S_OK 在每台电脑上。但在其中一台电脑上,它总是返回 RPC_S_UUID_LOCAL_ONLY.

文档中指出:。

UuidCreateSequential函数返回RPC_S_UUID_LOCAL_ONLY,当发端计算机没有ethernettoken环(IEEE 802.x)地址时。

但是,这台计算机似乎没有网络问题。它有一个网卡,网卡的MAC地址和IP地址都是有效的、唯一的,而且工作正常。

还有什么原因会导致 UuidCreateSequential() 归来 RPC_S_UUID_LOCAL_ONLY ? 你有没有遇到过类似的情况?

我可以帮助你,有问题的电脑运行的是更新的Windows XP,有Service Pack 3。

c++ windows uuid
3个回答
6
投票

我联系了微软,似乎这个错误只发生在Windows XP上,当MAC地址的第一个字节优于或等于......。0x80.

这在Windows Vista和Windows 7中已经被修复。在Windows XP中不会被修复。


4
投票

这是Windows XP和Windows Server 2003中的一个错误。

一个MAC地址是48位,通常表示为。

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

前三个字节代表一个 组织结构剩余的三个字节是该组织想要使用的任何编号方案。组织ID是由IEEE分发的。

对于所有的公共MAC地址,第一个字节的第2个最低位(第2个最不重要的位)将是0。如果你想生成自己的 本地 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

或者是维基百科上的图片

enter image description here

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地址。

enter image description here

该功能失败。

0x720 A UUID that is valid only on this computer has been allocated.

解决方法

这个检查MAC地址错误位的bug已经被记录在案。

这个问题也被记录在 UuidCreateSequential,以及。

有一个相关的热修复程序,但我不相信它被修复了,除此之外(即在服务包中没有正式修复)。

你有三个选择。

  • 改变你的MAC地址在你的Windows XP设置,没有高位设置
  • 升级到Windows Vista或更新版本
  • 如果函数返回 RPC_S_UUID_LOCAL_ONLY.而你是在Windows Vista之前 (dwMajor < 6),然后假设它真的成功了(危险!)

1
投票

也许是安全问题,拨打电话的用户是管理员吗?如果不是,网卡驱动程序可能无法提供MAC地址。

只要UUID是用于本地的机器,那么接受这个错误作为一个有效的结果可能是确定的。

如果UUID必须保证全局唯一(例如资产注册),那么询问另一个框(例如注册服务器)可能是一个更好的主意。

© www.soinside.com 2019 - 2024. All rights reserved.