吳瑞睿 解 威
(沈陽理工大學(xué),遼寧 沈陽 110159)
目前,實現(xiàn)計算機系統(tǒng)采集的方法有很多,相關(guān)標(biāo)準(zhǔn)包括:IETF 的 SNMP、DMTF(Distributed Management Task Force)的桌面管理接口 DMI(Desktop Management Interface)、基于Web的企業(yè)管理WBEM (Web-Based Enterprise Management)、SMBIOS (System Management BIOS)等。
其中,SMBIOS是主板或系統(tǒng)制造商以標(biāo)準(zhǔn)格式登記產(chǎn)品管理信息所需遵循的統(tǒng)一規(guī)范。DMI是幫助收集電腦系統(tǒng)信息的管理系統(tǒng),DMI信息的收集必須在嚴格遵照SMBIOS規(guī)范的前提下進行。
SMBIOS和DMI是由行業(yè)指導(dǎo)機構(gòu)DMTF起草的開放性的技術(shù)標(biāo)準(zhǔn),其中,DMI設(shè)計適用于任何的平臺和操作系統(tǒng)。DMI充當(dāng)了管理工具和系統(tǒng)層之間接口的角色。通過DMI,用戶可以獲取序列號、硬件廠商、串口信息以及其它系統(tǒng)配件信息。DMI通常將上述信息存儲在BIOS中一個4KB大小的DMI數(shù)據(jù)區(qū)中,這一數(shù)據(jù)區(qū)通常被稱為MIFD(Management Information Format Database)。它允許操作人員在該數(shù)據(jù)區(qū)中手工添加一些BIOS不能探測到的諸如使用者姓名、銷售商和計算機編號等額外的控制信息,因此也可以在不需要對BIOS進行操作的情況下,使用DMI對MIFD數(shù)據(jù)庫中的系統(tǒng)配置情況進行修改以適應(yīng)不同環(huán)境下的系統(tǒng)要求。
對于符合SMBIOS規(guī)范的計算機,可以通過訪問SMBIOS的結(jié)構(gòu)獲得系統(tǒng)信息,訪問方法共有兩種:
2.1 通過即插即用功能接口訪問SMBIOS結(jié)構(gòu),這個在SMBIOS 2.0標(biāo)準(zhǔn)里定義了,從SMBIOS 2.1開始這個訪問方法不再被推薦使用。
2.2 基于表結(jié)構(gòu)的方法,表內(nèi)容是Entry PointStructure(EPS)中的數(shù)據(jù),這個訪問方 法 從 SMBIOS 2.1以后開始被使用,從2.1開始,以后的版本都推薦使用這種訪問方式。在SMBIOS 2.1版本中允許支持這兩種方法中的任意一種或者兩種,但在SMBIOS 2.2以后的版本,必須支持第二種方法[1]。
SMBIOS有多個版本,目前最高的版本為2.5,于2006年9月5日發(fā)布,對于實驗機所使用的DMI版本,可使用Windows自帶的DEBUG程序來進行判斷。
(1)在 MSDOS窗口下,鍵入 DEBUG,回車。
(2)-s f000:0 ffff'_SM_'(SM 必須大寫),回車。
F000:A430
注:如果顯示了一個地址,顯示的地址可與本實例不同,則BIOS實現(xiàn)的是SMBIOS 2.1以上的版本。
如果在以上的地址范圍內(nèi)沒有找到給定的字符串,可以再嘗試以下的方法:
(1)在 MSDOS窗口下,鍵入 DEBUG,回車。
(2)-s f000:0 ffff'_DMI_'(DMI必須大寫),回車。
F000:A440
?
注:如果顯示了一個地址,顯示的地址可與本實例不同,則BIOS僅實現(xiàn)的是SMBIOS 2.0的版本.如果沒有回顯的地址,則說明對SMBIOS 2.0以上的版本都不支持。
如果進一步確認BIOS是實現(xiàn)的SMBIOS 2.1或是SMBIOS 2.2,須進行以下的操作:
(1)在 MSDOS窗口下,鍵入 DEBUG,回車。
(2)-d f000:a430,回車。
WMI(Windows管理規(guī)范:Windows Management Instrumentation)是 Microsoft基 于Web的企業(yè)管理(WBEM)的實現(xiàn),同時也是一種基于標(biāo)準(zhǔn)的系統(tǒng)管理接口[2]。WMI最早出現(xiàn)在Microsoft Windows 2000系統(tǒng)上,但它同樣可以安裝在Windows NT4.0和Windows 9x計算機上 [3]。WMI以CIMOM為基礎(chǔ),CIMOM即公共信息模型對象管理器(Common Information Model Object Manager),是一個描述操作系統(tǒng)構(gòu)成單元的對象數(shù)據(jù)庫,為MMC和腳本程序提供了一個訪問操作系統(tǒng)構(gòu)成單元的公共接口。有了WMI,工具軟件和腳本程序訪問操作系統(tǒng)的不同部分時不需要使用不同的API;相反,操作系統(tǒng)的不同部分都可以插入WMI,工具軟件和腳本也可以方便地讀寫 WMI[4]。
其中,SMBIOS提供層:利用WMI實現(xiàn)的COM接口,查找EPS表,確定SMBIOS的版本、SMBIOS的結(jié)構(gòu)表的起始地址以及SMBIOS結(jié)構(gòu)表的長度。然后,實現(xiàn)對底層物理內(nèi)存空間中的SMBIOS數(shù)據(jù)進行采集。
SMBIOS遍歷層:利用SMBIOS提供層提供的數(shù)據(jù),針對給出的TYPE值,進行相應(yīng)類型值的采集。確定類型的起始位置,以及結(jié)束位置。保存此類型的結(jié)構(gòu)表信息,提供給SMBIOS解析層。
SMBIOS解析層:調(diào)用相應(yīng)的類型處理函數(shù)來處理相應(yīng)的類型數(shù)據(jù),按照SMBIOS規(guī)范解析出表信息,傳遞給SMBIOS格式化顯示層。
SMBIOS格式化顯示層:將SMBIOS解析層提供的字符串,按照統(tǒng)一的格式顯示出來。
本文所有程序都是在VC++6.0平臺上測試通過。遵循的是SMBIOS2.5版本規(guī)范。具體實現(xiàn)流程如下所示:
(1)所需的頭文件和靜態(tài)庫[5]
(2)初始化COM接口
使用WMI,必須先初始化COM接口,在程序的一開始調(diào)用 CoInitialize(NULL);或者調(diào)用CoInitializeEx(0,COINIT_MULTITHREA DED)
(3)初始化IwbemLocator接口IWbemLocator*pLoc=0;
(4)初始化IwbemServices接口。連接rootcimv2命名空間,獲得指向IwbemServices接口的指針。
(5)設(shè)置IwbemServices代理權(quán)限
?
(6)枚舉WBEM類對象指向SMBIOS表結(jié)構(gòu)
(7)獲得SMBIOS的主版本號和次版本號。
(8)獲得SMBIOS結(jié)構(gòu)表的起始地址。
下面以 TYPE 0(BIOS information)為例說明格式域和文本域的關(guān)系。
每個TYPE結(jié)構(gòu)都分為格式域和文本域,文本域與格式域相關(guān),直接位于格式域的后面,文本域中每個字符串的結(jié)束,都要以一個空字符(00h)作為結(jié)尾,整個字符串集合的結(jié)束,還要額外加上一個空字符。
采集SMBIOS TYPE 0數(shù)據(jù)如下:
根據(jù)上表給出的信息,可以知道類型是0h,格式域的長度為 24(18h),句柄為 0000h,偏移04h的是廠商信息,可以讀出的值是01h,這說明在文本域中的第一個字符串對應(yīng)的是BIOS生產(chǎn)廠商信息??梢砸勒沾朔▽YPE 0的信息解析出來。結(jié)論如下:
BIOS生產(chǎn)廠商:American Megatrends Inc.
BIOS版本號:080014
BIOS發(fā)布日期:01/29/2008
因為SMBIOS是由計算機的硬件廠商來實現(xiàn),它較其它方法更能精確的采集硬件相關(guān)的數(shù)據(jù)。本文重點的介紹了符合SMBIOS規(guī)范的通用接口的設(shè)計和實現(xiàn)。旨在為桌面管理系統(tǒng)的數(shù)據(jù)采集提供一個全新的思路。
[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]姜勁松,吳禮發(fā).基于WMI的系統(tǒng)管理的設(shè)計與實現(xiàn)[J].計算機應(yīng)用,2004,24(3):16~18.
[4]李玉龍,孫麗麗.基于CIM的系統(tǒng)管理實現(xiàn)技術(shù)[J].蘭州交通大學(xué)學(xué)報,2004,23(6):85~86
[5]David S.Platt.深入理解COM+[M].潘愛民譯.北京:清華大學(xué)出版社,2002.