|
|
Victor Chen, (C++ 爱好者)
& N0 e# D) C1 Z0 N# ^. `# z+ P3 B; x# F7 `0 ~
5 H8 l$ l. J0 _7 d0 |/ K0 i" N. f--------------------------------------------------------------------------------# n0 |: l, {5 C; l9 o* |! J
WMI: Windows Management Instrumentation (Windows 管理工具)
+ H" v! Y& y s$ @1 W 通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 5 Q$ Y" b$ d, P, _/ x; S/ ~
利用这个工具可以管理本地或客户端系统中几乎所有的信息。
l: V5 A3 q, z9 @, T 很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 & G/ C- A" }2 \
4 n# d# J0 q3 \8 T& ~--------------------------------------------------------------------------------$ @: l1 B8 y- X1 _ l
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面! N! N1 u4 l1 S& F* U% b. a! `
8 F) F; Z' Y& B6 b' s; J--------------------------------------------------------------------------------
$ O! k* l- h5 ]1 V" ?① 初始化 COM 接口:3 `5 N$ H( r( L; o* z
访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
8 ]! @( Z& Z( l& } 这两个函数在 #include <comdef.h> 里面定义。; p$ t& U% L: l, @8 o' M
" @0 X& A( X# M M' O! X6 S② 获取访问 WMI 权限:( I9 W2 Z5 l- ^5 G: v% x! {3 r, K
CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);. b; V* w, f0 Q9 p
如果这个函数返回 S_OK 获取权限成功, 否则为失败。# r8 R' p: H8 `& Q! k
0 `: V) t3 o' Q; b③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:; M4 l( Y, x9 S, c
这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
f2 r$ z3 C5 J3 m: h3 c% O5 h1 ?. l% y8 B) H
void GetWmiInfo(TStrings *lpList, WideString wsClass) O( i* ?' m, o |( D8 \, y: a
{
r* b, F: `. _/ z* { IWbemLocator *pWbemLocator = NULL;- V& j/ F2 c! h$ P& r
if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)* m5 f% w! h9 h0 z) m& T. S
{
! O1 B+ u8 V7 J6 D2 x$ t IWbemServices *pWbemServices = NULL;
+ J# ^% p9 x+ m5 b3 k b WideString wsNamespace = (L"root\\cimv2");
! N% m# L E& J3 @- `8 b! ?' M if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
) _8 Q( B, d. w4 C { |! t4 F4 Z+ p. d: }2 K' C, r
IEnumWbemClassObject *pEnumClassObject = NULL;
9 \2 G, \1 _+ L/ @ WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;, e3 z: Y& }9 ]0 h8 R3 V
if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)- t: E$ ~# Z$ v S( {0 T: n
{. O0 i; D# Y1 y4 `
IWbemClassObject *pClassObject = NULL; u V1 w7 \5 L" Y; A
ULONG uCount = 1, uReturned;
$ A; e P" v3 r ^+ I2 t if(pEnumClassObject->Reset() == S_OK)' u' f# ^: w, R8 _
{
: J# S0 O7 L& Z1 c1 G int iEnumIdx = 0;, `/ w9 }( n2 D/ P# w" y; ^
while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
+ x3 U: h5 F z' p+ a {
2 K6 ] s+ L- ?6 }9 R$ b0 X& x& t- Y lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
8 e4 a1 E' V' x/ \% l- l% P4 t F% h* p1 v
SAFEARRAY *pvNames = NULL;
, A" r/ i' l4 J if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
, x& ?# a! v) e* X1 ^9 ^ {
3 D0 E8 N/ f4 j- i9 m long vbl, vbu;7 `5 a6 z3 V. r3 t+ A
SafeArrayGetLBound(pvNames, 1, &vbl);. y2 Y! ?& G5 B+ @
SafeArrayGetUBound(pvNames, 1, &vbu);2 L2 `# @; ?: o% V9 u
for(long idx=vbl; idx<=vbu; idx++)
6 M9 j$ g7 ]2 n% n# m8 Q, F {
, M, ^# C1 \% U long aidx = idx;
" f0 Q2 J0 p' c6 ?' q3 O' r- X/ b: w wchar_t *wsName = 0;
i1 ~$ O0 O3 ~3 n VARIANT vValue;
7 s& k. }# }6 k3 r6 r% ?5 M( ]8 W VariantInit(&vValue);: H4 P# E. Z4 T
SafeArrayGetElement(pvNames, &aidx, &wsName);
8 X+ |4 c* ^# H& [2 e1 Q& j* Q
, _! Z) ?, h+ w$ I+ v BSTR bs = SysAllocString(wsName);
! D) \6 M/ E, r6 y4 k HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);6 q5 T' d. d. W/ M$ r- D! D: ^
SysFreeString(bs);
+ d. E! S- @, q4 M2 v1 ?: D2 c R7 \! ~
if(hRes == S_OK)
8 Y# R2 z. K6 f4 j# u% Y {" M# z' u. [' Q9 R7 U0 `
AnsiString s;: G* Y/ n7 Q! E: C/ {, X: i$ }) w
Variant v = *(Variant*)&vValue;) d3 ~$ ^9 J, `8 m, m, B. S7 E
if(v.IsArray())
0 k* ]! `9 s9 j: P5 H. q1 [" f {
) z/ ~; v6 F. n- v/ c1 N( o7 J for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
9 A W! w0 v+ g# U {
}3 q: v9 q( | Variant a = v.GetElement(i);
$ A# i b+ _9 o# N if(!s.IsEmpty())
2 J M2 ~2 f7 F$ V+ { s+=", ";
5 P7 M# ~# B: d1 W) q0 j# p s+=VarToStr(a);
8 ~" t4 Z) S: q, I& b, N5 X }5 e" y( {. q7 t$ t: }, |. B) Z, |
}) r5 S9 H% P7 n: [' K3 }, f
else
0 i. M: o& y. J) C8 [! V8 W {
: M2 R( n6 w3 W' k5 G s = VarToStr(v);. N5 [ D7 S; k; r
}
) J" t# _- b) X' y; ` lpList->Add(AnsiString(wsName)+"="+s);
* }5 m% p2 Z0 _ }
% m( b7 ]/ C& E1 u# O
" |1 Z" W2 N" \) t; b5 c* D VariantClear(&vValue);
; c9 e8 w: r2 C SysFreeString(wsName);* a2 c0 H# A: F
}$ n5 G/ P) x! q
}) }9 y0 a3 |; o( f1 t
if(pvNames)SafeArrayDestroy(pvNames);
9 _+ X: T. p& |8 J iEnumIdx++;
N, g n z6 a, I! ^- B }
7 H- C1 E: a5 f }
6 i+ W7 S' ]! [& b7 O5 |8 b if(pClassObject)pClassObject->Release();/ P. w- L1 D. M
}
5 _: u0 p( F" S8 K/ l$ u) v' P if(pEnumClassObject)pEnumClassObject->Release();( |5 P+ K8 Q+ w: D0 E0 |
}
2 ^! |" J7 W) x2 M if(pWbemServices)pWbemServices->Release();
5 Q6 O# v6 t2 v' r- J% v: t }% N0 u6 [) S7 p4 z6 v7 Q! @
if(pWbemLocator)pWbemLocator->Release();- b$ N& o( P2 \' S9 Y: c
}
& d% o; z, @5 r# M5 y" Q//---------------------------------------------------------------------------9 |0 j4 p1 @& ]! e" e
9 E e% T( J2 S$ f' {. ~5 D// 通过 WIN32_bios 获取 BIOS 信息:
4 x! a* e) B# ^5 Y6 Tvoid __fastcall TForm1::Button1Click(TObject *Sender)$ d/ Z1 t$ u3 M
{
, D7 n) U: h t# C) B: I! D! }5 b2 y V Memo1->Lines->Add("================== [WIN32_bios] =================");+ i; f" z- o2 T# B$ T( }! O
GetWmiInfo(Memo1->Lines, "WIN32_bios");. X( X8 k& o( E' A! d2 C
Memo1->Lines->Add("");' B% K. R. }2 @7 b) T8 w8 a
}6 H. Z$ A2 r' a( L0 d, H' `" L' A
. f i! e7 N0 e- W1 B0 c
--------------------------------------------------------------------------------! R( M5 D7 |7 y0 r B7 L' }2 L( }$ Z
$ b0 q$ L1 A5 W+ i1 I! |! x$ k
WMI 可以访问的信息类型有:
) A; U1 L$ Y, _) E% r6 B$ J Win32_1394Controller
# e1 |+ R. A8 C; q7 c1 S Win32_BaseBoard
2 N0 Y* p- |8 ?7 m+ a3 D6 W' e Win32_Battery% g, O1 ]% O2 m0 n
Win32_BIOS v; [& A& o* Q( ?) H
Win32_Bus+ _! q: k/ G. U/ {: j6 \
Win32_CacheMemory$ ~: p- q' n, U% J7 y
Win32_CDROMDrive
9 r) y9 ?5 V J1 {" |' z Win32_CurrentProbe
C- v* l2 k# N+ V7 q3 O Win32_DesktopMonitor
* ?) R3 W6 u, h1 E1 a6 O# o Win32_DeviceMemoryAddress
) r' @4 L% h4 S* v Win32_DiskDrive
& Q; L8 O6 ~5 D7 O$ Q- E Win32_DisplayConfiguration3 ^4 c$ M, b5 q# `1 N
Win32_DisplayControllerConfiguration2 k) V4 [' \; T, ^8 `# P, t+ ^
Win32_DMAChannel$ E9 @- H6 E+ U+ f L' q/ D
Win32_Fan; I' A$ d2 `* j8 A. X. X/ V
Win32_FloppyController
2 K3 @- @5 s5 ~% v Win32_FloppyDrive# L" P& A6 o, [ t. s" D
Win32_HeatPipe
2 I) A3 B$ B# T: x( \+ ^! ^9 a Win32_IDEController
% a7 S! _4 L9 a5 e; p' T4 } Win32_InfraredDevice ~& A% [# ]5 @0 M! z: ^
Win32_IRQResource- g5 I0 `9 x# h- ?: \+ e# ~- N8 Y2 }1 v
Win32_Keyboard
/ o5 C1 ~0 D1 |1 D Win32_MemoryArray% z$ A% Q6 i; m3 M6 n, v# F* A7 b$ }) R
Win32_MemoryDevice: T z& x m* |% k5 O
Win32_MotherboardDevice2 i* t0 F$ ]8 w! e6 \
Win32_NetworkAdapter; q. p( I- R/ f- i. D
Win32_NetworkAdapterConfiguration g8 s" {1 W, e3 C y
Win32_OnBoardDevice
- d: K" b. a" s6 v Win32_ParallelPort# d+ J+ T& X( g0 z/ V$ D
Win32_PCMCIAController3 L7 c9 f! Q0 Z4 c6 R& A7 E9 c- X
Win32_PhysicalMemory
! R5 {5 X. K2 u6 [/ S Win32_PhysicalMemoryArray) w3 V* G8 b( |, z% p
Win32_PnPEntity
4 a0 `0 Y; d4 i1 B Win32_PointingDevice, l8 L- s, `+ e
Win32_PortableBattery6 q( R% L' e. g. U% [$ t- Y
Win32_PortConnector1 d+ d) T* w( T7 [
Win32_PortResource% p1 k* [- `, j5 d" d! l
Win32_POTSModem
) K# A) n# a+ \5 J b* H- a2 a" e Win32_PowerManagementEvent& `! h- v! o9 i) E
Win32_Printer
u; ^! A- u/ Z$ i% p4 r" E1 { Win32_PrinterConfiguration
- W& [! }# D9 c- C) B( a) P Win32_PrintJob
, a& a0 C1 E# }& y7 l+ U& t& T$ D3 g Win32_Processor. b& T1 d* A0 \4 a0 r$ H/ H
Win32_Refrigeration6 f2 {5 [% D M- O
Win32_SerialPort0 @% u3 V! b8 q! ^2 r
Win32_SerialPortConfiguration
3 j4 E# ~% o3 r0 Y) l Win32_SMBIOSMemory2 d7 c3 g' o1 v. ?! m0 f d
Win32_SoundDevice M4 a: Z: T4 H. D P
Win32_SystemEnclosure9 N. u5 ]8 f7 ^3 F: ]; r
Win32_SystemMemoryResource
' B! Q) N' N1 j/ V Win32_SystemSlot l. q! _" ~0 C5 `5 c, O. b) h. B
Win32_TapeDrive; q9 ?8 `. D3 o. l
Win32_TemperatureProbe
( Z( [+ @3 }* T& h1 O1 T" G Win32_UninterruptiblePowerSupply
Q& d2 c0 T* |; l2 `5 N) H Win32_USBController+ L5 B9 y+ E- u# m5 o1 V; K
Win32_VideoConfiguration
# s2 M M1 t( Y% Q Win32_VideoController' D- e, E! I% K, k* t' b) T
Win32_VoltageProbe9 \2 X% l" V; L$ B( q9 ]
$ i* t' \2 i# P, h
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios"); |
|