吳瑞睿 解 威
(沈陽理工大學,遼寧 沈陽 110159)
目前,實現計算機系統采集的方法有很多,相關標準包括:IETF 的 SNMP、DMTF(Distributed Management Task Force)的桌面管理接口 DMI(Desktop Management Interface)、基于Web的企業管理WBEM (Web-Based Enterprise Management)、SMBIOS (System Management BIOS)等。
其中,SMBIOS是主板或系統制造商以標準格式登記產品管理信息所需遵循的統一規范。DMI是幫助收集電腦系統信息的管理系統,DMI信息的收集必須在嚴格遵照SMBIOS規范的前提下進行。
SMBIOS和DMI是由行業指導機構DMTF起草的開放性的技術標準,其中,DMI設計適用于任何的平臺和操作系統。DMI充當了管理工具和系統層之間接口的角色。通過DMI,用戶可以獲取序列號、硬件廠商、串口信息以及其它系統配件信息。DMI通常將上述信息存儲在BIOS中一個4KB大小的DMI數據區中,這一數據區通常被稱為MIFD(Management Information Format Database)。它允許操作人員在該數據區中手工添加一些BIOS不能探測到的諸如使用者姓名、銷售商和計算機編號等額外的控制信息,因此也可以在不需要對BIOS進行操作的情況下,使用DMI對MIFD數據庫中的系統配置情況進行修改以適應不同環境下的系統要求。
對于符合SMBIOS規范的計算機,可以通過訪問SMBIOS的結構獲得系統信息,訪問方法共有兩種:
2.1 通過即插即用功能接口訪問SMBIOS結構,這個在SMBIOS 2.0標準里定義了,從SMBIOS 2.1開始這個訪問方法不再被推薦使用。
2.2 基于表結構的方法,表內容是Entry PointStructure(EPS)中的數據,這個訪問方 法 從 SMBIOS 2.1以后開始被使用,從2.1開始,以后的版本都推薦使用這種訪問方式。在SMBIOS 2.1版本中允許支持這兩種方法中的任意一種或者兩種,但在SMBIOS 2.2以后的版本,必須支持第二種方法[1]。
SMBIOS有多個版本,目前最高的版本為2.5,于2006年9月5日發布,對于實驗機所使用的DMI版本,可使用Windows自帶的DEBUG程序來進行判斷。
(1)在 MSDOS窗口下,鍵入 DEBUG,回車。
(2)-s f000:0 ffff'_SM_'(SM 必須大寫),回車。
F000:A430
注:如果顯示了一個地址,顯示的地址可與本實例不同,則BIOS實現的是SMBIOS 2.1以上的版本。
如果在以上的地址范圍內沒有找到給定的字符串,可以再嘗試以下的方法:
(1)在 MSDOS窗口下,鍵入 DEBUG,回車。
(2)-s f000:0 ffff'_DMI_'(DMI必須大寫),回車。
F000:A440

?
注:如果顯示了一個地址,顯示的地址可與本實例不同,則BIOS僅實現的是SMBIOS 2.0的版本.如果沒有回顯的地址,則說明對SMBIOS 2.0以上的版本都不支持。
如果進一步確認BIOS是實現的SMBIOS 2.1或是SMBIOS 2.2,須進行以下的操作:
(1)在 MSDOS窗口下,鍵入 DEBUG,回車。
(2)-d f000:a430,回車。

WMI(Windows管理規范:Windows Management Instrumentation)是 Microsoft基 于Web的企業管理(WBEM)的實現,同時也是一種基于標準的系統管理接口[2]。WMI最早出現在Microsoft Windows 2000系統上,但它同樣可以安裝在Windows NT4.0和Windows 9x計算機上 [3]。WMI以CIMOM為基礎,CIMOM即公共信息模型對象管理器(Common Information Model Object Manager),是一個描述操作系統構成單元的對象數據庫,為MMC和腳本程序提供了一個訪問操作系統構成單元的公共接口。有了WMI,工具軟件和腳本程序訪問操作系統的不同部分時不需要使用不同的API;相反,操作系統的不同部分都可以插入WMI,工具軟件和腳本也可以方便地讀寫 WMI[4]。

其中,SMBIOS提供層:利用WMI實現的COM接口,查找EPS表,確定SMBIOS的版本、SMBIOS的結構表的起始地址以及SMBIOS結構表的長度。然后,實現對底層物理內存空間中的SMBIOS數據進行采集。
SMBIOS遍歷層:利用SMBIOS提供層提供的數據,針對給出的TYPE值,進行相應類型值的采集。確定類型的起始位置,以及結束位置。保存此類型的結構表信息,提供給SMBIOS解析層。
SMBIOS解析層:調用相應的類型處理函數來處理相應的類型數據,按照SMBIOS規范解析出表信息,傳遞給SMBIOS格式化顯示層。
SMBIOS格式化顯示層:將SMBIOS解析層提供的字符串,按照統一的格式顯示出來。
本文所有程序都是在VC++6.0平臺上測試通過。遵循的是SMBIOS2.5版本規范。具體實現流程如下所示:
(1)所需的頭文件和靜態庫[5]

(2)初始化COM接口
使用WMI,必須先初始化COM接口,在程序的一開始調用 CoInitialize(NULL);或者調用CoInitializeEx(0,COINIT_MULTITHREA DED)
(3)初始化IwbemLocator接口IWbemLocator*pLoc=0;

(4)初始化IwbemServices接口。連接rootcimv2命名空間,獲得指向IwbemServices接口的指針。


(5)設置IwbemServices代理權限


?

(6)枚舉WBEM類對象指向SMBIOS表結構

(7)獲得SMBIOS的主版本號和次版本號。

(8)獲得SMBIOS結構表的起始地址。

下面以 TYPE 0(BIOS information)為例說明格式域和文本域的關系。
每個TYPE結構都分為格式域和文本域,文本域與格式域相關,直接位于格式域的后面,文本域中每個字符串的結束,都要以一個空字符(00h)作為結尾,整個字符串集合的結束,還要額外加上一個空字符。
采集SMBIOS TYPE 0數據如下:

根據上表給出的信息,可以知道類型是0h,格式域的長度為 24(18h),句柄為 0000h,偏移04h的是廠商信息,可以讀出的值是01h,這說明在文本域中的第一個字符串對應的是BIOS生產廠商信息。可以依照此法將TYPE 0的信息解析出來。結論如下:
BIOS生產廠商:American Megatrends Inc.
BIOS版本號:080014
BIOS發布日期:01/29/2008
因為SMBIOS是由計算機的硬件廠商來實現,它較其它方法更能精確的采集硬件相關的數據。本文重點的介紹了符合SMBIOS規范的通用接口的設計和實現。旨在為桌面管理系統的數據采集提供一個全新的思路。
[1]DMTF.System Management BIOS(SMB IOS)Reference Specitication Version 2.5[S].2006
[2]Mary Jander.WBEM scheme final.Data Communications[J],1999,28(15):12
[3]姜勁松,吳禮發.基于WMI的系統管理的設計與實現[J].計算機應用,2004,24(3):16~18.
[4]李玉龍,孫麗麗.基于CIM的系統管理實現技術[J].蘭州交通大學學報,2004,23(6):85~86
[5]David S.Platt.深入理解COM+[M].潘愛民譯.北京:清華大學出版社,2002.