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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
1 o+ D, x; L8 y0 R1 T; Z
* Q2 y, l9 T1 M% c8 u3 B
8 `+ T- h; J/ P' K' R2 j- w--------------------------------------------------------------------------------3 T( x8 D/ Y8 T2 h, M/ K
WMI: Windows Management Instrumentation (Windows 管理工具)
8 K6 E5 p8 `" G6 |5 g   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 9 c: B, _1 k( }
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
# Q/ P$ {; d4 u' s   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 # ?  e2 Y5 s$ X! ]; _+ g7 q- ]

) i" k9 r8 I( v' a- p$ \6 Z8 ]2 r--------------------------------------------------------------------------------  N. S( C; O0 x9 B( }! B1 @$ \; Q
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
/ V. ~% L1 o6 ^2 [7 T' ~
% g& {; l+ J1 w( w: f; v0 m5 }& n--------------------------------------------------------------------------------
& c" k& J+ R. a2 A① 初始化 COM 接口:' b2 m" S2 n% Z( t* U$ {
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
! o$ A1 K: _; L4 o) L- S7 a1 K   这两个函数在 #include <comdef.h> 里面定义。1 B  d7 ?5 t8 y0 X1 N
, v2 O9 a9 X( f/ m7 i
② 获取访问 WMI 权限:$ B3 Z  F" v! n6 g& V/ ]! T
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);. j/ E( e% w3 \* ]/ v
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。5 p! k4 p- A7 x. l, C
" a2 b% K4 k: }
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:2 O0 _2 s7 _/ U' G" p, s
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。# H% Y' f- N, w

# j. B7 v0 w; I. _: zvoid GetWmiInfo(TStrings *lpList, WideString wsClass), N# R% P1 |5 Y, C
{
9 t5 R6 y1 c; G3 _8 T7 z, `  IWbemLocator *pWbemLocator = NULL;
* s0 W' q9 I" ]7 |  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
4 k2 m8 x3 E/ h4 X4 E   {
) O# ~1 G* B& y3 V, i! b     IWbemServices *pWbemServices = NULL;) `6 u+ n' Q7 w' V. X
    WideString wsNamespace = (L"root\\cimv2");
, ^- I$ X4 k- J# }. o     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)  E$ B; v3 E6 l
     {
* O  H) _! _' d# A1 r& {4 A        IEnumWbemClassObject *pEnumClassObject = NULL;: s, d& ?0 U% g* U, T0 p1 {% t
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
4 v8 g7 [/ g, }- e. [% K  G        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
# j' Z5 K  u  p5 e" T7 Z+ v/ h         {
% X: J$ r) p+ _7 D1 ~3 b           IWbemClassObject *pClassObject = NULL;
' ?3 [- m" X/ ~           ULONG uCount = 1, uReturned;1 y0 y9 {+ w! O6 S" B' Y. _
          if(pEnumClassObject->Reset() == S_OK)
( ?& k& `- T- s            {6 L" z3 r+ |) U) T1 X: j
             int iEnumIdx = 0;
7 S! e* {) y- |/ ?8 \* _9 V              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)& m1 X. f; J; u/ X2 A
              {! y4 x0 R& x& o& K
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
" O* K% j" U# j2 N7 U7 A: U) t% A" h0 G+ [
                SAFEARRAY *pvNames = NULL;5 j2 f+ t) G) L; |5 f4 }
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
: q; B( C0 s' n  l4 s2 z                  {4 D3 Q6 n9 x* U+ v' C2 s* ^
                   long vbl, vbu;6 F% n. A3 z6 t3 W4 G& H' y
                   SafeArrayGetLBound(pvNames, 1, &vbl);5 e$ W/ O, d, Y& m* @  h
                   SafeArrayGetUBound(pvNames, 1, &vbu);% C% Q7 u- g+ X; k
                   for(long idx=vbl; idx<=vbu; idx++)+ _: f) k: y2 L* `3 V5 _; G: I% |
                    {& d' c0 X! J9 U2 H" S
                      long aidx = idx;
0 `8 x5 g. _& Q$ [& V1 Q                       wchar_t *wsName = 0;
4 p& W/ d5 Z' X2 [0 u                       VARIANT vValue;
, \( v1 V- f/ h8 ]! U2 ^5 w                       VariantInit(&vValue);& h9 ^" O0 H, ^+ L4 P# n
                      SafeArrayGetElement(pvNames, &aidx, &wsName);" F% C0 f' ]4 T5 M  C( c* f0 b. P5 s

" u2 r4 @4 f8 Q+ p! P6 G8 G                       BSTR bs = SysAllocString(wsName);" u* P) f. R( h" C& B8 D. c
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);$ I* ]3 q2 E# Q) x7 j
                      SysFreeString(bs);; M' t3 b+ c, U- d
* Y1 m& z. N# W8 p; V. o
                      if(hRes == S_OK)
) w4 P) G* D+ S8 [                        {
' W2 G% k$ E4 s2 I2 j                          AnsiString s;5 L: D  v8 b! W+ |+ z
                         Variant v = *(Variant*)&vValue;
1 p4 m" l' O- t" J                          if(v.IsArray())0 w, o5 \1 {7 S' L2 @
                          {5 U7 ^5 j5 N, I2 W
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
+ q4 c* l% K  |( q& k9 k( A/ [* m                              {: S( |1 |5 V: z* m/ b
                               Variant a = v.GetElement(i);
6 o, v# z$ c: n  o' s8 O1 s4 Z                                if(!s.IsEmpty())
0 y+ S) ]+ f7 C# S                                  s+=", ";
' n8 I, b7 o8 Z1 B- Q5 R3 a                                s+=VarToStr(a);1 q5 I7 ]7 p9 A4 w1 E! [
                             }4 z* Y  R: v3 \: Y( d% q$ U9 s
                          }
/ {% h0 k4 G, y                          else
5 `  D5 k9 U) A3 {$ H3 t                           {( J# L% q( `6 o3 Y
                            s = VarToStr(v);
8 l" w' l; m4 Z                           }
% I4 D# o7 O" y, j9 |                          lpList->Add(AnsiString(wsName)+"="+s);. [+ U1 j, q5 u* e' I1 r$ V. X
                       }
- Y/ f4 Q( V) ]
/ z" U2 y: k* }( x( J2 g+ w                       VariantClear(&vValue);3 E) g! Q& ~7 N
                      SysFreeString(wsName);
& m% o  T1 x* \7 N1 V* j/ m                     }
" U* `) \: w! Q                  }+ K  s4 K( j+ ~3 G
                if(pvNames)SafeArrayDestroy(pvNames);* L9 r3 u3 d3 S2 R  a2 M6 \4 ?
                iEnumIdx++;
( z- j* I: {* R. \% L$ L3 }, N               }
+ e) `3 p" j+ b0 I            }
! n9 [, R% E' s' o9 H) D           if(pClassObject)pClassObject->Release();) `) C4 M* p" h# c8 |" _( {
        }* n, K, J; y- j. U0 p3 ]; t0 u
       if(pEnumClassObject)pEnumClassObject->Release();
5 L. ]3 N' r) D9 s      }
8 N% P) h$ w) S  r# j& J0 P( Q8 o     if(pWbemServices)pWbemServices->Release();' I$ X# M: n$ s; \
  }( L4 p7 m7 |5 K! ^, W4 U+ ?2 O
  if(pWbemLocator)pWbemLocator->Release();- h& Z8 w, W9 z" ~5 D. ^1 C; i
}
1 r1 c0 {+ J) r! r+ |  f! N//---------------------------------------------------------------------------
% e. Q# s2 G- h7 y. G! V
, S3 v3 A* o- A$ X* K1 V6 ]' b7 \// 通过 WIN32_bios 获取 BIOS 信息:# [$ p' o+ g8 h$ D
void __fastcall TForm1::Button1Click(TObject *Sender)
" R& R/ p4 A( N: k; J, r, L) B{; ]9 Y; B3 N  J5 @
   Memo1->Lines->Add("================== [WIN32_bios] =================");5 H- n- n1 G$ `& p4 _# ^
   GetWmiInfo(Memo1->Lines, "WIN32_bios");  P5 U0 }$ c- [  {" s
   Memo1->Lines->Add("");
! z. e/ t8 Q7 n# R" g}
/ v3 B' a( l+ L( e$ ^3 [9 s! _8 }
--------------------------------------------------------------------------------
4 X5 p9 A; X! `5 C# b3 x) p4 q
) e" i4 T5 y, r9 C6 |WMI 可以访问的信息类型有:
. w0 k7 k. D2 Q( w; `/ [5 t   Win32_1394Controller
' {: h) z+ S3 u: N8 c   Win32_BaseBoard6 @, R* E7 f" E# Q" h5 ^
  Win32_Battery
0 e9 ~. [3 Z: S% M   Win32_BIOS
3 a7 g+ i+ @5 y2 F4 r; a   Win32_Bus
7 n; o! s4 l" l. M   Win32_CacheMemory. C: J  A0 K1 j0 H) X
  Win32_CDROMDrive" O3 I) V0 a$ o0 I, k- o
  Win32_CurrentProbe- u6 @; j- c. e9 p1 j) t4 d4 ~
  Win32_DesktopMonitor
: I* J7 x2 c+ a: v5 n   Win32_DeviceMemoryAddress# G2 U5 ]0 a9 R5 Z  j; s. a- V: j$ w
  Win32_DiskDrive* M; M  `" i7 F0 x
  Win32_DisplayConfiguration
( U* v" ?( |: U* i   Win32_DisplayControllerConfiguration
4 o4 ]1 i) ~% z: N) O9 P   Win32_DMAChannel
, @0 Q5 x9 m9 u4 w5 N2 {+ q' ?, |9 N   Win32_Fan
- g7 F4 w/ t& J3 Q! y. }& o, l9 ^   Win32_FloppyController! P0 U4 a$ {; B
  Win32_FloppyDrive
& h( E5 R8 Y0 R. l& a3 T4 m   Win32_HeatPipe
4 [0 R/ N  _9 Z$ l   Win32_IDEController0 V) B: m# a2 E4 U
  Win32_InfraredDevice
3 Y. I9 m' {  F+ m9 @   Win32_IRQResource* Y0 D/ ^  }' c- n
  Win32_Keyboard
  _9 k# @& m# m4 H2 u   Win32_MemoryArray
+ H2 o) {4 K% q, W+ G$ U0 i   Win32_MemoryDevice; B5 O, e5 M; T: t* l: K; H
  Win32_MotherboardDevice
# A2 |: Q8 L2 l6 g   Win32_NetworkAdapter7 p  H: g/ `. c$ ^# C
  Win32_NetworkAdapterConfiguration
4 N) W4 b  G: |' x* O& L   Win32_OnBoardDevice+ c2 a- K" r7 O7 X3 N
  Win32_ParallelPort
/ l% g) p4 e* {* S- H, \2 B2 B. |   Win32_PCMCIAController
- H6 P) \4 q% c$ K  N6 s3 ~   Win32_PhysicalMemory
& q0 K& w2 H% q4 I; m: q4 Z   Win32_PhysicalMemoryArray2 f0 a8 d# N; N. C7 K- J& S" C
  Win32_PnPEntity% U; }- I) T" s+ O, p8 T  G
  Win32_PointingDevice8 @+ U9 }+ T4 x. V/ g$ [7 H' D
  Win32_PortableBattery
; F3 d5 t0 r* X1 K8 U4 c   Win32_PortConnector
0 r; H" w# {# N; s: |) \6 e$ ~   Win32_PortResource
2 H$ s/ V- i$ o* W4 }) j   Win32_POTSModem8 T% Y2 P  ]. v
  Win32_PowerManagementEvent: C, _5 S  m4 o: K/ p
  Win32_Printer
