|
|
Victor Chen, (C++ 爱好者)9 |5 \ D/ C, b' r0 }% H/ I: ?+ O
: e5 t' S, E" b+ l; @' S
Y6 r+ F2 L- [& @--------------------------------------------------------------------------------2 c) Q7 y. y5 o) F7 v5 R
WMI: Windows Management Instrumentation (Windows 管理工具)' _1 ~. m( N2 p$ P0 |, [
通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ! R# g6 J1 [9 W" q
利用这个工具可以管理本地或客户端系统中几乎所有的信息。
7 i) W3 @( c! F7 i 很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
' c5 q' ~' H( K1 i" Z
1 u N, Z8 V% \* B) v% l& s; K* l2 b--------------------------------------------------------------------------------. h, F0 `% w( e) T* M$ }
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
& E) Q8 D* z; D" u5 t6 c' z1 g( L/ O5 M+ W$ H+ {8 [
--------------------------------------------------------------------------------3 S# u, U F3 p$ {
① 初始化 COM 接口:
* p" z# |- B, e5 j( C3 w 访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
" }" K; Z; c# K8 \8 r" d 这两个函数在 #include <comdef.h> 里面定义。& A9 @4 v. f& I; `: p8 Q% q( L
) S0 l6 @8 c2 Y2 K# W9 o- ~② 获取访问 WMI 权限:9 l* P) Q0 K7 B' Q7 h. e/ t
CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
3 G8 {8 b6 t1 a, g7 Y: D" q 如果这个函数返回 S_OK 获取权限成功, 否则为失败。
/ z1 t1 `2 L. n X" x3 K7 e" |
# C' n# H7 a! y+ c4 Z③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
}: ~. j9 O/ \$ r2 C 这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。8 j/ ?, I5 A" x
* L: b6 H% }+ x, K ^5 |. j
void GetWmiInfo(TStrings *lpList, WideString wsClass)
6 `8 V- v, X( F* h- H3 G7 p{0 R$ M5 c1 @. ^1 v: V( u
IWbemLocator *pWbemLocator = NULL;4 x0 ^7 d. U/ Y" [( f
if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)- `( w8 L( Y# X' H; E6 r
{
+ u. U; w# K% h& N) K8 x IWbemServices *pWbemServices = NULL;
$ D! v3 W/ l% n9 E4 O6 a$ J# {* R2 \ WideString wsNamespace = (L"root\\cimv2");" q# Z2 h% K% a0 g9 {( J4 D3 P
if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)6 d- m( d) H6 O. _% s L9 \8 X
{( w5 X* c" W( f! c& l( ~* f
IEnumWbemClassObject *pEnumClassObject = NULL;
4 d0 o' d% |$ L6 Y: x: e WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
* F' u1 ?4 Y1 c) }" s if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
# Z: l6 e: a5 R; c {
9 [1 {: W! S9 D0 C3 L IWbemClassObject *pClassObject = NULL;
( Q: f% G$ Y: @% X6 d1 R0 K1 t ULONG uCount = 1, uReturned;9 F: w! Y+ H8 L: i( t( S. l/ g
if(pEnumClassObject->Reset() == S_OK)3 X# n3 N6 e2 C+ m, d. Y
{
' T) l9 H& `+ k- c* D1 \ int iEnumIdx = 0;5 u m: f2 X! g. N! n3 p' m1 Q
while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
# W# L4 G3 t: Y9 l {6 G4 \2 l0 V. ?9 w" q9 B& X
lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
1 B" b$ n) G3 c* u; Y/ [# r" F$ W, r1 S0 L" L
SAFEARRAY *pvNames = NULL;
" y: c5 }" r8 g+ l* i if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK): L% {& v# G. f/ X! e& V
{
$ H; \" M/ l% n* y5 o long vbl, vbu;5 P9 R4 y, f- R. u0 K' {' r, U
SafeArrayGetLBound(pvNames, 1, &vbl);) y! a3 }( y+ z9 Y( q8 m% ]& h
SafeArrayGetUBound(pvNames, 1, &vbu);
& O [$ V; O& j; |7 N# \ for(long idx=vbl; idx<=vbu; idx++)8 t ] @* G3 R' {1 F9 |7 q, X
{
/ w4 w l, p3 g& z. ?' D6 u- \ long aidx = idx;
. w5 S8 R8 y& P. ^" m0 L wchar_t *wsName = 0;
$ C; y! O0 A1 e VARIANT vValue;3 R' x( J4 }5 Y" D
VariantInit(&vValue);* c9 `4 N+ x2 p7 l* V3 v
SafeArrayGetElement(pvNames, &aidx, &wsName);
% x6 |; l5 z& Q3 }# m9 t* i* G" p. f; E G3 |# j
BSTR bs = SysAllocString(wsName);5 ]6 L- H3 p) P& y% V0 @0 Q
HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);# |* J/ b7 L/ c5 C U ?
SysFreeString(bs);6 L9 v( U1 W3 a$ m# v
) {& X* z* t9 r# b- h9 H
if(hRes == S_OK)) c7 _9 Q! S* f0 B# c5 M1 c. I
{5 \! \' i M, c
AnsiString s;3 I$ O0 }3 r, o% B w
Variant v = *(Variant*)&vValue;$ Q/ W2 p# R6 }' u
if(v.IsArray())) K" u: F+ L" n- u- `7 o: Y
{
( e0 Y$ M! B+ M ~- p5 |9 i' m for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)1 t' y& i7 s* P" i
{' R& c4 x" \: c) e
Variant a = v.GetElement(i); ?5 n( z' k: u, ?
if(!s.IsEmpty())3 }& M% b! s$ W. \. Z, \0 N
s+=", ";
# O/ c! K3 V8 g7 ` s+=VarToStr(a);
& s. t2 d6 m- ]2 E, \( O2 X h }8 q( v# D; \% H' K4 U
}5 c. i6 c8 @, D2 o
else
f% ^# m0 X* V {
2 y: a4 {, L% ] s = VarToStr(v);
9 I% t- q- C) c3 l8 r }
$ r9 |) j% z1 F. N, [: a lpList->Add(AnsiString(wsName)+"="+s);
0 @1 o* U" M: I( f! W, i0 v }7 _, p) S& y% \, Z. ]: O0 q
2 G+ ?: |8 P0 E& d0 Y2 [
VariantClear(&vValue);% R. K2 r- q- f( _/ Y1 V) _8 j! m9 ?
SysFreeString(wsName);
4 F z+ T4 X, C2 N+ U }
Q5 k' u2 L2 j( \ }) V8 ~2 Z! c# J; L! G. x
if(pvNames)SafeArrayDestroy(pvNames);% X9 i, C( r2 x7 A( Z
iEnumIdx++;* D0 ^7 C5 q% B- {2 i* M* t
}
/ R, s" K! ^* o4 y% a" ` }
8 k4 j5 w7 K6 j' ]8 f2 B' W if(pClassObject)pClassObject->Release();- l" z9 W2 i) i+ k: U
}
3 |& ?( N6 @. l3 m& c if(pEnumClassObject)pEnumClassObject->Release();; i* @8 _- p3 d( F: \( G
}
6 F& C( K. A) u) p if(pWbemServices)pWbemServices->Release();
4 v6 i R V: w$ Z7 q5 ]& J }
3 d- T: T1 T& @+ w/ V% p if(pWbemLocator)pWbemLocator->Release();
- D' B( q5 \+ S5 D- u: Q) {}. l' K# p. M# o
//---------------------------------------------------------------------------% Y+ ^" L! ?' l ~$ T0 }/ C/ e
4 `" N7 E4 R+ H// 通过 WIN32_bios 获取 BIOS 信息:
3 ^5 D& g6 g" T3 b: a6 Bvoid __fastcall TForm1::Button1Click(TObject *Sender)
, U; e" m: `7 P; l# I{
0 }! ~3 [7 ]5 w Memo1->Lines->Add("================== [WIN32_bios] =================");
7 }8 _0 s4 ?6 m& t6 G$ Y1 K' D GetWmiInfo(Memo1->Lines, "WIN32_bios");
4 Y) W0 I/ J) e" m6 B; J Memo1->Lines->Add("");
* i, o# u6 c& y& j' X}4 s# x3 t5 a9 _& ^
: d. f4 Q2 _, g+ I/ ~7 h6 C7 T--------------------------------------------------------------------------------
( C* C' k4 W+ d# G, I
. u0 ]7 X' d0 r/ QWMI 可以访问的信息类型有:
+ s- b: U( \* E4 n F Win32_1394Controller$ y" Q+ q# A. j E
Win32_BaseBoard
1 d. ^) B: D) M- V$ [ Win32_Battery* p" S: k$ p6 F
Win32_BIOS) t8 I! P/ }. `6 q9 ~* D
Win32_Bus `$ O/ w+ B. J. ~2 q8 V, k0 b
Win32_CacheMemory
# m. R, t" `" U8 q: D3 f" w* U Win32_CDROMDrive5 V8 n9 B; _+ E0 Z6 M+ b& T0 B
Win32_CurrentProbe
* o$ b6 M. ^& S7 S% [% S$ B) a Win32_DesktopMonitor9 F: h: u1 J: `0 O2 U, n5 W
Win32_DeviceMemoryAddress2 V, d: b3 x9 c9 V p/ p, ?# d
Win32_DiskDrive5 [* Y* q7 J [4 U7 t
Win32_DisplayConfiguration) u& g( X) l' W s
Win32_DisplayControllerConfiguration% ^" ^0 ?; [7 C2 J3 v# m7 e4 c
Win32_DMAChannel
. V y2 ]/ g1 e* ~ Win32_Fan
8 E) I6 L+ o" y$ z4 E6 m( g; R2 b Win32_FloppyController* n- R2 z' z1 v2 o
Win32_FloppyDrive
' ~! c6 K' D5 ` Q' G Win32_HeatPipe
" q6 g( ~! l2 z, |' \: `+ P- o' Z Win32_IDEController
7 s+ `# }1 X9 u! J+ x8 L ` Win32_InfraredDevice
* O/ \9 V4 R9 d/ ? I( b$ F# o Win32_IRQResource
5 N |& s8 }* B0 X& ` Win32_Keyboard
/ i# Z" w* `# r6 n' d# B Win32_MemoryArray
6 q7 K$ M+ e, r2 h5 r Win32_MemoryDevice
4 ^ g% }1 Z/ d) Z& q4 b$ ]$ Y& q Win32_MotherboardDevice) x* _5 g6 t' X0 W, y
Win32_NetworkAdapter' }* S _; Q& D1 W% h- ~
Win32_NetworkAdapterConfiguration
. ^/ i6 M3 a* ?! _- s Win32_OnBoardDevice6 e& _/ U; O, D; G; x3 W
Win32_ParallelPort
6 ~. @6 K2 M( O- L* N Win32_PCMCIAController, y+ ?: T' y+ k: Q1 P; o7 A
Win32_PhysicalMemory
. m$ a: b4 P7 y/ _ Win32_PhysicalMemoryArray5 t4 E8 z7 a& X; d) _5 }: j. i
Win32_PnPEntity( _, w' y& H! Z1 E4 _
Win32_PointingDevice
2 O4 |3 `) U; |3 Z% C C) g Win32_PortableBattery7 q, c$ H4 S. j9 W& ~/ I, I
Win32_PortConnector4 E0 K0 C+ X5 _
Win32_PortResource) E2 y/ v7 J" E/ Y) t. Y/ @
Win32_POTSModem+ a- u& b: V8 x1 g% O
Win32_PowerManagementEvent
7 \8 x. b V: I9 a' t Win32_Printer
w3 N8 R& A4 c Win32_PrinterConfiguration
* \/ q6 y0 K* b5 a* X3 { Win32_PrintJob
7 M/ w; {+ U! C7 t' Q Win32_Processor9 y5 F3 ?+ g5 y7 v! p- m
Win32_Refrigeration
* I! q6 a0 ]3 M w1 J6 M& i8 E Win32_SerialPort
- H( I" `: M9 |+ V+ ] Win32_SerialPortConfiguration9 h# i8 k/ F) j2 I) v2 Y7 G3 t) B
Win32_SMBIOSMemory1 D" Z' w- A! h/ m
Win32_SoundDevice3 P! O' |- c1 ^7 x% i! n
Win32_SystemEnclosure
, C5 L/ V( {% g( ~1 S Win32_SystemMemoryResource0 a6 K% i$ ` I6 _5 W& } ]; j& F
Win32_SystemSlot4 C6 N1 [4 t. W# A L+ V
Win32_TapeDrive
: U' b. m# Q, R/ c5 Z6 F Win32_TemperatureProbe2 a3 x- i- a( O& p9 r
Win32_UninterruptiblePowerSupply. R: G1 @6 @$ k& }+ {! P% J
Win32_USBController
& N" r- G* T, c/ G& g% ^* F: c& | Win32_VideoConfiguration
% ?7 G* w4 P+ x' _ Win32_VideoController
4 f. |1 U5 i( G1 y3 w e( b- k Win32_VoltageProbe6 ?$ z: W1 W) x2 ]
( o: P2 R4 k: A$ m8 E+ }
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios"); |
|