|
|
Victor Chen, (C++ 爱好者)
( h6 m$ t3 `) G! Y+ k5 P. {' E' F( H6 O% w
1 K5 {% R/ {6 V% ?
--------------------------------------------------------------------------------
* Q* O7 N2 ~9 I2 hWMI: Windows Management Instrumentation (Windows 管理工具)+ Z8 p- N/ c3 w* D7 {- ~
通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
; \/ h9 L! l, Y9 | 利用这个工具可以管理本地或客户端系统中几乎所有的信息。# E, w; b0 X2 |' w+ i t) u
很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
; N L7 ?! Y4 l6 d+ F9 z3 R0 _" W6 O, J) Z1 Q; @
--------------------------------------------------------------------------------" K9 o3 ^' b" b- k1 Y ]# C
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面7 d, V- r u0 A7 K$ e( p) e
, b, u" C) Z% r7 Q$ `% R
--------------------------------------------------------------------------------
: O2 S5 g) h( F }8 B① 初始化 COM 接口:
' E5 C: e7 @8 b1 g. U; M 访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
. C5 D$ t7 p; }9 G- G8 }9 s 这两个函数在 #include <comdef.h> 里面定义。
1 Q+ n4 }) Y# l; H0 H, N0 a- j% V$ @% U8 |
② 获取访问 WMI 权限:' U8 E1 L- M* |! u
CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);+ P7 U& g2 ^2 h [
如果这个函数返回 S_OK 获取权限成功, 否则为失败。- F7 V* ?7 j# [, I" W
8 Q( B0 m, A1 @# z* z③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:7 O0 i3 O8 W8 D! S6 z
这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
5 X6 R' |+ a3 X# _& N* N! n, m% u$ {* w8 z. P) P( r3 n4 G6 |
void GetWmiInfo(TStrings *lpList, WideString wsClass)
2 t8 K, k6 i8 i0 Q" u* {{+ h8 y E# W4 I3 X. F7 d4 C6 l, t
IWbemLocator *pWbemLocator = NULL;
* i4 k# D/ S7 O9 `1 d; B if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)2 t0 i* O7 U+ w: J6 D3 h) [
{& I' \ `4 Y+ R
IWbemServices *pWbemServices = NULL;/ A0 d! I( _" {0 y9 p1 y& H
WideString wsNamespace = (L"root\\cimv2");
( ?$ c J5 T6 E' w if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
7 B+ E' Q1 `. |. |, l0 }, L8 {5 |2 e: J {/ |2 {" H. V( j# h: f# W
IEnumWbemClassObject *pEnumClassObject = NULL;6 M' U# e7 w) n$ H
WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
: Z# O- U3 b) d8 e2 \ if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)7 J* _0 @, V3 ^
{5 T1 b8 p& l+ N
IWbemClassObject *pClassObject = NULL;
( T1 y; w$ ~ `% F ULONG uCount = 1, uReturned; V8 b; x# G5 F! z
if(pEnumClassObject->Reset() == S_OK)& v, s/ ^0 [8 |, E
{! i5 ?9 Q1 z2 i- v8 h+ S; d
int iEnumIdx = 0;
9 `1 \' Q! D6 i while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)/ C' }3 |, M8 s( ?0 d% J, I/ Z
{
+ a5 B1 X6 W9 C+ m9 s lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
. w+ j3 R/ B8 m9 x4 g9 f7 t3 a# j& @! t! a% Z; Q3 \. N
SAFEARRAY *pvNames = NULL;# V. {5 G" @& }! H5 R+ Z
if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK), j% L% z* Y/ f! s( s" k- w
{
4 e6 `9 ^; d: o0 J long vbl, vbu;
; y) M$ y* Z7 E& f5 k$ ?; G% L SafeArrayGetLBound(pvNames, 1, &vbl);
/ U' E/ s% g1 h+ s SafeArrayGetUBound(pvNames, 1, &vbu);
5 ?' C; }5 F2 o. d7 H# `5 L9 e for(long idx=vbl; idx<=vbu; idx++)% B W4 j- l, t0 B
{
: [) n* V. T! o) n5 j5 z long aidx = idx;
0 x0 Z- @ T6 d' v wchar_t *wsName = 0;
1 r% h' p3 s& X$ P VARIANT vValue;
8 W/ r' H# _" q/ e VariantInit(&vValue);0 f( {. X7 |6 l9 R! q# o
SafeArrayGetElement(pvNames, &aidx, &wsName);1 S$ L) p. J$ w9 T/ X; U
% ]! ]3 e- y* g/ N) y7 `
BSTR bs = SysAllocString(wsName);$ a9 c+ {: n4 F$ d6 D- J" V
HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
! Z) X* E! y7 W V0 Z) c U SysFreeString(bs);
+ S5 r! i$ Z- j" `3 d# G8 A/ w* M4 ~5 M( F: G" Y* T0 S% E X, l' O6 Z1 ~
if(hRes == S_OK)
" M& i' y; T8 n7 r P! W; ? V {
& |- b1 C8 a* ^$ T% p AnsiString s;
0 Q# N- i% G; I+ A4 E! m6 E/ n9 { Variant v = *(Variant*)&vValue;! k2 E9 ]7 X2 m* {' w
if(v.IsArray()) t/ X9 P8 V4 C) F( |/ \
{
4 Y8 E) I* g+ g* x for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)" _9 V- G5 e# y1 z: C, r
{
1 \5 p' X- {" E, L9 n# Q+ X' E Variant a = v.GetElement(i);, O- U% F9 y9 G
if(!s.IsEmpty())0 d1 [- X" G' G z& u
s+=", ";
' v- t! w, E8 v- h( [" d( j s+=VarToStr(a);
: {# C. y, A; o: V* P3 D- X/ r } r( P% z+ q* t/ f7 u, U) }
}
2 [" j6 t" H/ X* A' ` else; p7 l# A6 a# \4 Z" F" `
{5 V; q$ R; i6 c
s = VarToStr(v);
3 Z3 U+ x4 O$ D }3 @2 e6 r% P4 S; M7 m
lpList->Add(AnsiString(wsName)+"="+s);9 ]* J- v: A' G4 E! G( ^ t1 F/ n( I
}
, a0 u0 R' n7 f; C
) h2 s. d# y8 @( `: ?" T$ b VariantClear(&vValue);
6 v$ h R ]1 i$ b2 r SysFreeString(wsName);
, o$ p/ s/ u- D }
9 F& ^8 J2 D2 N1 j$ Y }
9 u7 f+ ~+ G0 b/ ~2 _& y if(pvNames)SafeArrayDestroy(pvNames);6 v. M! U% r$ ^: n4 E
iEnumIdx++;
3 `5 Y, R; W' B E. h6 ?0 a }
5 A; ?, J0 y' n; Q! N' Y' j }7 [4 v$ X5 e( z" `8 \
if(pClassObject)pClassObject->Release();
% w' @3 ?* ?" g! \ }$ c; e" t/ t# G0 G9 K
if(pEnumClassObject)pEnumClassObject->Release();
' q* k' Y# l5 G. E! x } Z- p0 N0 x( D9 `. B4 x7 [! ^
if(pWbemServices)pWbemServices->Release();4 H" Y" i! y( L& A! u1 W& a U7 r
}, G( u) ]3 R v1 m0 `% v. A# h# @# [% I
if(pWbemLocator)pWbemLocator->Release();; V0 K- }5 W, {- Z* [3 W4 M6 `) Y
}5 Z2 O, J1 J1 W: T
//---------------------------------------------------------------------------
/ _8 _; K! Z: |/ P: X& T& x
, J2 ?; f% O9 q& Y# G* a* }* H3 _// 通过 WIN32_bios 获取 BIOS 信息:
% Z7 l: A8 @) b/ vvoid __fastcall TForm1::Button1Click(TObject *Sender)* O0 u h6 z4 w
{
) A' L4 O4 @/ X) T3 o. @7 i Memo1->Lines->Add("================== [WIN32_bios] =================");
' M, }- ~& N$ n6 l GetWmiInfo(Memo1->Lines, "WIN32_bios");
8 Q& |6 @7 h' H4 w$ z( b Memo1->Lines->Add("");* c# F7 H: k) t( f; y; V
}! e; l/ q v' y$ q5 Z# {, G1 E! u
+ T$ w1 [, B5 E' ?; ~; O& n--------------------------------------------------------------------------------3 ~3 i( @2 q; R2 S# D1 f) J
: N2 V2 D6 o7 b5 t5 H" gWMI 可以访问的信息类型有:
0 x# \1 j- ]7 \$ X8 u Win32_1394Controller* w6 A5 g5 M: W% @
Win32_BaseBoard
7 Q' Z3 U- \( Q4 n( b' s Win32_Battery- h9 T" z2 d) @6 [
Win32_BIOS
2 q) O4 y1 k& B' @ G: E Win32_Bus
9 x3 k8 `6 I2 @3 F6 e5 ~ Win32_CacheMemory6 d- m+ R/ n+ m' \8 I
Win32_CDROMDrive
* f3 q% D0 M* v3 o7 N Win32_CurrentProbe
1 U" h# s7 m0 G) |4 d; X Win32_DesktopMonitor$ k! {/ v% \8 f0 ?; @
Win32_DeviceMemoryAddress6 B7 G- r/ y6 z1 s# g
Win32_DiskDrive& t9 [& D) n _; I& g
Win32_DisplayConfiguration
6 l* e+ w8 d$ M* @8 B0 C Win32_DisplayControllerConfiguration* S$ v r7 c! A7 A# a
Win32_DMAChannel: o4 N) `1 P; k+ H
Win32_Fan
1 Y+ u8 ^/ s" A6 `: r Win32_FloppyController. U6 O! D m8 `
Win32_FloppyDrive
8 V6 q; d2 a) j* ^- E5 k" H3 a I0 O Win32_HeatPipe) U! g# t+ [$ x8 n- L; c; a
Win32_IDEController2 Q) E. _( m1 D3 q; W6 S* b" u% v2 A! U
Win32_InfraredDevice
* F/ g$ m$ V" m; F8 k Win32_IRQResource! h& a y$ D) X
Win32_Keyboard
" I0 R8 a0 U" D# {' ]1 K( U Win32_MemoryArray+ T+ O+ k* B8 }) K8 C6 B5 M8 U
Win32_MemoryDevice
y$ \) J* y, y8 h$ R Win32_MotherboardDevice: X# M8 C% _' F) ^. ?. m
Win32_NetworkAdapter
: H6 F- e5 g/ O2 X- Y Win32_NetworkAdapterConfiguration
9 J) j: R0 ^$ {! e2 ]. P9 F Win32_OnBoardDevice/ r! Y0 n' L7 u. y4 J& g0 b7 C6 x
Win32_ParallelPort, M/ P; \# k O2 K4 O# I2 u
Win32_PCMCIAController) w' b9 P- z( O% F4 f
Win32_PhysicalMemory4 {8 G* D8 ~0 y/ J8 s- k; l
Win32_PhysicalMemoryArray2 _ }3 w8 n; @$ S+ |7 N3 C! @: f, v
Win32_PnPEntity
* S% [% A/ Z+ V9 j Win32_PointingDevice
8 ?. x' s, P% {9 v# H6 L% f Win32_PortableBattery
+ }) S& ?, z1 r0 }2 v0 c4 B Win32_PortConnector: F& z) D3 N9 i! w: p
Win32_PortResource6 Y' I' {6 e& ]/ _ Q# w
Win32_POTSModem* A* t/ I; R5 Y' q2 v2 J' ~
Win32_PowerManagementEvent
" L* h. d# l. Z: U6 x+ p& \ Win32_Printer
2 o6 g8 r! s6 H+ \ Win32_PrinterConfiguration
y% z, N! E, B/ I9 ?2 t- s. ~: I( P Win32_PrintJob
1 o" S) |$ n4 v' E( i Win32_Processor
3 Q9 ~. b6 F3 p: j! L% V Win32_Refrigeration
2 L$ r4 n7 R, t/ z0 F Win32_SerialPort
8 l$ t! i% V5 g U: v9 ~6 L Win32_SerialPortConfiguration2 i( @6 B( Q* u
Win32_SMBIOSMemory
7 U6 \/ V& ~- P: l# B2 Q* K- Y Win32_SoundDevice
9 v* s! f7 W# B4 V6 [3 \- F( J Win32_SystemEnclosure
3 x' v% v6 o5 H* q Win32_SystemMemoryResource3 Y* }% i% z, a- M7 i1 B& c3 |
Win32_SystemSlot
4 P' u0 e" a/ g v- Y1 k5 | Win32_TapeDrive: Q' @ J3 w# ]1 E0 V8 p
Win32_TemperatureProbe. t# F0 ~! z% f5 U2 @1 H
Win32_UninterruptiblePowerSupply
8 |0 Z3 _1 P7 D" V# {* ~9 L Win32_USBController
. p% S! R; ?0 U/ V Win32_VideoConfiguration
) N. n0 b, S2 K& @ Win32_VideoController# |4 u9 a6 Q$ y5 Q
Win32_VoltageProbe
. W8 a5 |- Z, u$ z. l2 d. p. A- G' p! _* {9 N! |! g) {
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios"); |
|