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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
" U2 b7 T9 _& e
9 `9 q+ z9 e( A; U( e; t+ n, A7 x8 U: ?; z, m: y$ m
--------------------------------------------------------------------------------& _. B1 U# m% S: L
WMI: Windows Management Instrumentation (Windows 管理工具)
8 T, M5 {$ H# v; f- q   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
, R/ i1 e  D, _( y4 U$ {$ c   利用这个工具可以管理本地或客户端系统中几乎所有的信息。' e  A! E% ]+ g3 N! k
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
! h* b2 K* x: m  y9 [
! |3 R2 q& I$ e4 e/ i$ x* D0 A6 h--------------------------------------------------------------------------------$ X2 Z  d& R! W6 m0 M
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面+ H8 V1 n' i$ n' r& E# l
6 ^( K+ z! F/ C- {' I
--------------------------------------------------------------------------------& r5 Q/ K9 C6 b, v: ?* e9 H( Q
① 初始化 COM 接口:% v1 m. o9 o) q3 N
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
  k+ t2 _/ I3 T6 x2 c8 Y- p   这两个函数在 #include <comdef.h> 里面定义。
4 d; w8 b$ \$ t+ B( F" W, e
; s, e  g& k* |" q. W② 获取访问 WMI 权限:0 |7 V' d4 |( w: V& i5 ?
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);/ S$ c1 e) ~* q" b/ y( r( S
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
. v" c* K6 U. W) F6 ]" _4 g# l( a0 ?( n5 q; J
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:; u; c2 C/ [5 C; j9 [) c
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
5 ^8 t% z: Z: B' V3 j, J
, i1 b4 F+ N% c, u" |3 Tvoid GetWmiInfo(TStrings *lpList, WideString wsClass)3 j1 D+ j9 b7 q3 [6 H' z/ F/ L
{8 Y' R; w% u1 e% O: ]( U
  IWbemLocator *pWbemLocator = NULL;3 {! U+ v( B& ]9 t7 B
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)/ A) i2 W- n& d" U+ N+ D* V- c; R' X
  {7 c. ^/ w3 U/ E0 p  C
    IWbemServices *pWbemServices = NULL;
7 z% C: G( d: Z; q' j2 @; {) ?     WideString wsNamespace = (L"root\\cimv2");$ N- u9 s4 a; n+ P0 Q
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
* N: ]. D# R( B3 u1 v- d      {
5 k# |% n. ~9 r: V! @7 i        IEnumWbemClassObject *pEnumClassObject = NULL;
) O: T& N( P# m- y6 y        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;4 i0 S4 _' u0 j+ m/ r
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)7 c+ b, ]8 G. b6 [0 J  [, A
        {
' p6 i9 Z, t) t, [% u           IWbemClassObject *pClassObject = NULL;1 e% Q: W' ^$ R% N: g8 }( Q
          ULONG uCount = 1, uReturned;
5 t3 ?5 |2 w/ G* Z; [$ E           if(pEnumClassObject->Reset() == S_OK)7 |+ F0 O6 C% ~; n% R
           {
( w  _( P) P; P. o) V              int iEnumIdx = 0;
2 [+ Y4 [4 J& g              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
  T5 V6 p. x' s# Y4 a( S/ d( ^5 g               {2 r! D1 }* Y) ^
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");$ D0 H/ \7 }" w; H2 I5 |

$ n+ i! ~6 G" U& ?4 }4 m5 @/ I) h                 SAFEARRAY *pvNames = NULL;
' n; j) z2 {3 R7 ^1 [4 u5 [8 L                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)! q1 s2 c) p' G" s! b, Q$ J; w
                 {
* o  i& A! p* H1 w  J                    long vbl, vbu;" u% c! ^2 P7 I# @" W7 |+ I9 |9 l
                   SafeArrayGetLBound(pvNames, 1, &vbl);
* O9 K- K" ~$ T' C' \, Z7 A' Q                    SafeArrayGetUBound(pvNames, 1, &vbu);
0 q( w: t) m% b+ N" x5 y. ?/ U                    for(long idx=vbl; idx<=vbu; idx++)* ?4 l' e  R2 a% P; Z3 U, |. |
                    {
: o( w! m$ X  ~9 [3 ^+ `                       long aidx = idx;
' b0 D0 Q7 s' Q2 n                       wchar_t *wsName = 0;
6 K8 j9 T' h0 p: w* O                       VARIANT vValue;. l4 W& Z; L& w( b; ~6 U0 z
                      VariantInit(&vValue);/ ?, T0 f- X4 i: `9 ]
                      SafeArrayGetElement(pvNames, &aidx, &wsName);: b/ \  ~; f, q3 r2 d& d' u
7 O4 N5 y- A, F! e7 H4 x
                      BSTR bs = SysAllocString(wsName);
& w4 i* N$ f4 |7 ~, N, u8 p; w. f, X                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);4 F" S. ^3 f3 M
                      SysFreeString(bs);- G4 C  n- s7 x- ~
; H- F+ K6 S9 l) E1 T) |3 G! [
                      if(hRes == S_OK)
' u3 {5 p! g3 I. [# f0 f* g- r                        {
- P1 e! S. k! @                          AnsiString s;
) Z3 L/ E6 X- s6 L, _+ E* c                          Variant v = *(Variant*)&vValue;3 }* w+ D+ r3 _7 T2 B% r  s4 M* g
                         if(v.IsArray()). ^1 U; }/ l3 _$ U1 r% _
                          {
8 n) n: o$ P  Q" u# v) v) ~5 S+ D                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)0 O4 _' a7 \# [
                             {
' N: J" W5 J9 ?- P* @( g( g                                Variant a = v.GetElement(i);; {6 M& q" Q* c! F4 F% T3 t; P
                               if(!s.IsEmpty())
$ u4 t" a* e' w/ v- c  n  g' M/ G                                  s+=", ";
$ _5 G9 ^2 f$ a, k6 h  Y# b                                s+=VarToStr(a);
4 J9 E1 n* u) B; u5 _  B                              }
6 K9 k6 m+ W9 [  X: T                           }
4 |5 n9 q" S* n  _" r! Y4 q                          else6 w; f% ?2 b* l/ U3 v  b
                          {. ~: K% G! y4 D; u
                            s = VarToStr(v);1 v' C. _/ \  T2 d- E
                          }- `' m  M  g* t4 y. Y  m, `
                         lpList->Add(AnsiString(wsName)+"="+s);
