Raymond Chen 2008年08月08日
如何获取计算机制造商的名字?
一位客户想要一种方法来确定计算机制造商的名称。例如,他们想要通过某种函数调用并得到返回结果“IBM”、“Compaq”或“Dell”。
我不知道他们为什么想要这些信息,目前我也不关心。
当然,当你寻找信息时,你不会去搜索 MSDN;那是疯狂的人会做的事情。不,让我们直接启动注册表编辑器(regedit)并按 Ctrl+F(搜索)。
我无法想象有多少应用程序兼容性错误是由注册表编辑器中那个“有用”的 Ctrl+F 对话框造成的。
客户找到了用于自定义系统控制面板的注册表键,以及也参与其中的 OEMINFO.INI 文件。但随后出现了可靠性问题。
毕竟,由于它只是一个注册表键和一个 INI 文件,用户可以编辑它并让它显示任何他们想要的内容。
如果客户擦除了他们的硬盘并从头开始重新安装 Windows,那么这些信息也会丢失。
这位客户想要某种程度的保证,即如果计算机声明它是 Dell,那么它确实是 Dell。
进入 WMI(Windows 管理工具)。
脚本团队对 WMI 非常熟悉。如果你搜索短语“from Win32_ComputerSystem”,你将从《嘿,脚本小子!》栏目中找到一次又一次的命中。
恰好 WMI 也暴露了计算机制造商信息。
如果你查看脚本团队发布的脚本,可能三分之二的脚本都遵循这种模式:
strComputer = “.”
Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)
Set colItems = objWMIService.ExecQuery(“Select * from something“)
For Each objItem in colItems
Wscript.Echo objItem.something
Next
我们所要做的就是填充“something”。
strComputer = “.”
Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)
Set colItems = objWMIService.ExecQuery(“Select * from Win32_ComputerSystem“)
For Each objItem in colItems
Wscript.Echo “System Name: ” & objItem.Name
Wscript.Echo “Manufacturer: ” & objItem.Manufacturer
Wscript.Echo “Model: ” & objItem.Model
Wscript.Echo
Next
好的,我们可以利用 WMI 获取这些信息。但它有多可靠呢?
嗯,WMI 团队告诉我,他们通过直接查询 SMBIOS 来获取信息,所以它的可靠性和你的 BIOS 一样。
主要制造商会把他们的名字写入 BIOS,但如果你是在家用机器上运行,那么这些值就是主板上附带的。
BIOS 制造商通常会在他们的 SMBIOS 中放置占位符字符串,将制造商设置为一个通用字符串,比如“Manufacturer”。
当主板制造商安装 BIOS 时,他们应该用更有意义的内容替换占位符字符串,但大多数制造商并不在意。
结果是,你从当地电脑商店购买零件组装的机器,制造商很可能只会显示“Manufacturer”。
总结来说,如果你查询 WMI 获取计算机制造商,如果返回“Dell”,那么你可以相当确定你有一台 Dell 计算机。
或者有人非常闲得无聊,烧录了一个自定义 BIOS,上面写着“Dell”。
另一方面,如果返回的是“Manufacturer”,那么你就仍然不清楚。
你所知道的只是你有某种通用计算机。
即使主要制造商会把他们的名字写入 BIOS,我听说如果你把你的电脑送回制造商,他们更换主板时,有时会忘记在更换的主板的 BIOS 中烧录他们的名字。
因此,即使是品牌计算机,你也可能看到“Manufacturer”。