|
|
Victor Chen, (C++ 爱好者)
+ r6 k, o' k2 m7 T" W! F o% h
5 V4 ]% a: H4 d. C& F
3 R, X' u8 r+ _& w--------------------------------------------------------------------------------
. m# C( u" ~8 }1 WWMI: Windows Management Instrumentation (Windows 管理工具)8 z0 A* _, V% A* q% k L
通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 : Z% O% \1 }( }7 [" [" B8 c1 \
利用这个工具可以管理本地或客户端系统中几乎所有的信息。4 b/ i2 P9 K; B- W; k
很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
. y9 v9 m' a" g4 u N
5 E8 ]2 @# p& A. M4 h$ W! k--------------------------------------------------------------------------------1 ?- R4 g" V1 p* `9 g8 A" N) p
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面/ @2 x$ `" U- E3 [/ r; V9 z. b
8 |5 B# z* {% z9 S9 c" F/ a- w& j--------------------------------------------------------------------------------
$ g7 C2 H7 B3 E① 初始化 COM 接口:
0 o/ q2 [3 w# V% a8 c 访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
; `+ p+ x t+ G9 u' m$ P' g 这两个函数在 #include <comdef.h> 里面定义。* J2 ]9 m0 ]6 v
* E- @$ Z/ ?- W② 获取访问 WMI 权限:
. a# N3 y0 W$ F5 c8 E CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);" N8 |: H- b' ~# N, z3 e/ z. @( D
如果这个函数返回 S_OK 获取权限成功, 否则为失败。' W8 y3 y6 p ~3 h: W
" w& n' K$ D! ~' u; p
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:& V$ d( ] d9 j0 N
这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。 u7 x5 g+ T0 h8 ]' F
4 p* W% }$ p6 ~, u$ j, Pvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
- V J1 t5 R' L/ b1 r3 u{' D3 U6 n& a9 a
IWbemLocator *pWbemLocator = NULL;
$ B2 |1 O# r1 j N1 F+ v: K if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)4 \& P; _. s5 k
{% e1 h1 @! w# j2 y" c4 k4 `
IWbemServices *pWbemServices = NULL;% j h& x, w7 l2 ~6 Y$ v
WideString wsNamespace = (L"root\\cimv2");( r( K$ O l D: M
if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
1 V8 j, j: ?7 C4 v* l' p {3 T$ s8 a0 h3 } a0 l
IEnumWbemClassObject *pEnumClassObject = NULL;% E: p0 m, i1 W$ W$ p
WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
* e/ `* D" _6 `6 C+ D if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)! v7 h( v! s- z; e$ @3 h$ G
{1 Y8 P# h1 D; D/ C4 I7 b, Y
IWbemClassObject *pClassObject = NULL;) a! g8 p9 B4 P' d
ULONG uCount = 1, uReturned;" |! w' j+ `/ z4 z9 E- Q8 }1 d+ o- [/ m
if(pEnumClassObject->Reset() == S_OK)* x+ } a% _2 g4 ~
{" E0 i% [& s- P) D
int iEnumIdx = 0;' K2 i6 A* b. T3 k2 `
while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
6 l4 J$ _$ b) o B {
+ E$ P, h! V7 i lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
7 V H" Y( q+ `- g0 k% R E! R
5 H/ N$ ^: l; b2 U, w# C SAFEARRAY *pvNames = NULL;- m: \, ? t( g) H h
if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK): D( N0 C, @( B/ c' n" F# \: W
{
0 I8 ]4 I$ I" }9 S! Q long vbl, vbu;
2 H0 B6 e$ ?0 o! b5 b% c# T1 _ SafeArrayGetLBound(pvNames, 1, &vbl);
* A" Y: }$ v1 X4 L% L) Z! } SafeArrayGetUBound(pvNames, 1, &vbu);
L4 D) ~# \5 b2 S for(long idx=vbl; idx<=vbu; idx++)
- J6 I9 X t9 `" I/ w N {
9 B- R. [& b0 e5 z! [; @ long aidx = idx;
2 ~% Q# L7 i* j F6 a wchar_t *wsName = 0;
! v0 c9 m" d2 W8 M VARIANT vValue;
1 E* D s" x8 K0 @2 L VariantInit(&vValue);0 E+ a6 q' X: }: U) r* V
SafeArrayGetElement(pvNames, &aidx, &wsName);5 X: t2 v, e: l0 N: K# m! L! X5 D- B
3 ?8 v' I! f5 P
BSTR bs = SysAllocString(wsName);
6 t/ H9 O4 A$ O# }; U HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
( w2 m0 [2 I1 W" T+ K \ SysFreeString(bs);
7 D, [! Z; ]; p
" t1 v! ^7 c8 i if(hRes == S_OK)* v! j$ V9 {2 n( `$ f2 R
{' p# Z/ R( d; C
AnsiString s;
6 g8 X( a& p# p" _' { Variant v = *(Variant*)&vValue;
7 z$ k: l) g8 W7 b+ Q0 T if(v.IsArray())
7 N* n9 ~* T* |1 ^/ y {
0 q% \0 E9 R! A$ e0 G for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)1 t R6 O9 ?+ e: l) ]
{
5 ~' ^/ m8 H& [; x( k5 w. M: K Variant a = v.GetElement(i);5 j- N8 r! ]8 r$ M3 }7 M# D
if(!s.IsEmpty())0 c0 G# C' m" Y3 M
s+=", ";
* \& p5 e7 ^) y3 ~$ ?1 w s+=VarToStr(a);& O W2 L$ @& F! X) B. C
}
* a6 S. w# I, y# G7 ]: U }4 b) g, C0 f* l6 d, }( _
else
( Y/ Y9 {- `2 d. ^) P {
1 F+ y3 O+ l1 m% K7 W2 s s = VarToStr(v);0 C! Z, D, }9 ^# @' U
}
; o2 f# p- c) _3 w) P y lpList->Add(AnsiString(wsName)+"="+s);
5 b9 x* z& w/ [ }/ d! g l d% e9 [ ?0 m1 b
3 g- ~2 C* @$ z& E* x& J, }: X8 Q9 Y VariantClear(&vValue);
' \) B7 K* u7 P7 J" R P SysFreeString(wsName);* B1 V H6 y( @" U$ X
}/ ]9 z: q7 W; C
}' Z ^% i& b3 f" U/ F; ]
if(pvNames)SafeArrayDestroy(pvNames);
7 k' Y2 t0 o N7 F6 Q4 b iEnumIdx++;
3 A4 G6 w& G; H! \ }
/ f5 f0 r$ V' B }7 P, V$ C& f+ C' x$ V% t
if(pClassObject)pClassObject->Release();: A1 y- j6 f' `5 C) S4 C& a
}
, p8 S# u2 T7 V2 O* f if(pEnumClassObject)pEnumClassObject->Release();
+ j) X0 m5 Z! I+ E- E) ?' i }; u; U/ C$ I" P4 d3 W/ M( V& [4 Q. Z
if(pWbemServices)pWbemServices->Release();3 D+ W: e4 M [3 t, ~
}
9 s& E1 t% ~7 c- ]: C. e5 | if(pWbemLocator)pWbemLocator->Release();0 }6 x7 x3 i3 P+ j5 [( A
}3 p) @) X# P( c( Y
//---------------------------------------------------------------------------# E$ T6 f/ B2 E
* T4 O/ p$ V6 }1 \4 @9 X( R
// 通过 WIN32_bios 获取 BIOS 信息:! u3 G7 C" g2 B
void __fastcall TForm1::Button1Click(TObject *Sender)
& o) z; G. l% F$ `: ~{
9 x4 i% i' j4 K; T i& A Q; q* y) I8 [ Memo1->Lines->Add("================== [WIN32_bios] =================");8 d' C6 S' ^& D. K+ B {, n
GetWmiInfo(Memo1->Lines, "WIN32_bios");% N$ n/ l/ M! y2 O
Memo1->Lines->Add("");
/ o) ^# \) r0 C8 j! _: d+ i}
- C' @# a* w, d5 f
( h! j5 P5 e9 l/ ]2 x/ C9 X--------------------------------------------------------------------------------
8 M/ D D0 ?" w7 e3 ~. ? A" o
" ~6 \) Q3 l- D9 a/ \WMI 可以访问的信息类型有:
! g! n' Y" k$ o9 E5 Z Win32_1394Controller% D& \- {/ c, E- k
Win32_BaseBoard0 d8 X# F$ b1 J
Win32_Battery
0 ^6 ]' W0 K& P% z/ s U4 r' x Win32_BIOS9 Q0 N5 D& ~6 R1 B7 d' u' z
Win32_Bus
' Q' a" t( o* Y+ J Win32_CacheMemory
# G" `5 T+ B2 U% n- H Win32_CDROMDrive4 Q4 f6 u$ X5 e8 {7 x# J
Win32_CurrentProbe$ O3 j7 U: V3 a' b# u9 {- l9 x2 O
Win32_DesktopMonitor1 s' t/ C% P# ~; ]8 P& Q* c
Win32_DeviceMemoryAddress6 L# y$ q& p3 j7 L8 a$ r
Win32_DiskDrive
+ o$ l7 V9 Y+ n9 P5 ~/ u( ?% B% u Win32_DisplayConfiguration
6 i. ?! E" Q2 R) B1 P: R& F+ T2 A Win32_DisplayControllerConfiguration
4 k/ Y6 r0 @% p3 o7 w Win32_DMAChannel
9 {' c0 G) n4 W' H1 c Win32_Fan
* P- H' K$ ~5 j- a* r" u Win32_FloppyController
5 y X, W8 |% x8 U4 B' B Win32_FloppyDrive
% n0 {# G# y6 {( R3 m Win32_HeatPipe$ l& E5 U+ k' o* Z
Win32_IDEController
/ a. [! \. C7 r1 O; Q- b- ] Win32_InfraredDevice
, v1 U& q2 N, @0 V Win32_IRQResource; j" A1 I7 g6 a6 R D* b
Win32_Keyboard
3 a! n# Y8 \; Q: `2 E. V Win32_MemoryArray
# ?+ K' r% Q! ~; n Win32_MemoryDevice
8 Q0 g U% ^! L6 J+ }' M3 \ Win32_MotherboardDevice
! W5 @2 [: M( l! G* F7 \9 y Win32_NetworkAdapter7 d2 ]4 O: o6 B2 K% u. }1 u r
Win32_NetworkAdapterConfiguration
) B" h) @ x }& Y5 D( ~* d" S% F Win32_OnBoardDevice
% `* u4 c( l3 z7 |; ?4 u Win32_ParallelPort- z( `1 K t7 e! A- B' ?$ c
Win32_PCMCIAController
. L" S+ L) l, ?. v2 L1 ? Win32_PhysicalMemory; _/ J) J9 @! X" m
Win32_PhysicalMemoryArray
, R% @: W! ?4 B Win32_PnPEntity
6 }6 _: C [0 f$ }% q. q: v. Q: | Win32_PointingDevice) V6 m3 U' R: |1 U4 a$ b8 @2 }+ R
Win32_PortableBattery7 Z H& z$ _- d$ V3 T
Win32_PortConnector
# [( k+ s, }3 k5 m. L8 ~ Win32_PortResource' o( y/ @* l6 R2 \" _2 p
Win32_POTSModem: h" }: ^* H: J4 g2 e _2 h
Win32_PowerManagementEvent
! ^5 k. S! W; v Win32_Printer. J( A, ~, x, q/ R) u
Win32_PrinterConfiguration1 r6 u0 t& F8 k% U$ P
Win32_PrintJob; v3 x. |# n5 F
Win32_Processor- M, k% a( A( l/ f/ W& Z8 \
Win32_Refrigeration S! n. m; C L1 V9 w" |/ I, z
Win32_SerialPort; ^, \* F }. V0 F7 F' L. W
Win32_SerialPortConfiguration+ b8 a Q0 T) y; w
Win32_SMBIOSMemory
- H/ d O1 J/ G! A/ p& x& _9 B1 N Win32_SoundDevice
4 j+ [) m h. s7 {9 V9 c9 V Win32_SystemEnclosure( p2 G- n. q2 z; s r
Win32_SystemMemoryResource
0 l( ^; r: t8 H2 S+ d/ [6 Y Win32_SystemSlot, x' ]: r: Z C# B# @# m3 s6 `% y) G
Win32_TapeDrive
7 J* I7 i1 Q5 | n Win32_TemperatureProbe
: ]+ _. \4 p( R2 h Win32_UninterruptiblePowerSupply: p0 j( S$ c5 f
Win32_USBController
4 n7 Z" N& ~! m0 M6 }& ? Win32_VideoConfiguration
8 A; [2 }9 P% y) L- f& ^ Win32_VideoController8 u$ S' R9 V5 ?' X: S
Win32_VoltageProbe
2 c( Z: y2 K1 w3 L- R* o+ N: I% D1 H
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios"); |
|