|
|
Victor Chen, (C++ 爱好者)
3 v. d# C3 j0 p. Y# x; C; F* d7 |/ L( q* `. K
" O( t/ n7 q1 g, `% B3 @--------------------------------------------------------------------------------
- `4 [ c' p3 C! r0 S- O6 ~WMI: Windows Management Instrumentation (Windows 管理工具), u1 [" C" ~5 F( f
通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 - {9 B! S; u; e3 x
利用这个工具可以管理本地或客户端系统中几乎所有的信息。
! Y2 L8 I$ Q8 r' c/ P- n2 o( x8 Z 很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
" V1 H2 K; I* p! M( Q* h! G; [& G7 A3 \* C& l6 I( Y4 c
--------------------------------------------------------------------------------3 z z: V# W1 A- O' B9 i7 g
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面# B3 A6 _9 m# b0 d
* H# v1 U0 |" O* Z( E
--------------------------------------------------------------------------------
- K V. B( h2 a- c: `- w% u6 Y* T- Q① 初始化 COM 接口:/ ~8 N7 S3 [! A$ m; x$ S/ T& p
访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。; q$ \2 y( P' J [0 w0 w8 m
这两个函数在 #include <comdef.h> 里面定义。
& K+ O. B! J6 p& z) P0 L; Q( F0 x3 t
② 获取访问 WMI 权限:
$ M/ y6 D$ P# S1 K* c% z) V; O CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
) O L6 T+ N8 I% n2 f 如果这个函数返回 S_OK 获取权限成功, 否则为失败。) @: x* s& r; A& f# W o
' Y+ L$ t) r" i& x③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:) B, K8 p( w# c* {$ ?
这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
. Q2 G) @. w; D; X$ q: h8 @0 K _% {& l. {" \" g
void GetWmiInfo(TStrings *lpList, WideString wsClass)3 B. J( T# V! M. d& @
{
# s- W( J$ j, z7 Y, Y IWbemLocator *pWbemLocator = NULL;
. g8 n4 t- }" D! p* _: w if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)1 V) M4 S% G6 k& J5 z3 D. M
{' _# z2 P" R8 w& _
IWbemServices *pWbemServices = NULL;& p, v8 _ g5 k( w& B
WideString wsNamespace = (L"root\\cimv2");8 `/ R, J( R& C( H' g
if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)' ^9 N) a( t) I. H5 R- r
{& e$ l1 i2 Q. _" ]: m
IEnumWbemClassObject *pEnumClassObject = NULL;
7 g. E" M8 s& T e6 ]$ G7 w0 c9 m WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
0 }) f* v: B" D! g if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
; i4 q: T# }$ z4 Q1 h {
! x4 \8 _. k) R. {0 I# i IWbemClassObject *pClassObject = NULL;$ P' ?# z0 u9 i! F: |9 L
ULONG uCount = 1, uReturned;
, A' S7 R! i. A* D. c" J( n$ ^ if(pEnumClassObject->Reset() == S_OK)* a$ Y7 I$ l' ^% X/ c2 i1 ?
{* ?2 n9 R, G3 W5 c' G* z, v! A2 I) m
int iEnumIdx = 0;9 | A( Q: ^$ M5 Q' r1 V
while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
6 @0 o: i5 R: K; F" o4 m3 y) i {
' Y* W' l$ r: e# f0 V lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------"); Z! u( ]. P. ~) X$ q* ]/ @
) D1 y: ~/ Z) U' t8 } q SAFEARRAY *pvNames = NULL;
" r% t) x5 {( }7 M' m if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
% V* F8 J p( B4 N) ~/ u- w e {0 l2 f) A _3 ^7 \2 }" B
long vbl, vbu;% p5 @ W! F0 b
SafeArrayGetLBound(pvNames, 1, &vbl);
( ?! r: L A2 p3 h* [ SafeArrayGetUBound(pvNames, 1, &vbu);
6 m$ Q" K' c* ^1 P# Y$ [! L( ^ for(long idx=vbl; idx<=vbu; idx++); h! c# y2 K/ _0 A% F8 q X
{" Y* v! l5 x! ?: o+ a/ ~) d
long aidx = idx;
; C7 ?" j. `: A& H9 y5 L. W wchar_t *wsName = 0;" N# |' J5 Y* c+ c& L7 M
VARIANT vValue;
$ \6 w, P6 E& `* e, ]; K p VariantInit(&vValue);, y. O' C: e; j
SafeArrayGetElement(pvNames, &aidx, &wsName);
/ L: I+ K' S$ k, `% x* }$ Y. n& g+ y, c# Z" Z
BSTR bs = SysAllocString(wsName);7 @5 `/ ~, |: C+ N$ t
HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
0 z* [5 T# h- j SysFreeString(bs);2 z7 ~: l4 K9 o- h( z+ h
5 ]) b2 }1 V" z; m% p4 M/ @' O# z# @ if(hRes == S_OK)
/ l3 ?, |" j9 h6 | {7 S% s C' h/ [$ I" Q
AnsiString s;
8 s2 c, x3 N, T w$ |( [, ?" K Variant v = *(Variant*)&vValue;
/ x. f3 _) Q% {- p. u) W if(v.IsArray())
/ U# E" d1 R+ c% D! c3 L {
$ B4 l1 ]# ~6 _9 h- G for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)$ `! w; F, I5 Z/ ?. u: d/ {
{4 d$ e# D9 W5 L, x0 g# f
Variant a = v.GetElement(i);4 z6 N% ^. J2 p0 M& [# Z
if(!s.IsEmpty())5 B( Z) n+ k& @& z$ b9 |2 ?
s+=", ";
; U0 E8 q5 m; G A s+=VarToStr(a);
, R: N" N) J* S6 Q6 R( h8 c: u7 Y }
9 i7 Q; m; a) K! p$ H9 P; P }6 W) Y" ]& ~: C/ A9 W( _
else
/ ]; I# C! t" Z6 k {' s3 ^: T! a; y: h
s = VarToStr(v);
% n) @+ Z/ P' a/ j. g' }" o }( ^; W/ |3 \, e/ o( Y- \
lpList->Add(AnsiString(wsName)+"="+s);
7 S7 h3 t! _0 w }
Y: `0 H, {) ]1 f/ u0 R3 i$ t1 @/ m! B
VariantClear(&vValue);
) @! X! s" }1 K% e4 ^9 ^ SysFreeString(wsName);% z, x+ d# J, Z9 e8 |" u
}! } Y& F/ G/ x) E) ^
}
) l9 `+ d% H; k if(pvNames)SafeArrayDestroy(pvNames);2 D# E2 \) S1 [; Q# m
iEnumIdx++;, s! `% W1 n# e" X% d7 S
}
" K0 K3 C" c% ] }
; m, w3 y/ V W' V5 u8 y if(pClassObject)pClassObject->Release();) `7 B& b" h J" O# r
}' v+ g2 c, R$ |4 f
if(pEnumClassObject)pEnumClassObject->Release();
7 `9 g! `$ T/ b$ p& s6 ^ }
& u: d! @! a/ z' L; E: C if(pWbemServices)pWbemServices->Release();
0 {9 x P* _ O( k0 k! D }$ G ?7 w6 E, Z1 ?' I% V
if(pWbemLocator)pWbemLocator->Release();1 c/ Z* Z) C/ @) a3 P4 t
}$ y# U! H/ ]: j% @6 v/ K
//---------------------------------------------------------------------------
, C1 r# _5 h9 W7 s a$ e/ o9 L# ]5 Q! ^( h
// 通过 WIN32_bios 获取 BIOS 信息:& c7 c$ p/ Y5 ]( g( ], T7 G7 Q
void __fastcall TForm1::Button1Click(TObject *Sender)' ^7 y& K. v5 M$ }, M
{7 P# V6 v2 M: k D; w, L5 B
Memo1->Lines->Add("================== [WIN32_bios] =================");
2 h7 T' J: M+ v' D9 G( ~ GetWmiInfo(Memo1->Lines, "WIN32_bios");+ }( q* g. w. Z. J" d+ u) e
Memo1->Lines->Add("");0 X6 j: _, m+ o+ b& x$ r; \
}
& Y# R* |( ^* C0 A
5 `7 w1 c J" x$ Y4 p% ~9 O( z--------------------------------------------------------------------------------
: m1 a. G7 x" N) R
' ~& R8 x* `' |9 g0 f3 _6 {WMI 可以访问的信息类型有:% U% H! K5 r4 Z& v. t" z
Win32_1394Controller. g. x3 k% b! S, h- L
Win32_BaseBoard r) P5 Y9 d! s0 K! M
Win32_Battery" @* t3 u, y/ q6 R9 k# G
Win32_BIOS
( v4 X4 r# z# }$ @) `6 U* h Win32_Bus
$ |9 m0 ]& [! O. A Win32_CacheMemory
, u1 y7 ?+ X" v% m: t+ P" h% x% ? Win32_CDROMDrive* }- k. b& ` I) R. P" D
Win32_CurrentProbe
2 C% X" \0 v7 y. q0 ^ Win32_DesktopMonitor5 n( S4 {+ }: r4 o" M$ d: F- r
Win32_DeviceMemoryAddress
8 T) l. z* v: U: U/ O* u, B& m Win32_DiskDrive+ M4 z- o, {) B" d, p* Z; M
Win32_DisplayConfiguration
& ~' \$ L s4 F6 | Win32_DisplayControllerConfiguration5 `3 P6 `8 t+ z0 q
Win32_DMAChannel
+ v: t3 i* [3 V, ~3 D Win32_Fan. a0 ]8 _- y1 U$ p7 t- n
Win32_FloppyController! ~$ F4 t8 T. B8 L# d% c
Win32_FloppyDrive# {- a8 ?- v2 Z0 i5 ^
Win32_HeatPipe1 ^4 o# s8 ^/ g( f2 V
Win32_IDEController7 Y& z- ?$ y/ ^. Q6 g8 ?5 h- e3 k3 N
Win32_InfraredDevice
) e' [5 o: {7 e& h$ {8 J/ r2 g Win32_IRQResource& z4 O3 o3 b! f' r6 J0 I4 z
Win32_Keyboard5 S: T0 t# N5 s. H. j i8 @
Win32_MemoryArray# I( u* d" s, q; P9 X2 S j/ S
Win32_MemoryDevice
0 T/ B% d4 v1 R4 z Win32_MotherboardDevice
- O9 v. U' @8 }" g6 c Win32_NetworkAdapter9 ` M6 {# r3 T, C
Win32_NetworkAdapterConfiguration% j; D F3 w( r
Win32_OnBoardDevice
$ h# X* c! z$ k6 F: f `# ?) W Win32_ParallelPort v. f. s' w, e! ]! ^4 q
Win32_PCMCIAController
# G+ y9 C& x8 s+ N: H O Win32_PhysicalMemory6 a$ k. ^( _- L( V
Win32_PhysicalMemoryArray u2 i+ l3 r: v2 W+ }* R
Win32_PnPEntity. k5 d2 g- B/ T
Win32_PointingDevice
( Z! j& C& s& B) Y. b Win32_PortableBattery
& X- n0 ]& y7 E8 m; t Win32_PortConnector
7 `$ Y& S+ B0 n& C1 G Win32_PortResource. L' P" y" v4 d# h! {
Win32_POTSModem
4 M4 f B5 M1 _: J5 i' i" X Win32_PowerManagementEvent
6 x& I" `; [2 d( f, W Win32_Printer/ ?& J) |6 }% N( f
Win32_PrinterConfiguration
. r1 G+ J# K! Z' \! f Win32_PrintJob( a1 Q+ }4 l( k$ u3 I0 ?3 R$ J
Win32_Processor
) t1 e+ S0 f7 D- ]# ]0 o Win32_Refrigeration/ `* n* c8 A7 k* Q
Win32_SerialPort1 o2 e$ j" P) B* p
Win32_SerialPortConfiguration
' y8 V k" _2 ^5 d, w Win32_SMBIOSMemory5 Q/ G, c- M# t' m8 L
Win32_SoundDevice9 Z7 Q7 ?/ v6 d# H2 L
Win32_SystemEnclosure
! K) f2 \8 G* u7 ~9 o Win32_SystemMemoryResource" Y7 F( M5 ]+ @% Q: c' }
Win32_SystemSlot l: |6 ]2 S/ Z1 r' E* P4 D( h* k
Win32_TapeDrive
8 t7 r9 I: j+ M ^ v, Y. u7 H Win32_TemperatureProbe
- N" G; F' ]' P Win32_UninterruptiblePowerSupply
$ z# a- g2 M0 w Win32_USBController; M4 M3 O6 O) _8 |8 V. a/ U6 ? g
Win32_VideoConfiguration t) e! J# I4 U4 N8 _8 a6 V4 O+ q
Win32_VideoController( q4 n% M) Q7 X6 s
Win32_VoltageProbe! E7 J& c4 x! V9 s; ?
" ~7 j2 \4 o+ O以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios"); |
|