9 d  F3 B+ b& |                        }  a; l2 y$ C. A( k
" y% D4 \7 R: `% g0 v/ s3 g
                      VariantClear(&vValue);
: E  C; ^" ]8 t. J) L4 g; Q                       SysFreeString(wsName);
$ I+ c- C1 d- }5 c2 y* u/ F' k- Y                     }
$ |/ ]3 T/ a" ?, S' |; q: }                  }& N* S4 ~5 J  I9 l
                if(pvNames)SafeArrayDestroy(pvNames);
0 J/ R5 V2 S' l9 M) U* D                 iEnumIdx++;
* V- H7 }0 `7 s7 w& @               }
( t5 \1 }5 M. L2 T- \2 v& S0 L0 p            }
. m" n, [) n1 X           if(pClassObject)pClassObject->Release();
' J4 w9 h0 W2 h& \! ~  L+ ?         }
  P/ h* s1 Q" ~' m        if(pEnumClassObject)pEnumClassObject->Release();. K6 i6 V  X# d% J% x) j  d3 S9 ]
     }
. M) }% y* |) K9 S" I# J     if(pWbemServices)pWbemServices->Release();( u) U+ d+ E+ s" ]  W5 G
  }% Y# U% t% ?: m' ]/ ^* t8 p8 `& C: v
  if(pWbemLocator)pWbemLocator->Release();/ u) y8 w( S0 D& r% W
}
% J# _# i4 x  A/ S$ U//---------------------------------------------------------------------------; r, p: a7 l8 E- t, \: A4 |( |1 p
1 m6 j5 N; R# o# h* Y7 o6 m
// 通过 WIN32_bios 获取 BIOS 信息:: r/ \. B) \  N: x* A$ @
void __fastcall TForm1::Button1Click(TObject *Sender)
; l/ L  q! O, q$ t2 @" w' p{
! V2 [  c9 t3 a    Memo1->Lines->Add("================== [WIN32_bios] =================");/ M  B. h, W  J# g( I
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
. u4 Y% _) j% C! D6 o9 W    Memo1->Lines->Add("");
" ]4 H  B# Y5 j1 ]+ K# \: j}
1 e- Y( B  x9 K' h( y  T1 x# z% C) ]3 y% M2 u4 q5 @2 H
--------------------------------------------------------------------------------
. ]8 t4 {$ _6 e) i; j/ X4 a  i) H3 }) z2 J6 g! S5 _  }/ n
WMI 可以访问的信息类型有:, n$ U! X9 m& K5 }. q  }
  Win32_1394Controller" w# [  ~% V, d+ }
  Win32_BaseBoard2 x8 R$ C: A0 I/ E' I6 h
  Win32_Battery
. ]: P. I/ Q6 F" Y& M$ I   Win32_BIOS# a- q% p, c/ S: g, \
  Win32_Bus