1 @! V4 r3 {1 s( A   Win32_PrinterConfiguration, l% x( ?' r  ]0 s( e! q
  Win32_PrintJob2 {* C) ?4 u! K
  Win32_Processor1 J* @$ _8 \7 Z% V# A
  Win32_Refrigeration
2 j( R( y" N. V, |8 D2 L   Win32_SerialPort; n0 u. r% m5 D' a1 z
  Win32_SerialPortConfiguration- t  w* W; k: x/ j# L
  Win32_SMBIOSMemory  w9 t) }( u$ i1 H% i9 @& w& p
  Win32_SoundDevice
4 n: z, P+ Z6 r8 n) A/ b+ ?9 w   Win32_SystemEnclosure' Z0 f! R4 u( b! N4 e5 |1 U( h
  Win32_SystemMemoryResource
, g! G- |9 c$ |8 a   Win32_SystemSlot( _6 m% R, f1 i
  Win32_TapeDrive
& t$ D; @' D( z) }6 E   Win32_TemperatureProbe
& k( v# E' F; H% R2 e. H   Win32_UninterruptiblePowerSupply
6 Q+ s8 _( o- l9 i4 s) }' V   Win32_USBController( }' \8 q' g7 h
  Win32_VideoConfiguration
+ F5 M& M' l5 ?3 e% B# u( Y   Win32_VideoController
5 K, J: x7 [) t6 O* i& I7 j  }* O. Y   Win32_VoltageProbe+ O, b; ]; y% T
% z# c* e7 D( T: d+ h- ?) U
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-15 04:38 , Processed in 0.019811 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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