|
|
Victor Chen, (C++ 爱好者)# d$ F/ l' B* Q' s- N2 i7 a; J+ s
3 n) r% w2 f* n3 Q
' t+ i8 c9 m2 {--------------------------------------------------------------------------------
3 h3 v& r& C4 I2 ~* i( b8 {WMI: Windows Management Instrumentation (Windows 管理工具)
& Y! b7 q- ]; ]! d9 i 通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 8 P6 y' O7 ]3 B* K
利用这个工具可以管理本地或客户端系统中几乎所有的信息。
1 z \! O. |& S8 I' @ Q 很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
+ y d( t# Q9 u6 d, g) B$ q7 P! l; S2 Q* r2 `9 |8 r
--------------------------------------------------------------------------------& ?4 I. s C. E/ K/ H6 C
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面4 C" L5 N$ H/ |( U4 b
2 d4 t9 v9 ]- T, s+ T
--------------------------------------------------------------------------------& S3 _" `" N5 @; f. l5 f s6 `" v) y
① 初始化 COM 接口:
4 Y( o; Y0 E' L& m5 o: S6 Q- \ 访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。- m# ^% n' ?! P0 a$ N8 L0 P _
这两个函数在 #include <comdef.h> 里面定义。
4 z* o6 s: _& \0 @. c1 h. W8 j0 H2 i4 w& Z" [# P
② 获取访问 WMI 权限:/ C3 ]. B q# y @* \& G" S
CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);1 b/ U5 z8 m' R/ I; Y; k; O
如果这个函数返回 S_OK 获取权限成功, 否则为失败。
8 L3 v- @. A5 w+ H n+ z/ ^, T- w3 Z5 \! R. l" M( I2 C
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:# j, P0 B& h" R
这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
* K* J% S$ y5 B H2 }$ \6 l: z; f4 S# E6 ~/ I5 _, R) W8 @8 j
void GetWmiInfo(TStrings *lpList, WideString wsClass)) g* A3 Y5 K B ]4 F2 e5 m
{/ W/ H# W/ b6 B6 T$ U' u" ^
IWbemLocator *pWbemLocator = NULL;
+ }3 X! e7 C2 _ if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
1 l8 H6 M. |0 S h: }: A* h {
" @' i0 |% C+ C' _ IWbemServices *pWbemServices = NULL;' q, O; z1 r* ^7 q: B
WideString wsNamespace = (L"root\\cimv2");
+ a7 e6 T) G$ a0 v/ t9 K7 z if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
5 t, \4 [8 x" X5 c! c# l/ V) y( l {; X8 ~& |4 d$ M! |& N# H
IEnumWbemClassObject *pEnumClassObject = NULL;3 j4 b2 [1 \0 _+ O$ w) e
WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
% c% k" \# j: ?3 V1 E' [* u if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
7 m7 ^/ d5 t1 }5 M! {& Z4 F" R {0 z. K( @, ~) ?* c
IWbemClassObject *pClassObject = NULL;
' d- M+ t1 @1 C* u& \6 J ULONG uCount = 1, uReturned;9 ?5 Q5 S) w+ ]! _& J
if(pEnumClassObject->Reset() == S_OK)
6 a+ ^1 I, k0 t. S {5 a9 W" [- n# W
int iEnumIdx = 0;
3 y9 J$ f# v7 e2 Q while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
( ?9 ]2 d* I8 A# H {
2 Q- j9 ?# m0 ~* W9 b lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");* H0 O8 w" J1 G4 e
9 h. y" {. n, R; H. O4 _6 G' i/ ~ SAFEARRAY *pvNames = NULL;3 d4 ^! j7 D1 {6 k
if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)2 q. G0 ?; n O$ T( a
{
1 m" h F' h7 P; g# Y! s long vbl, vbu;
: K+ ~" p" u1 L4 ?# M1 l SafeArrayGetLBound(pvNames, 1, &vbl);
: d+ u7 j* c7 J3 V$ j7 N SafeArrayGetUBound(pvNames, 1, &vbu);: P: u4 A& W9 L2 J. h: x; C; }: p
for(long idx=vbl; idx<=vbu; idx++)
?2 u$ a2 T' j/ F3 d {
. ?8 i: r% \3 J9 K' t long aidx = idx;( U, x% b) t8 S5 w( M
wchar_t *wsName = 0;
2 t7 c. p4 e" v8 Y2 c& \9 U VARIANT vValue;) [! a$ _4 S+ Q9 T$ [: t% x' x5 U
VariantInit(&vValue);: S/ N* h* J4 p& m" m2 ~1 \$ o
SafeArrayGetElement(pvNames, &aidx, &wsName);
/ l" { `, A$ c' i6 W- n& U7 t: ^& x
BSTR bs = SysAllocString(wsName);
* a! g* k% w! K H( u, V HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);7 ]* T: d: B+ ~ l0 d
SysFreeString(bs);
* e- |! ~3 h0 {; K: O' T
/ |# k6 q% i% A! y if(hRes == S_OK)
* `' d1 j. z8 J, U/ [" s* [3 {! u! c {
* M: z3 t# D2 N0 w5 [+ A AnsiString s;
/ ~) `& ]5 p% e$ R+ ?; p Variant v = *(Variant*)&vValue;
3 t3 ^2 r( D3 D* ^$ n$ l% E9 p' \9 k& H if(v.IsArray())+ S( K5 w3 S! |. H& K5 @
{( v- D( b0 @* V
for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
) c0 X! j- O2 g1 _# F {$ w! B& S) \1 i% F2 v
Variant a = v.GetElement(i);
% k: N. p1 v; K if(!s.IsEmpty())
9 @. T- X) C% ]. G s+=", ";
+ v& g/ G" `# p- W7 y* E7 ?! ? s+=VarToStr(a);
0 C6 s8 r: ^7 J3 H6 t( ` }
: j& x- L3 [3 m4 T6 R }
0 Y6 o% ?( J0 a/ e else
x- m1 O# r& B, P" i( J1 Q {& x( n$ m d5 E2 @2 d& h
s = VarToStr(v);1 q/ C! p+ G$ N# A6 G% q$ E
}
- _/ W3 c; J8 n$ a+ v lpList->Add(AnsiString(wsName)+"="+s);. \: r3 F4 R7 U# |# p8 g% E: v
}
7 `9 A- Y; E1 z- v' R
& X( b* ]) I/ r" G VariantClear(&vValue);
/ m& q/ V) ]2 r% y; G7 I0 T SysFreeString(wsName);
! p9 }! F2 x, S( n* U }: x) n. O8 m2 B/ [: d$ b7 q
}
8 e3 }0 b/ j7 q3 x/ T3 I) C if(pvNames)SafeArrayDestroy(pvNames);
; N5 Z: d$ ~" p" [/ K! t iEnumIdx++;
! g0 y6 l* N2 Y# s4 T4 m! i& P }% w' ?8 y3 ^, y
}
. m' a W* W. L6 E. T if(pClassObject)pClassObject->Release();; r4 m" s, X; p8 f2 i/ U S
}
* ^1 t! D" _* Q" u if(pEnumClassObject)pEnumClassObject->Release();9 P/ q2 f3 K. G8 x3 y
}
4 G- }( w Y+ E if(pWbemServices)pWbemServices->Release();) Y- M0 F: S) K0 t6 o5 Q
}, i7 j3 W) C1 a- A8 k
if(pWbemLocator)pWbemLocator->Release();# L' x. |/ G6 B* d3 a4 G& S
}
. t! Y, \( x) t//---------------------------------------------------------------------------
i6 L( N* u/ r5 @4 k) ~% M
( @( Y' \# \7 ~' T// 通过 WIN32_bios 获取 BIOS 信息:
* ^; I3 [$ d0 N7 J' {% kvoid __fastcall TForm1::Button1Click(TObject *Sender) ]' x! v& F7 j2 U7 w6 z! g7 @2 _
{
9 X5 m# u3 r) N( e Memo1->Lines->Add("================== [WIN32_bios] =================");/ E! R1 A5 O" ]
GetWmiInfo(Memo1->Lines, "WIN32_bios");' S/ F }8 ~4 n! I
Memo1->Lines->Add("");
% b. {3 J+ _2 N+ z- m7 T1 k3 F2 b, B}$ P# ?* d5 D; P' {8 k ~6 U' o( Q
! {* o6 N8 Q/ x: c, u1 p
--------------------------------------------------------------------------------
: p# D( M1 r" M6 Y7 k1 s6 j$ s& p6 }) g% b$ ?4 R! y" t" @3 I5 d
WMI 可以访问的信息类型有:0 p7 V$ y5 P8 ], n9 u
Win32_1394Controller2 ] _1 M. ?4 _* z+ E4 O
Win32_BaseBoard% q* V$ V7 V( X8 K1 P
Win32_Battery6 P- _ O, l# L) e" D( v4 o+ y
Win32_BIOS
* f, h6 B: H9 D( |. V7 F+ @ Win32_Bus
' v4 f2 a; Z, n4 F" h. n- J" N Win32_CacheMemory: W+ t/ j- c4 v
Win32_CDROMDrive& [7 Y" p, u2 A2 `5 ^/ a3 t
Win32_CurrentProbe
9 Z# B7 [2 V# q5 \9 } Win32_DesktopMonitor9 f2 m2 o; P$ ]9 M. c$ w
Win32_DeviceMemoryAddress/ y' a' [# i3 I( S* P0 D6 J, ]+ I
Win32_DiskDrive
7 z: N `7 R8 n4 Y' c& e Win32_DisplayConfiguration
* E L( X( i% Y8 \/ t" @ Win32_DisplayControllerConfiguration
$ d" k2 C3 w2 v- f Win32_DMAChannel( K0 d( H) v# C3 y" c$ m
Win32_Fan
/ e2 x% ]3 N1 c' m4 ~3 h Win32_FloppyController
, D8 W# L$ U5 F: A' X* Y6 d) T Win32_FloppyDrive' a V8 W0 V1 W& a* z
Win32_HeatPipe: m3 F- R. G! }: v5 X6 @
Win32_IDEController# h' H# \1 v7 X8 c" @1 D2 f4 z7 q
Win32_InfraredDevice9 a. W, j% z+ T/ I
Win32_IRQResource
' [& p0 m6 | `* v Win32_Keyboard1 _+ C+ t) z7 Q$ ^3 ]) K* e( M/ x
Win32_MemoryArray
& x, C n+ S$ B5 e$ r' C, {# t/ M Win32_MemoryDevice
B$ z/ M& j( U1 x$ T/ s Win32_MotherboardDevice
& j2 R; T+ Y$ J6 m- ` Win32_NetworkAdapter/ \- a, u! u8 k' V$ G R
Win32_NetworkAdapterConfiguration( l4 w6 z P1 j2 `$ t# O( s# [- ], r
Win32_OnBoardDevice2 y- _' {6 r1 K
Win32_ParallelPort
5 x: d& J) `' b Win32_PCMCIAController3 N: w- _+ {4 c
Win32_PhysicalMemory8 G5 Z* ] _$ t/ U8 y( b
Win32_PhysicalMemoryArray1 Q& L( f4 Z' B% e) q9 R
Win32_PnPEntity U/ b$ T0 k5 l
Win32_PointingDevice* v C' V. _) S4 `5 ^' M
Win32_PortableBattery
- t" c, v; d- p3 x1 |( D Win32_PortConnector
# D- K: R1 w: X0 E Win32_PortResource
! [7 L2 B2 L7 q, e3 ^- y1 s6 v Win32_POTSModem4 D( e) U5 w- W: C+ Z( K
Win32_PowerManagementEvent
5 k: ~3 p6 [2 V+ g( S Win32_Printer: Q+ k8 V: q0 M* E$ a/ t1 G! V
Win32_PrinterConfiguration& F6 c. i$ O7 |0 }, u
Win32_PrintJob
( S, P) u6 m$ l& J1 X+ K! { Win32_Processor
# C! P K, h2 J6 W$ i, }, K Win32_Refrigeration
& z V3 v" a: c3 L7 g Win32_SerialPort- j) ^8 j5 a: s+ n8 \! Q: k
Win32_SerialPortConfiguration
& S) I+ }. _/ [7 M P Win32_SMBIOSMemory
6 x( y/ B/ O7 C) t5 w Win32_SoundDevice2 U# q; A4 y d# [( R
Win32_SystemEnclosure7 }2 D( C; i! c- E9 K
Win32_SystemMemoryResource
' v2 `/ {7 M) z6 C$ u Win32_SystemSlot
% `& o6 J. N4 d2 f Win32_TapeDrive
' N; y) H7 M; |- j9 j Win32_TemperatureProbe4 `! L3 C& z z$ M
Win32_UninterruptiblePowerSupply q" z6 G/ X4 `% @! B# v: g
Win32_USBController7 L; J4 {, N& W# {+ e. N% f- v, h8 L
Win32_VideoConfiguration
& Q( h5 _) X+ a! @# x4 o Win32_VideoController
: u4 l; w2 t& q2 g! ^ Win32_VoltageProbe7 V; t" w& H2 t1 A
5 R. K2 s4 F n# {' {" f/ n
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios"); |
|