|
|
Victor Chen, (C++ 爱好者)
6 a Y; Z$ q- ^* ^3 N( m6 Y) e/ g
; t" \: K9 X: u# L6 o) m! ?0 e" Z
--------------------------------------------------------------------------------$ U0 w& {. {# D# ~
WMI: Windows Management Instrumentation (Windows 管理工具)
6 n) d. G/ V" V( M |; F 通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
& w; X) t) n5 n5 N0 y' c, X3 q 利用这个工具可以管理本地或客户端系统中几乎所有的信息。
6 y0 N0 {6 b- v4 W2 c( p 很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
& m! l# J* a2 z3 x8 a. q1 O# N* D2 N R$ a W6 Q- [
--------------------------------------------------------------------------------) I! ]: H) o5 w% O' b5 f% L
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
) w5 M7 `3 p' e; a4 a
! \5 k7 [! t( B: [+ u7 q--------------------------------------------------------------------------------, m; ?9 o) ]0 e
① 初始化 COM 接口:- |% b+ Q6 R4 A; ?1 G; `; D* r
访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
: X. V; p1 w5 Q! N+ L; K7 T 这两个函数在 #include <comdef.h> 里面定义。
& f: Y- Q7 K' u9 r! h8 k4 [9 }8 a9 p! G- B+ B3 r9 ~
② 获取访问 WMI 权限:& \5 n7 |. e0 h4 z) V
CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
. o3 U: Y( \! a- q5 e 如果这个函数返回 S_OK 获取权限成功, 否则为失败。; J% Y0 C) P4 o
1 s- k) k# ~) U2 Z" v) X③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
0 S- V. I/ R# {5 |$ b4 z 这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
" |: r8 a8 |- [8 A! z* r6 M/ Y/ U- {$ N; L& p+ V% c( }/ m1 a3 f
void GetWmiInfo(TStrings *lpList, WideString wsClass)
1 H. R$ q6 U& A8 O- n8 @{
; ?; h. b; n2 ^: F+ c$ V IWbemLocator *pWbemLocator = NULL;* [" I; |8 g5 f1 u1 k) j
if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
, t* ]5 g+ ?4 g! c( |0 U. } {2 W* j! m6 p% T8 ^
IWbemServices *pWbemServices = NULL;
) @# ]: L- D5 w# s; f5 r0 W% W8 w WideString wsNamespace = (L"root\\cimv2");) v% D2 F1 f" e6 [: y, a2 E, T
if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)" Y$ M- D% a2 k6 y( m
{
4 e: H2 l0 r( B2 h5 Z IEnumWbemClassObject *pEnumClassObject = NULL;
8 p' ?1 b% T& J4 P6 [ WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;+ a6 [6 V1 x: j1 b! P9 c3 R
if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
1 w8 v/ [. _& d {! C0 a' P8 |9 C* W, L
IWbemClassObject *pClassObject = NULL;
. m& h; A* Q" a! o) n ULONG uCount = 1, uReturned;. m) x5 U: Y4 r2 L! m1 V2 m
if(pEnumClassObject->Reset() == S_OK). l9 H! Z# [. s" J) n
{
% Y, m X H, \% u int iEnumIdx = 0;
4 c% e7 B r6 |, z$ ?0 D8 z while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK): J: Q( w" u6 m( L+ u2 c. N
{" w8 U/ d% E# a) e
lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
, g% U' C, u6 r7 Y) @
# P7 n5 `0 H) N" H h/ P; B2 O SAFEARRAY *pvNames = NULL;7 H" |! C) U j* d: h
if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
1 w) [$ S3 X( W; I+ P( n {: y5 L* J- }+ T- ^9 h3 w* j. D% P
long vbl, vbu;
`, L) [0 M% X SafeArrayGetLBound(pvNames, 1, &vbl);. o* p$ U7 B, ~( A# z
SafeArrayGetUBound(pvNames, 1, &vbu);
. }- H, _5 @; [- H4 q for(long idx=vbl; idx<=vbu; idx++)
6 e4 Y( M+ j I9 p5 H- f& C; S {3 C, O( @" @1 a, l/ J+ m
long aidx = idx;
4 u- b; L/ q, [& u- i wchar_t *wsName = 0;2 ], M& ^3 V: n9 a0 J) v% }) z
VARIANT vValue;
- K9 |4 N. G9 z8 z$ p3 r VariantInit(&vValue);
3 G" v0 A6 t6 ` SafeArrayGetElement(pvNames, &aidx, &wsName);
& i& M: z$ t% y3 S' J9 [) P d2 |, Z
BSTR bs = SysAllocString(wsName);
. c, h7 J/ D1 p I& M. \ HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
; o, V5 O1 p ]& @( g/ ~* ?# d. G3 } SysFreeString(bs);. Y/ M+ D# ]! z8 M0 W! K& p/ l4 c m
7 M, O+ [' [. o# c4 z, @" x( @# \ if(hRes == S_OK)
: H h1 P# U3 [1 i2 R6 t {* k9 Z& @7 R# B
AnsiString s;# ~/ ^+ Q1 l$ ]* E% n* s
Variant v = *(Variant*)&vValue;
) y) H7 o/ ~6 P: i1 U0 E+ H if(v.IsArray())) t" T" T( L5 T) k3 B
{7 G. b; N+ N V8 B* ?, Z$ t0 j
for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
: @& g; h- {. k! E. f* T# C {) ]1 i6 Q$ G) `5 i
Variant a = v.GetElement(i);
2 q/ I! X2 p" p0 c1 ^" B if(!s.IsEmpty())9 h$ y) Z! j* \) U6 \+ O
s+=", ";4 _5 ~5 Z6 h& v! P X: K
s+=VarToStr(a);
# C- O H' e; Q }
2 I6 l& t5 ~+ }0 s! ~/ l8 \ }8 m) }, y$ C% |8 F
else2 Q6 Q4 X6 @# ~" x1 m) w' ?9 i
{
3 p( [$ J' n3 F s = VarToStr(v);& i3 v1 _+ C# s N' }; }
}) D' O% s- H, @% O2 V1 F$ E
lpList->Add(AnsiString(wsName)+"="+s);# c% a7 @& o: @- Q& k4 j9 Y. p- j
}
1 V/ N8 J/ [; X3 E8 M) p3 ~* ]; m! T
VariantClear(&vValue);1 J1 f, K7 P+ F; y
SysFreeString(wsName);
9 Y$ u, c9 L L: O }
" }. b% b4 X& P& D. }$ z }
, H8 |+ X7 d& X% Z& ? if(pvNames)SafeArrayDestroy(pvNames);: K I6 F2 v9 l3 ]/ _. p
iEnumIdx++;8 @5 p9 ^8 r; Y m- L& B
}% ~; \! U9 b* b. K& d/ z( Y
}% ]% T5 s3 m4 ?# ~6 H
if(pClassObject)pClassObject->Release();
7 ~, o. F$ G( N+ j }* q5 e4 T6 h9 _0 l! f0 D
if(pEnumClassObject)pEnumClassObject->Release();. S7 D8 Z; D$ Y. p
}
- t& ~+ [1 ?% _! l8 x) v if(pWbemServices)pWbemServices->Release();' a: g( w7 e6 N$ G
}$ h- m i; ] ~7 }: O
if(pWbemLocator)pWbemLocator->Release();
5 t% w) I/ @% C! \3 l}
$ B4 \+ _$ r9 U$ g# _- W//---------------------------------------------------------------------------& x) N6 x: } ?
/ o9 `7 o& P7 N! r% g/ @: _
// 通过 WIN32_bios 获取 BIOS 信息:6 y) P' J! f, @& X2 }
void __fastcall TForm1::Button1Click(TObject *Sender)
9 D4 Z3 @" K" L) [3 T{
# F& y6 ~+ M: I- S. b Memo1->Lines->Add("================== [WIN32_bios] =================");
2 V' y2 F, u u: z8 G GetWmiInfo(Memo1->Lines, "WIN32_bios");6 n# i8 ?, X2 z9 ?
Memo1->Lines->Add("");
1 l+ w- o' |% o1 V; y5 A* c}
g. Z2 D/ y% v( ^* x1 X5 f* w8 d/ R- @
--------------------------------------------------------------------------------
9 a8 O1 Z+ f# p( {& S' P. C0 F0 N* @2 n7 |0 }' r
WMI 可以访问的信息类型有:
7 U# T8 M ~) {0 T* \ Win32_1394Controller
) n. z2 Q8 J$ b/ e/ O6 N E Win32_BaseBoard5 G; A) L# n, w \
Win32_Battery
" N& F+ J/ \ W4 w8 r% g7 |! K Win32_BIOS6 w8 s( Z( e1 p" `: X
Win32_Bus" c/ t8 f6 u! U' u
Win32_CacheMemory
6 X: y$ N* _( h0 U9 Q/ D Win32_CDROMDrive' d7 u5 J. P B& c5 _! \0 x/ G
Win32_CurrentProbe
) [) @: ~, `* Z- e7 a9 D5 [+ i& G6 `" ^% L Win32_DesktopMonitor
! C* E: D x; T& K4 n& P6 d Win32_DeviceMemoryAddress
/ M: {5 g0 A0 S+ d" }2 e Win32_DiskDrive
- ?3 ^* i. O. r4 q' j5 G, N Win32_DisplayConfiguration
( m' `& H% _3 g, u/ m6 ~# X Win32_DisplayControllerConfiguration! E8 t( `$ Q" R6 w8 r0 x# ^" c Z( e
Win32_DMAChannel$ [. X' Z% R4 |" e' E
Win32_Fan
H" W% }# Q c6 [ Win32_FloppyController
, R# R3 @9 G9 ~8 ^0 c Win32_FloppyDrive" q6 m$ W# {) l& F2 ^8 l
Win32_HeatPipe
! G& v3 W- Y$ u" f `- V Win32_IDEController0 @$ V8 G$ X( b: Q
Win32_InfraredDevice
' u" W* p4 j; v: y Win32_IRQResource
O& F$ T" D+ F! T Win32_Keyboard+ [; u( J. t# E: E$ ]; v
Win32_MemoryArray
3 ~* w' _# B1 ? Win32_MemoryDevice
W D$ u7 I9 |4 S8 W" S Win32_MotherboardDevice
0 w" J# ^( Q4 ^ Win32_NetworkAdapter
' k9 K! t" C& R, a) A Win32_NetworkAdapterConfiguration
! P6 x& |. A/ d/ U8 n: K Win32_OnBoardDevice r9 B6 N% x7 p5 I3 C7 X" y
Win32_ParallelPort
1 Z- V" M Z/ `" }5 g Win32_PCMCIAController
3 s: M" M1 V4 U( E, t( v: O" H Win32_PhysicalMemory
2 w. Z* Y. Z- p4 B5 F5 F- T' p* q* ? Win32_PhysicalMemoryArray* E+ Z; ^% b, E1 ]0 i
Win32_PnPEntity H6 x0 j) O( W
Win32_PointingDevice! v2 o: q$ q- U' C- k& o
Win32_PortableBattery' x. D( I$ y& J1 D/ U7 T0 t( `/ W! _
Win32_PortConnector3 v; O+ c2 u) K) E9 f! M0 ^ U4 N
Win32_PortResource
& l# _7 N6 [# V8 W2 m4 { {! l9 {9 ? Win32_POTSModem- }- d( n' n# T; u7 F) L! ]; p8 x/ t
Win32_PowerManagementEvent! s5 D/ ^1 ?* g2 C; f \
Win32_Printer
4 y1 N3 Y. F9 i7 [ Win32_PrinterConfiguration
% R3 k* ^7 ?. `* v Win32_PrintJob
( i {7 e9 m! h Win32_Processor
+ R0 \& T; I. c* ~& |+ ^( Z Win32_Refrigeration
/ ^' @, E0 L" `. k, Z. ] Win32_SerialPort' y$ H* k9 Q6 ^: h$ L
Win32_SerialPortConfiguration4 m: S; W8 w- |# O2 Q
Win32_SMBIOSMemory. A) x& Y1 x. _3 L; ^% B( ]5 ^% Q7 k
Win32_SoundDevice( P$ [1 w# D9 H4 M+ o
Win32_SystemEnclosure
( I- J% U) W1 N: v Win32_SystemMemoryResource, g- ]9 u: [+ {* O O# `8 A
Win32_SystemSlot
9 S( G+ t+ ~3 a! l6 i Win32_TapeDrive" S* g; z3 _+ ]; F
Win32_TemperatureProbe
8 B% X ]0 H8 g0 ~$ M$ q Win32_UninterruptiblePowerSupply
' k6 g8 k8 p( P9 v5 c% P! N3 I Win32_USBController9 d& h: s0 }, \. t# B* S& C6 ^- ?0 e7 v
Win32_VideoConfiguration
: G5 L; t1 u. T) Q2 T# }$ e/ g Win32_VideoController
. ~. R& O% ^1 f Win32_VoltageProbe
! P) Z9 J( h6 K) f$ H/ B
* X( O% d- Z" j# W! [3 h以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios"); |
|