找回密码
 注册
搜索
查看: 12838|回复: 0

[收藏]C++ Builder 通过 WMI 获取系统信息

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)- M2 p+ m/ w) U" [# n) ^2 r. t
/ D& `8 b& A) @& B& `/ N

! ~/ g7 y% v0 T' ?- m4 g--------------------------------------------------------------------------------$ X$ a- D* X: W8 i
WMI: Windows Management Instrumentation (Windows 管理工具)+ H; I& s6 @9 D+ R/ X; m4 j
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
( f4 T& w/ i% b8 Z2 r   利用这个工具可以管理本地或客户端系统中几乎所有的信息。: B# w" y* m% w3 r; E
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 8 a+ u7 h  G6 L+ F' t
% y8 ?$ ^- t' u" M, J
--------------------------------------------------------------------------------
5 ]* [$ u  {. Q; eBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
7 v" o, }" k. v3 [5 R  t8 z: P3 i1 o9 _2 r# u6 m! k  L% w2 ~
--------------------------------------------------------------------------------
3 h, _& F; Q- v' R① 初始化 COM 接口:
3 L7 D6 i0 F8 ^% `+ q3 X" k8 T   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。6 ?) j) X6 P- p) Z# X
  这两个函数在 #include <comdef.h> 里面定义。
5 Y1 W) p; u; R, t( s* J( O
3 \6 S" T" L  |& c' _/ q② 获取访问 WMI 权限:
- J' G$ w% K; E( S) A   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);9 @/ Y1 F0 ]& ~1 Q2 S
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
, e8 P6 _1 \" i3 `% Z% C0 p
$ e" O7 f; x& ~- j③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
( H) @0 K+ u4 G. Z+ r# `   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
5 B* |' b  w- v. F4 z7 F( A1 z
6 G3 G0 X8 x" A& m2 yvoid GetWmiInfo(TStrings *lpList, WideString wsClass)$ y, w3 d3 |3 F: v3 L& y
{5 A8 V$ i, g0 ^, E+ c
  IWbemLocator *pWbemLocator = NULL;
7 c. N4 F7 z+ u7 s5 B  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
1 v& E5 Z6 i( E, A: G7 Y   {
, ^3 T3 p4 ?+ l1 p     IWbemServices *pWbemServices = NULL;
0 u. E  N# S( w/ i9 J( a  T3 Y     WideString wsNamespace = (L"root\\cimv2");+ q  q! g: [0 Z1 u. o8 p* H! K
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
# }% X, q$ P; A% J/ S      {% d9 X/ C  Z$ v  g$ n5 T$ d& y
       IEnumWbemClassObject *pEnumClassObject = NULL;7 T, `8 `2 J9 {( f
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;' r0 v4 a) X8 t& X
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
; v, u. W% e# |9 `3 \8 s) H, R6 Y; n         {
) Q( m3 B% E' C           IWbemClassObject *pClassObject = NULL;
0 j- K1 H1 |' g" ^  y           ULONG uCount = 1, uReturned;7 g. ]4 b6 F, U
          if(pEnumClassObject->Reset() == S_OK)
) N0 i' m0 B7 X' l. p  e            {& }9 i: R0 v. p3 Y/ b/ S+ [
             int iEnumIdx = 0;3 D( |8 S) `( D+ q: q: [) @2 R* |4 m
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
1 L6 g) |& H& ~; {0 @               {
/ e( b! @' X7 L7 L8 A8 W4 J                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");/ N+ V( W. s% B. U( N% S! {: P: R

1 G7 L+ s" E3 A. \! ^7 F/ ?* z                 SAFEARRAY *pvNames = NULL;
- \* Y4 t& V+ l/ N& Z" D                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
9 v4 Y! g& y" I" G                  {6 z/ R: y. ?1 g5 }
                   long vbl, vbu;
. n5 P6 D+ l6 _                    SafeArrayGetLBound(pvNames, 1, &vbl);
  D+ Y5 r0 B. V$ T) Z* _                    SafeArrayGetUBound(pvNames, 1, &vbu);
4 Y# f2 m2 {" q* [. Q                    for(long idx=vbl; idx<=vbu; idx++)
5 u& o' U: a: T6 e5 }- F" E                     {( |/ P' @% \% e$ J! i0 Y2 u2 s
                      long aidx = idx;
" }. k4 z' I- X3 j                       wchar_t *wsName = 0;
, S1 a2 [  J! q: |                       VARIANT vValue;
* x3 \7 o: p4 D% D9 B. o                       VariantInit(&vValue);
6 |% d3 K0 t( ^! W1 E                       SafeArrayGetElement(pvNames, &aidx, &wsName);
# J4 P- O  w* ~
. ]  ^1 `1 @9 r: B. O' H0 }. ?                       BSTR bs = SysAllocString(wsName);0 \- V; _0 a' g/ a0 q7 `
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);$ b" A: M# z, A  u0 a8 n' n' W
                      SysFreeString(bs);2 ^' ^: ^# C4 M/ @/ c5 I" q$ f

0 p( Q0 j# K6 u7 ?0 q                       if(hRes == S_OK)3 K! s+ b" C' B( p* s# e, C; |0 T
                       {+ n* }3 h' H& m  ^3 F; V
                         AnsiString s;
) Q% v8 x9 ]: B( D7 |( n2 I0 s  ^                          Variant v = *(Variant*)&vValue;
7 e% [: r9 k" l3 D- m) ^                          if(v.IsArray())
2 G2 Z" s: J1 W/ B$ w5 i% Z$ n                           {
. g1 ]7 ]) k1 e6 X) J7 w& _  v                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)8 o* {0 |  @+ E' J( Z
                             {- n+ v! S( f2 O
                               Variant a = v.GetElement(i);1 \* r0 e$ o3 I9 h4 q
                               if(!s.IsEmpty())" E* U8 ^8 L" v! e
                                 s+=", ";
/ c1 ~( l/ g, r) t; R                                s+=VarToStr(a);9 N: Z) r* }: N. l
                             }
3 ~$ d" @/ ~4 V/ h* _% e# N0 D                           }
8 x6 @: a4 r" K. n4 D1 M, Z                          else6 ]; f) U4 |) ~' k) V4 ^
                          {# k1 h7 [+ ]1 @/ F
                            s = VarToStr(v);
1 E' ]& U2 d" E7 f9 _9 Y5 m                           }
$ J$ @: t8 y8 n$ _- @* h+ U( E                          lpList->Add(AnsiString(wsName)+"="+s);( [" ?4 A5 `, r4 {! }% c6 D9 z
                       }
' C3 X& K& U# i( n: X, E
% i: K0 c+ u  }9 J4 ?                       VariantClear(&vValue);" r" @* f5 Y" L) q
                      SysFreeString(wsName);
. W. G/ H( Z, G/ ]                     }
& J# z/ {" d+ Z) s                  }3 E' v" i& h& e/ L7 T6 h8 K
                if(pvNames)SafeArrayDestroy(pvNames);
% b$ I8 n2 T$ O; C5 t2 o                 iEnumIdx++;4 N: Z( i$ w7 p2 C$ X5 L; p7 u
              }! k* ]. a9 h  J. R9 n! Z
           }, s+ ]7 X0 r+ y* _4 q9 i" M2 B0 k
          if(pClassObject)pClassObject->Release();, z, u3 b  b8 B8 i
        }7 S3 g* U4 y7 @3 o
       if(pEnumClassObject)pEnumClassObject->Release();% X: A- P2 s- w/ G* R
     }
