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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
( [/ p& V) n: Y8 m( `: R! |
4 Y# E- u! {/ X
0 ~$ N+ k# N" H--------------------------------------------------------------------------------; K( [) `4 B' p& Z0 G& j
WMI: Windows Management Instrumentation (Windows 管理工具)( i) L; Y* n* ~* M4 u
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
$ K; Q0 i6 b- `" d, _$ h   利用这个工具可以管理本地或客户端系统中几乎所有的信息。! f1 j! {0 m* }% E" j0 O
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
; \* u7 W0 @; W5 V( u/ F4 j& E! y) n9 g5 F4 I! |% a( ~
--------------------------------------------------------------------------------* g4 C( t2 d' i' G: W
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面, `) w' B6 Z9 u1 g/ {! b. r

7 w' f) A2 L; ?7 A--------------------------------------------------------------------------------! C2 E" U% c5 [- h' ]& U" _3 V
① 初始化 COM 接口:
* \% F) a( K2 O) [2 E" [+ N   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。0 u% s0 Y2 P) s6 I
  这两个函数在 #include <comdef.h> 里面定义。
) E2 r. Q7 C5 X+ E% b3 N, I( ^% |" E4 O
② 获取访问 WMI 权限:
1 {# t; m: `' y, j3 |   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
" y' n4 P& _6 B% H, q6 P   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
" L0 y$ e# K: ?/ h# t$ G/ U* I# o; ~) X5 ?8 ^* _$ J
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
/ J+ a& O; h6 g* g) F   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。1 t8 m  O3 k5 l* Z9 \

; B/ l% {+ K9 _void GetWmiInfo(TStrings *lpList, WideString wsClass)
" F; t# {# I. K0 A/ v: e{
# `; G5 f" J, n# S+ K  IWbemLocator *pWbemLocator = NULL;$ J- f8 o( ^2 i$ L4 k% r2 D
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)5 w" y$ ?+ t! A# E, j! I$ m4 ]
  {! p* E+ |5 n, L& }" E
    IWbemServices *pWbemServices = NULL;
7 K& R$ F- P! q- d0 E/ E) S     WideString wsNamespace = (L"root\\cimv2");
, Y9 Y6 f1 ?0 G2 q     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
( J8 D$ l. O% Y1 }: n/ o' f; Z      {
2 B8 N2 G/ ^. ]4 A+ N9 w        IEnumWbemClassObject *pEnumClassObject = NULL;; Y  F( \4 y& {, m( V# J6 d7 j
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
7 U2 ]( J' ^8 B: E' M& M  ?        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
0 w0 R* L* Y" t- S3 T         {1 _4 {9 x+ g% b" j8 b
          IWbemClassObject *pClassObject = NULL;- ~% q  I: `4 }: u( Q' x7 P5 y
          ULONG uCount = 1, uReturned;1 u3 a! H/ c+ o0 N
          if(pEnumClassObject->Reset() == S_OK)
( ^% \1 V+ {" K8 P' E' S8 y) t/ X            {+ {& i% k6 w: G# _
             int iEnumIdx = 0;" g5 q" J! E* N1 b2 h
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
. j" G7 n+ g( o               {
( N  B# Y. l. p                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
/ p6 M! [2 M5 G2 w9 r) u6 y( s4 @" A7 F' {/ c
                SAFEARRAY *pvNames = NULL;
3 Q8 s* e- j; B/ v5 ~                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
  ]+ T6 v& G8 D  c6 N                  {
% ^# p/ L  y% z4 k5 x/ {: A  z                    long vbl, vbu;
' L) z$ l% {+ @6 C$ k2 s( Q/ r$ k                    SafeArrayGetLBound(pvNames, 1, &vbl);
: I: A) I; Z- y+ F                    SafeArrayGetUBound(pvNames, 1, &vbu);! e  u9 F4 l$ W& m; i, Q, z
                   for(long idx=vbl; idx<=vbu; idx++)
4 E& ~. r4 M6 e                     {
5 j6 _0 E/ p" y* \. d3 W" X                       long aidx = idx;
. N) O7 E# N' G0 e4 s                       wchar_t *wsName = 0;
! m1 w7 A' c/ \1 T' W# N                       VARIANT vValue;6 }8 r$ @- W4 R! B) ?' ?
                      VariantInit(&vValue);
" T) b% S1 E. h4 \( d6 C2 J                       SafeArrayGetElement(pvNames, &aidx, &wsName);1 K" E0 E  ?4 C3 E) q+ l# o0 [4 q

3 W5 e! X3 E4 _/ O- M                       BSTR bs = SysAllocString(wsName);+ W4 o7 R# H' G& Y6 b
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);2 G4 ^! U- t7 l+ ]0 \0 i
                      SysFreeString(bs);( F0 O; L9 {8 `

/ `# ^2 z, D* g6 H5 z                       if(hRes == S_OK)
  T3 Y4 g$ y0 B, P/ ?, g. ~6 V: r                        {
3 t- ?1 n$ N, H. K. X                          AnsiString s;- r* \& T. O) l1 |0 v8 Y
                         Variant v = *(Variant*)&vValue;
/ F  ]- c) `( J                          if(v.IsArray())
+ D/ U" p5 c; _9 M" Q: ]                           {4 M! ]9 g" y/ A% n
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)& x  y* O% k* n) s
                             {
" m% F$ j  D9 U' K                                Variant a = v.GetElement(i);, I* m5 p+ F& [8 h: t2 C" O
                               if(!s.IsEmpty())
6 c& I2 r  A4 H# \9 z/ u8 ~  g                                  s+=", ";% _/ b# W. c- {& {& P
                               s+=VarToStr(a);1 `1 x( W1 n5 b0 U
                             }
# t! Q9 c' P0 |9 {0 B7 W+ A                           }
4 A- R: [0 L7 b  W                          else5 H% _3 A+ F. u
                          {* d8 `4 F; y, q7 V) |
                            s = VarToStr(v);
# ]* R0 I. }2 U2 i                           }
( q- _6 @; c8 L% E                          lpList->Add(AnsiString(wsName)+"="+s);6 I- Q6 z) @% i! i8 b% T
                       }* @4 {0 i  H* H9 S
, J8 h7 t9 }$ j1 v3 j. l6 t
                      VariantClear(&vValue);/ x) ]  Y* g, y% S. ?0 O
                      SysFreeString(wsName);, p0 Y/ @1 b% y' l, ]% N
                    }