0 N" C0 B' U. [# e   Win32_CacheMemory
" y& U' i0 }1 f) I3 L5 O   Win32_CDROMDrive# z3 G3 V$ E) s/ b
  Win32_CurrentProbe4 r/ O& I9 W: h% B$ i" e4 U6 G
  Win32_DesktopMonitor
0 H# }  E8 }: M) v   Win32_DeviceMemoryAddress" A3 b7 x1 t% J# v3 P# I+ v
  Win32_DiskDrive4 d* j) D( `0 D: e9 `! r8 P
  Win32_DisplayConfiguration% g$ }0 C/ w. ?3 A
  Win32_DisplayControllerConfiguration: P6 Y; D2 o& `6 {4 w& l
  Win32_DMAChannel: W, c8 A' l7 m& [; f! t
  Win32_Fan
& l0 V& k; `/ s$ V$ q1 y% A   Win32_FloppyController1 b9 R' ~7 h6 ?/ @' t+ I0 Y
  Win32_FloppyDrive8 D5 v  s- u: `( C9 R0 {9 w
  Win32_HeatPipe$ l& t# \& V8 m3 r. a# D! h
  Win32_IDEController9 w7 ]/ ~! W. l# N3 X
  Win32_InfraredDevice0 ~/ D5 w, ^& R, f* G7 f
  Win32_IRQResource, e0 Q' q- R2 _) _* h0 b9 A9 l
  Win32_Keyboard; P3 }2 B, e$ f3 H, y
  Win32_MemoryArray
' _: a: J# _2 U' M   Win32_MemoryDevice
) f# n: Y1 O0 l   Win32_MotherboardDevice: T& T# T9 G7 g" u: R# ?; d# l
  Win32_NetworkAdapter8 k6 ^+ F) ]& W* P  O
  Win32_NetworkAdapterConfiguration
: N+ ]3 L5 A7 _) C8 v2 e0 r8 v   Win32_OnBoardDevice/ W' e3 h) b6 n* C5 F' ^( r2 ~5 ?
  Win32_ParallelPort
/ m  |4 U# V0 L! ?   Win32_PCMCIAController- Y2 d8 [7 V! q! P
  Win32_PhysicalMemory
6 B4 M- w' c. l6 s# g/ p( p   Win32_PhysicalMemoryArray
! N6 }, S$ a- a) ?   Win32_PnPEntity. g( V0 A+ s2 T
  Win32_PointingDevice8 H+ g9 i; D' C4 W: {
  Win32_PortableBattery) q1 s! y3 w9 {& |& |* Z; I8 E
  Win32_PortConnector+ Q8 M# u  g) ~/ X/ |
  Win32_PortResource
/ x1 _& B3 ?0 H( u2 c, P* R% C   Win32_POTSModem5 B$ f3 j" K2 m% V
  Win32_PowerManagementEvent( n7 m4 e- ^2 b. H6 I' x* G& f* Z
  Win32_Printer
7 S% p( A# |* S   Win32_PrinterConfiguration
  n5 `3 o$ p# z! o- F9 n   Win32_PrintJob. @2 [% |6 y: j- b$ y
  Win32_Processor
, H1 j1 G1 H& g3 _/ |: k2 j   Win32_Refrigeration' b) X$ U3 t4 Q, q( Q' f# C
  Win32_SerialPort5 @, o2 T( \  `% I$ W% ~+ n% u8 P
  Win32_SerialPortConfiguration, \9 h+ m; R- R3 K  B" [! t% _
  Win32_SMBIOSMemory
' _) s/ ?# A# V   Win32_SoundDevice/ l4 {+ c& B$ C' N0 ~
  Win32_SystemEnclosure
$ N; K2 t5 Q+ t8 M% u   Win32_SystemMemoryResource6 d" _+ h' ?/ b$ [' ?
  Win32_SystemSlot! Z& V9 r% G9 @# C5 M; c- k! q( Z
  Win32_TapeDrive" R' u8 X* ^: X: S3 B* e( P
  Win32_TemperatureProbe- K5 g9 \. a) s% O+ s1 ~6 o
  Win32_UninterruptiblePowerSupply
/ W9 r5 P3 l6 Q9 Y. T   Win32_USBController# ?) @: P1 m0 H* g7 P8 `) Q
  Win32_VideoConfiguration
- A' r+ a; N1 W. D   Win32_VideoController
- ~8 z: s/ \8 `1 W, C6 o# F0 V0 v   Win32_VoltageProbe
9 ]) U) C9 I+ c: Q) _) i
# O7 K+ ?, r9 m' d以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-22 17:26 , Processed in 0.020268 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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