0 G) K/ o8 P+ U3 O     if(pWbemServices)pWbemServices->Release();
7 Q- O( t* L! m  e) ?$ ~. d   }) u8 b1 ]6 F3 }+ f
  if(pWbemLocator)pWbemLocator->Release();
* _) n3 s- `0 U/ j}
) `4 r+ w2 O; d//---------------------------------------------------------------------------
: k; x: y8 P' ^3 `- H# W+ Z& J2 `% J, |0 h+ s
// 通过 WIN32_bios 获取 BIOS 信息:0 J0 p" `3 L1 X& q/ h: ?
void __fastcall TForm1::Button1Click(TObject *Sender)
7 P, j4 ?% l) S: s+ I8 @% n{7 x0 s- {; W# t. Y- E, w
   Memo1->Lines->Add("================== [WIN32_bios] =================");1 l! r& P, q* |: w+ m, s
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
: W4 ~9 d( c9 p    Memo1->Lines->Add("");8 h% j2 ]  p1 C8 r; C! Z
}4 p, D1 h1 k( U/ F' G3 y$ L

& Q% }  |, k% ]6 ?--------------------------------------------------------------------------------% h/ L! G% M* G" q# q0 e3 q$ m

' T' J8 ^0 {# X; n5 r9 ?$ P$ SWMI 可以访问的信息类型有:) v' p( [3 Q; X' ]
  Win32_1394Controller1 K5 Z: w: O6 n# t; R$ m4 O! r
  Win32_BaseBoard: K' D* V, s4 U. H4 Z1 |  S
  Win32_Battery
1 U! }4 P$ C/ L! `# h3 H+ h   Win32_BIOS
" i/ m% o; f) w( t- H   Win32_Bus; C. Z/ X' F# J' x
  Win32_CacheMemory
3 [- Z1 N+ N7 c$ k4 v& A, |   Win32_CDROMDrive
! W2 P' ]2 @4 S* [# h   Win32_CurrentProbe
1 X7 {9 [0 z/ a- b! L   Win32_DesktopMonitor4 Z3 ~, q* L' z
  Win32_DeviceMemoryAddress! K6 K$ J0 y$ i
  Win32_DiskDrive/ Z; M* Q1 W. \0 A( J
  Win32_DisplayConfiguration
# L& w2 C/ k2 b/ n% d   Win32_DisplayControllerConfiguration
+ ^% U3 e" h; y, @: c* v   Win32_DMAChannel6 y" e( x- K& b4 s" Y0 L9 V- c
  Win32_Fan
9 i$ X9 Q$ T1 q& w, |; p0 D   Win32_FloppyController! ~, f# \/ Z/ b3 f% k
  Win32_FloppyDrive! [) D9 Z7 ?- r
  Win32_HeatPipe6 a4 U. [& G$ z2 s
  Win32_IDEController
6 C4 @% F5 d0 A2 x( T   Win32_InfraredDevice
8 X! N( u/ B* O. t   Win32_IRQResource# N9 y2 v- G% @( h. X! H4 B
  Win32_Keyboard
8 d  E$ s1 N" @8 _   Win32_MemoryArray
  F6 x5 x1 ]& E7 R   Win32_MemoryDevice
" P7 a1 _' _3 Z# ]" S9 R# l7 l   Win32_MotherboardDevice0 i7 m$ e, x, d5 L; [
  Win32_NetworkAdapter, I2 O. b& V# h$ D5 k6 m+ Q* C% m
  Win32_NetworkAdapterConfiguration4 S8 Z0 l% v$ z* m* \8 w  Y! i
  Win32_OnBoardDevice0 }/ h. v5 V6 z0 ~4 G0 P
  Win32_ParallelPort
# n: o- S% n/ V) q   Win32_PCMCIAController+ u5 o/ i$ l7 u
  Win32_PhysicalMemory$ _3 _! q8 r0 |" Y% [
  Win32_PhysicalMemoryArray
7 a' a( u+ ?: z% u/ \   Win32_PnPEntity
# Y% w% k- @5 y+ W7 l: A+ m! ~   Win32_PointingDevice( v; X- B8 n) \3 r0 J2 v* k+ s
  Win32_PortableBattery
: q( D& h5 B) X- C& A1 r   Win32_PortConnector# J% Z9 E: o; H, Z
  Win32_PortResource
  \5 S) H( ]5 E6 X! R   Win32_POTSModem. v" H6 G$ U8 |  {1 z
  Win32_PowerManagementEvent( [9 i  u0 X$ z
  Win32_Printer
+ `) s: C" J& ~- ?; e- D! f   Win32_PrinterConfiguration
9 R9 r. v9 m+ i( A   Win32_PrintJob
5 i3 C6 [; \+ }; Z9 j   Win32_Processor
7 W0 Q( |, c! M# r   Win32_Refrigeration; q/ O& U& w; I) \, F/ c
  Win32_SerialPort, ?, v6 p2 I* ^- T) ~* ?
  Win32_SerialPortConfiguration
- k% h+ c0 ]& I3 u: T   Win32_SMBIOSMemory% C, }% v5 @6 l. }3 y0 o, z
  Win32_SoundDevice
- j, z: S4 g- E   Win32_SystemEnclosure
0 b) ?# M1 B) O: ?5 f2 X6 Z, v1 }   Win32_SystemMemoryResource2 R: H% `, ~- c( o* C
  Win32_SystemSlot+ N6 o# v5 E+ Q5 \8 |, B
  Win32_TapeDrive
* h! P/ ~% o' q2 E; P: |6 e5 C   Win32_TemperatureProbe, H3 U, ?% d7 I/ [  W
  Win32_UninterruptiblePowerSupply
0 h# E+ s% h8 M% m+ Q" N% N4 s   Win32_USBController
0 _) `) Z. Y, d   Win32_VideoConfiguration# Y. y9 J7 r% k3 v! M" h
  Win32_VideoController0 W+ {% U2 E! `! H+ k
  Win32_VoltageProbe4 |7 O' O) p: V# |% u

. J8 N9 A$ B+ g: y+ _. {, c7 d以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-1-31 15:56 , Processed in 0.018665 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表