我公司有一个软件,运行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。
我联系了微软,似乎这个错误只发生在Windows XP上,当MAC地址的第一个字节优于或等于......。0x80
.
这在Windows Vista和Windows 7中已经被修复。在Windows XP中不会被修复。
这是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
或者是维基百科上的图片
在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 A UUID that is valid only on this computer has been allocated.
这个检查MAC地址错误位的bug已经被记录在案。
KB2569646: UuidCreateSequential API可能返回RPC_S_UUID_LOCAL_ONLY(1824) 错误。 (2011年6月22日)
出现这个问题的原因是UuidCreateSequential API错误地将一个MAC地址识别为无效地址,如果MAC地址的第一个位是ON(1)。
这个问题也被记录在 UuidCreateSequential
,以及。
KB981080:当你在一台拥有有效网络适配器地址的计算机上使用UUIDGEN.exe命令或UuidCreateSequential函数时,你会收到一个警告。6🕗:
这个问题的发生是因为操作系统错误地评估了网络适配器的MAC地址。
有一个相关的热修复程序,但我不相信它被修复了,除此之外(即在服务包中没有正式修复)。
你有三个选择。
dwMajor < 6
),然后假设它真的成功了(危险!)也许是安全问题,拨打电话的用户是管理员吗?如果不是,网卡驱动程序可能无法提供MAC地址。
只要UUID是用于本地的机器,那么接受这个错误作为一个有效的结果可能是确定的。
如果UUID必须保证全局唯一(例如资产注册),那么询问另一个框(例如注册服务器)可能是一个更好的主意。