' P* X+ W, a7 E  H                  }
* H$ F! i4 [6 i( b4 |7 k                 if(pvNames)SafeArrayDestroy(pvNames);
. R. H+ m; o3 D, q5 k                 iEnumIdx++;. y8 K( O! r; ]6 I0 D% Z& N
              }3 Z6 C" s: w" W3 W1 \+ ^) `! \
           }
; ?: w! ?7 I( u& X( i           if(pClassObject)pClassObject->Release();8 V' U, |! L1 m6 g2 u3 X) Q8 X  E. v
        }
$ f6 \$ {3 ?1 n( }- E        if(pEnumClassObject)pEnumClassObject->Release();7 x/ H- v! X6 A, [
     }
3 j6 O0 p1 @$ U- V' t1 Y     if(pWbemServices)pWbemServices->Release();: \) a0 o. e5 W8 D3 |+ i
  }
& ^. w% q) e1 V2 g* j  if(pWbemLocator)pWbemLocator->Release();
7 V; b3 R" S1 t& H+ w4 a% F0 Z" J}
2 O1 I; i( R- K, D8 d" g, e+ E& A//---------------------------------------------------------------------------7 z* {! i7 }2 ?4 ^3 h9 K5 P, x

' r8 ~1 V6 v- }0 N4 m2 }// 通过 WIN32_bios 获取 BIOS 信息:* h4 M# X  ]1 E2 J
void __fastcall TForm1::Button1Click(TObject *Sender)
& Q# d7 Z: t: i- M4 o1 R{
: o" f) q1 w* [7 `4 \5 G1 Z9 Y    Memo1->Lines->Add("================== [WIN32_bios] =================");
( m, w- ~* ?) n4 r8 N    GetWmiInfo(Memo1->Lines, "WIN32_bios");) |7 c! H( X& j
   Memo1->Lines->Add("");8 {% K9 G1 B- i. V
}9 y& D2 b/ ^5 F: s7 A+ f- i( Q
/ c( e+ Q  l9 ^
--------------------------------------------------------------------------------
1 c3 X) c( Z8 n& T1 p8 @4 W2 n
& L! Q- J2 H# W( v0 k7 DWMI 可以访问的信息类型有:) Q; i) n2 [  y. d, Q0 I
  Win32_1394Controller
/ n+ y. V0 @( A, ^# d0 I) q   Win32_BaseBoard7 K, W" B# d$ n7 i
  Win32_Battery- f: L2 l+ ^& n2 `& w: F
  Win32_BIOS
/ H- C0 q0 r, H; s( T! E   Win32_Bus
, k' f2 q3 d5 R- x6 g* Q9 {   Win32_CacheMemory
3 c. a) }1 |6 q' B   Win32_CDROMDrive7 ?: Q4 u2 A" M/ N% F3 z; R! G
  Win32_CurrentProbe* e" Q4 u0 U5 j
  Win32_DesktopMonitor% ]4 i2 ?2 ^5 c8 g( f9 j
  Win32_DeviceMemoryAddress
3 t* n  W: a8 F3 Z$ e. I  N   Win32_DiskDrive9 w/ [) D4 H/ @
  Win32_DisplayConfiguration
' j# W% \: @/ ~: h7 [8 i& l   Win32_DisplayControllerConfiguration8 d  O8 t& \% B- `
  Win32_DMAChannel5 X' t. \& j8 u3 W
  Win32_Fan; q# r( ]9 [1 w  ]4 ~; {# S1 N* e
  Win32_FloppyController
! S9 U& {; p4 k) o7 w, g   Win32_FloppyDrive
- _& h5 P" {' Q/ S1 g* [7 I$ a   Win32_HeatPipe
& b' ?5 g  f( ?) l& j& f( y. G   Win32_IDEController
9 E0 g4 @( M& v4 _- P   Win32_InfraredDevice
5 u5 f8 y7 p9 {7 e$ N+ A! J! Z% z   Win32_IRQResource
( X8 Z, L( }  r# q7 H+ K7 h2 n   Win32_Keyboard& \9 `( d7 I- q) f& G! h! T
  Win32_MemoryArray
" j. s, j" ]2 X" e1 u0 ]2 T1 `( e- P   Win32_MemoryDevice
' @$ o* r0 ?9 ?2 q   Win32_MotherboardDevice
, C' r9 A; }: k1 c" V+ Y   Win32_NetworkAdapter# g$ F$ e  l, G; t) M3 P) U
  Win32_NetworkAdapterConfiguration
6 C' O6 z+ p, u7 Z4 @* y. T   Win32_OnBoardDevice4 z1 j/ W/ A# a0 H# d+ t+ G! Q
  Win32_ParallelPort
. c. _: u* `/ r0 ^7 I; _   Win32_PCMCIAController! r1 H/ D/ s; N  t
  Win32_PhysicalMemory# m6 Q% J: a, l$ w2 d' @
  Win32_PhysicalMemoryArray& B0 k, b+ r3 s2 T1 g! N
  Win32_PnPEntity
% O; a: h, U( J   Win32_PointingDevice  m1 g( F% V- r5 @9 |$ ~: H
  Win32_PortableBattery
2 r/ w2 L) D* G" |) d$ ]   Win32_PortConnector
# M8 |! \* ?- r% ^7 d   Win32_PortResource
) |% T! ^: h* x% E, z   Win32_POTSModem
+ i/ Y3 D7 h+ ~9 |& u   Win32_PowerManagementEvent
; }- Z2 G- }4 T7 ^4 s   Win32_Printer$ q( }3 B4 j* [- I# y3 J
  Win32_PrinterConfiguration+ x3 ?, N- n# C$ H1 Q0 g7 ?6 J; ?
  Win32_PrintJob
( o+ o* c% b% k- ^6 i4 `2 T   Win32_Processor
  F/ ^; u0 E9 }9 O   Win32_Refrigeration
: H5 Z/ j( \4 d* f* @0 t   Win32_SerialPort1 d0 t- W  m$ z  W# y# |# n/ A4 I3 @
  Win32_SerialPortConfiguration0 |  `- l$ y8 G; R
  Win32_SMBIOSMemory8 p4 }( g' b( h( z& a9 o0 }2 b
  Win32_SoundDevice
6 e, \0 Q& p; B   Win32_SystemEnclosure! V; l, q+ E  |9 ]( F
  Win32_SystemMemoryResource9 w& Z1 S' |# E: ?
  Win32_SystemSlot) R1 e2 N2 h+ g) h+ J" D
  Win32_TapeDrive
; D5 R# l. P9 g# ?, O  M/ @( Z   Win32_TemperatureProbe
  H( _0 D" _  i. g   Win32_UninterruptiblePowerSupply
, ~$ }. I! `; S5 k* s! |   Win32_USBController7 ^# i8 Q6 y% C& m  \6 I$ ]: W6 }) j
  Win32_VideoConfiguration1 m! M1 V: h% l1 w5 I1 d$ w
  Win32_VideoController1 _4 w0 ^$ d1 O! \
  Win32_VoltageProbe
; N6 @* v( l4 U! j. X/ U$ X4 z1 |# U4 M
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-22 00:33 , Processed in 0.020286 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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