|
|
Victor Chen, (C++ 爱好者)
9 G% l8 ]$ B4 [
" s8 f# ^, }' Y3 @6 l% Q- _/ O5 b& |
--------------------------------------------------------------------------------, C F; X; B+ T" k" Y
WMI: Windows Management Instrumentation (Windows 管理工具)
4 [4 p/ [7 p) F 通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
8 v& ]- m% v& `* `. Y2 _5 B4 K 利用这个工具可以管理本地或客户端系统中几乎所有的信息。
2 z% r6 t# g2 R' ^ 很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
9 t& t& V/ c$ N- R
: t1 A+ e# l, V) @( Z2 e; f+ U: A--------------------------------------------------------------------------------& o5 s: d6 a( T+ k4 G# q0 K
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
8 J4 _& H. E0 [/ _/ T7 E' R: X& b' ]: }0 [! V# q9 a5 ]% c ] u+ |
--------------------------------------------------------------------------------
8 y- @2 t# h# T# J8 r9 f& b① 初始化 COM 接口:
: p& P6 ~2 _% B5 t. h/ q 访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。' S3 g0 Y( c0 C- b
这两个函数在 #include <comdef.h> 里面定义。
3 d; Q0 q2 `8 Z9 J8 Q7 U# M
5 R: r! E7 `- A0 n0 G② 获取访问 WMI 权限:
% ~% e6 o- M: w' o& o. v( g9 s, p( x CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);7 [! a. B! }, {8 g5 x# x
如果这个函数返回 S_OK 获取权限成功, 否则为失败。
, w, R5 x$ H8 x! G8 s4 g9 F* S1 v% {
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:' e$ {% i4 s+ ]8 ]" Q
这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。8 R# M& ^& l7 M# H
7 L9 c. R l5 M5 v; z
void GetWmiInfo(TStrings *lpList, WideString wsClass)$ z6 t- a& o ~. }( v# J" m
{, z b9 d& N( d5 v
IWbemLocator *pWbemLocator = NULL;: V+ C4 }' L2 Z. T! z8 o% g* z) F6 Z
if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
& k2 V* W0 F3 q {6 {5 R1 u! a+ q; W( H% G$ {
IWbemServices *pWbemServices = NULL;
1 q6 Q6 `7 ~9 [- E; O: K ~' f WideString wsNamespace = (L"root\\cimv2");
* C" {! X. E( `. q: u" y; N5 v if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
, H- y" Z5 A& D {
) {- j$ L) x. I' q IEnumWbemClassObject *pEnumClassObject = NULL;
$ [ b, E- ?( G WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;2 P% _ r' B# ]: l1 P$ h
if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)' F. i. [* g. x7 \ I
{
# s! F/ C* E9 y% x" p4 u IWbemClassObject *pClassObject = NULL;7 |2 U2 ^1 j" Y
ULONG uCount = 1, uReturned;
) |! K& Z6 o# z, z5 e- v if(pEnumClassObject->Reset() == S_OK)
# |7 a% R( ^$ D {( R; c, Y! E8 @( r |* w: X" E
int iEnumIdx = 0;
' ]1 r/ c: H5 H7 J6 ?. {4 ?* P+ j- T while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
* A Q1 p; {! L) X# { {
+ \/ I* F7 @( _$ ?0 _! ? lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");/ n6 |5 c* X/ z0 F
# j# P$ c4 q3 Z; U) ]
SAFEARRAY *pvNames = NULL;
1 O, `4 ~9 `% p5 M) v( F if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)" G& D, U3 q9 D4 i/ Z: E- ~" [
{. s6 m3 ?" _( s/ \1 ]
long vbl, vbu;
# }" @) }/ L, s- M SafeArrayGetLBound(pvNames, 1, &vbl);
0 N% a2 T6 [4 G% d! ^" w& K SafeArrayGetUBound(pvNames, 1, &vbu);2 t' i; O. w1 w1 n5 K
for(long idx=vbl; idx<=vbu; idx++)- ]1 w9 z2 r$ V& w
{
6 N" {; o' y6 {* D long aidx = idx;
) o H" R! q' V6 `4 `+ f wchar_t *wsName = 0;+ _% j/ L! n3 ?& {4 L7 Y9 r
VARIANT vValue;3 a! j, A. k/ z; i
VariantInit(&vValue);
2 V8 N1 L( O" I' u, O SafeArrayGetElement(pvNames, &aidx, &wsName);
3 V0 o( C0 E. w
# o$ m- f) h) b. \* y9 U1 z4 R BSTR bs = SysAllocString(wsName);% N! `/ L2 i% i! B
HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);! L6 y/ `% i* G
SysFreeString(bs);
1 ^+ a6 g& I& h9 k* q( ^- M- H) h/ r# w. i) G9 Y( ~
if(hRes == S_OK)
9 u. S# |' k" H# k% j1 x; Z {: B8 `9 _& c4 e3 B
AnsiString s;0 k5 f& H7 t9 e( f) `* o- O
Variant v = *(Variant*)&vValue;, l$ A4 H8 w3 }+ v) R4 ]
if(v.IsArray())
# L( j1 |6 v4 G& C {
) A( ?, Z" S- g9 X: K$ X3 {4 W; O for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)+ x! C! W% |& r8 n8 U
{
6 q2 ?. `/ \. K0 N Variant a = v.GetElement(i);" U8 q2 D1 B) J( Z6 q. @ ^
if(!s.IsEmpty())& O, s$ V# _3 ~
s+=", ";
- M( D" W: ^! I" Z/ X/ }. W s+=VarToStr(a);
U% J8 E/ ?3 P$ [3 X3 |3 n }
; ?% o) A/ F% y+ t7 F+ K4 z5 v }% N/ U6 l) l- Z( R- C: c
else, \" a) d* I6 {1 Q7 D: l, ~
{
. Q! ~$ A1 [3 T7 x7 X& |/ E s = VarToStr(v);
4 C- }/ Z3 g: [& |# f" |! F6 e }) @( ]+ d; X" H9 A$ v5 T7 I0 j1 G
lpList->Add(AnsiString(wsName)+"="+s);
# K5 ]& y4 k" \( N- W: T }6 c2 _$ y$ ^( z* r1 ^! I% F
} I: ^" j( f* {' }' j q VariantClear(&vValue);
8 l" R% m3 _ g* e4 W SysFreeString(wsName);3 l/ O8 k3 d, T3 Z v* `
}
# J2 i0 z# {% M2 |- a } L+ ~4 s6 s( x" o6 g7 o
if(pvNames)SafeArrayDestroy(pvNames);5 Z# f5 r Q" \0 c2 m$ }3 H# ~
iEnumIdx++; b+ l4 H( j- d( X) e6 l9 d
}7 {; U" T- I+ O6 T
}. S3 c$ e9 X9 S8 |
if(pClassObject)pClassObject->Release();
; y1 w1 Z9 h: F; x1 T }
& Q) j: D5 h! s+ W0 Y+ x; a if(pEnumClassObject)pEnumClassObject->Release();
! d" q" \, m ?2 ?- Y }, g0 b3 H( c; l9 J% N* |
if(pWbemServices)pWbemServices->Release();
. @0 o5 F7 i& A }
+ a1 o4 b& I3 O/ k/ D if(pWbemLocator)pWbemLocator->Release();+ ~2 }5 M8 `5 n4 i7 c/ P) c* _
}
$ ]& s$ Y2 n! |7 l9 N9 v/ D( t//---------------------------------------------------------------------------
2 f& z2 u/ d/ |& } v' L) H0 W1 K$ D, q0 r& M# k) S
// 通过 WIN32_bios 获取 BIOS 信息:4 f$ F; O( f; Y8 w( R
void __fastcall TForm1::Button1Click(TObject *Sender) |+ o% M4 F& r$ ]' |
{/ b7 {9 k8 B6 @/ T s' v v
Memo1->Lines->Add("================== [WIN32_bios] =================");
$ D( {4 k1 ]" @ GetWmiInfo(Memo1->Lines, "WIN32_bios");5 w2 U/ B4 B2 ~0 E4 F! J
Memo1->Lines->Add("");- _1 j" B; a5 r9 J3 h% q* w' i
}
% v" M7 e0 e6 c. p3 `; L3 d
; q* L- Y9 G1 I/ u6 I--------------------------------------------------------------------------------
# i: y2 B" f2 ?+ z# d$ G X& h/ x% r( j
WMI 可以访问的信息类型有:
% m q5 c# W* [% C* T' N8 l Win32_1394Controller' Y$ K! z$ O% }/ x5 Z' ]. m
Win32_BaseBoard) f( a* j7 I9 \9 V+ J
Win32_Battery
) j- i. n$ P, o$ T* r& \0 Q Win32_BIOS
2 d/ W) C5 D) ^) n Win32_Bus
' U V# X& ?- A1 r( A5 C5 R/ r# Q9 u Win32_CacheMemory
: M1 A: B6 q3 r0 d+ _1 }6 L Win32_CDROMDrive
$ l8 z- s& z6 T6 @7 d. c9 A Win32_CurrentProbe
; V1 Y) Q8 W9 O5 E# y Win32_DesktopMonitor3 u. M5 P. f2 Y9 K5 l, Z
Win32_DeviceMemoryAddress
- j# |2 o4 U/ [* w0 g2 z% f Win32_DiskDrive
9 p" r0 k+ p, b4 B4 A Win32_DisplayConfiguration) n- d& g& j+ b7 ~6 f) Q
Win32_DisplayControllerConfiguration
. q* v7 [8 G& R# l6 ?. { Win32_DMAChannel1 ]) W. h3 ]4 E! k
Win32_Fan
# J; f0 p& Q5 }$ `" h2 z# Y' i Win32_FloppyController* q% K) H: ?2 G- Z. |
Win32_FloppyDrive
1 l' i" d- t2 p Win32_HeatPipe
. ^8 F5 c/ ^) q. R% C/ W Win32_IDEController c7 v) U; K& K j- v
Win32_InfraredDevice8 [4 j' M1 Y, m7 U# a
Win32_IRQResource
% a. B% k' ~" F0 R" f Win32_Keyboard5 y; S8 ^# J( G4 e
Win32_MemoryArray
3 w! N. U1 `1 b5 N# c5 c6 F Win32_MemoryDevice
! G! F9 W: W# ~ Win32_MotherboardDevice
) M! V& N0 [) J5 T Win32_NetworkAdapter/ e J. h: `7 I) P5 L- a0 H4 G# a
Win32_NetworkAdapterConfiguration7 }# F2 w6 h, e" b/ V
Win32_OnBoardDevice
, I8 L* C5 J7 P5 c$ R) A Win32_ParallelPort
9 ?# C9 |8 t7 M* \ Win32_PCMCIAController% d) ~7 b) i" F/ y7 T
Win32_PhysicalMemory( z/ z, u n1 _& t( ]
Win32_PhysicalMemoryArray* r) c3 G6 R# k# a, P& f
Win32_PnPEntity
# q( e. @! e' @: V& w Win32_PointingDevice3 x% m5 R% y6 S
Win32_PortableBattery G& h" i" K) v: l! J2 T
Win32_PortConnector
- p+ | H8 X0 N- q H Win32_PortResource
. c& ?8 k" J4 I1 z7 `) K( j( Y6 g Win32_POTSModem* ]5 s B* X* H y0 z8 x3 _0 \
Win32_PowerManagementEvent. E- u& @( d9 h2 e
Win32_Printer
$ a- l) l" E* n Win32_PrinterConfiguration* l, b1 ]5 m. \0 t! W3 K
Win32_PrintJob9 Y. {7 |1 V" V% h* g9 v
Win32_Processor
4 J# _ J/ [0 i. v/ h Win32_Refrigeration
) ^# D+ |: q7 H4 w8 z v Win32_SerialPort& }* N5 ^) f3 j! c0 u2 [( D2 Y
Win32_SerialPortConfiguration$ I5 w/ y) a7 |0 W
Win32_SMBIOSMemory) w. ~; b! ~+ K
Win32_SoundDevice' q, @: d& Q4 Z# a( q# m
Win32_SystemEnclosure6 d4 n3 u3 \; p! G% ^% [; a. [
Win32_SystemMemoryResource
( e- w% J7 r1 ~1 L* \- `- M Win32_SystemSlot
0 H8 N& d" V2 ?1 ]+ J Win32_TapeDrive) r) j1 ]* l; H" T4 R4 Q
Win32_TemperatureProbe
6 o7 n) x0 J: G, C5 _ Win32_UninterruptiblePowerSupply# [; c6 E' z/ e! x
Win32_USBController" g3 `* u) T. ~( ^# r0 c
Win32_VideoConfiguration! \# D. A$ D: K3 R) O7 g
Win32_VideoController
% i2 M6 y5 _$ g) u: v Win32_VoltageProbe: K$ Z' H, ^( N7 d3 J& v
9 n1 m4 a8 g9 r' D$ x以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios"); |
|