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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
) ?, ~; \4 k- T
9 w% U  B& Z, }
  L0 v. m9 S3 W3 {' T, ]1 T--------------------------------------------------------------------------------
; e2 `$ F7 O8 N2 M3 f1 BWMI: Windows Management Instrumentation (Windows 管理工具)  V" D; X, N- M  l
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
& @2 v- E7 ?/ U- f" ]   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
2 O0 D+ _" \/ M  u   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
8 J/ i6 i: y; u: D* L
, J+ n; z7 l0 }! Z--------------------------------------------------------------------------------
$ e+ c4 W) F. ~1 B2 |; C: c, w, t+ t7 pBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
. z* c! [; o" U7 I" ~
2 b+ o9 `6 C* F--------------------------------------------------------------------------------9 S" o7 o( Z- ]3 F* {3 e3 q1 K
① 初始化 COM 接口:$ \: ]# m- X1 u6 o) g
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。: S, m, U7 ~5 ^8 L; t# {0 X
  这两个函数在 #include <comdef.h> 里面定义。$ ?" U+ t( e) N7 f2 t

  m0 T1 U8 l! l! b* R3 a- {1 N! z) U② 获取访问 WMI 权限:
6 M. T4 D  c0 I5 a   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
+ I9 ^* {8 A0 p* m) X$ \8 Z6 L( v   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
: r: p% K  A  L* A/ T$ F! J, R, ^, B5 z
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
2 @1 \5 L: R# k. ]   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。' H5 L) o! z6 D- O4 Y9 Z. G

( G2 c' X" z. p1 c, Vvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
8 A. f1 s7 \0 T6 o6 j3 |7 @{
- i/ \3 G% `2 A+ C" F4 o, q* N* @# L  IWbemLocator *pWbemLocator = NULL;
) F( R) G9 n, L% o3 l" W5 a  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
" h8 a0 I- [4 B) M( k( |   {
6 k1 F. w3 |1 V  Z8 k; ^     IWbemServices *pWbemServices = NULL;
7 k9 `6 T. ]3 Q( Y# p/ G* E     WideString wsNamespace = (L"root\\cimv2");1 r2 O, T- Y" y  \
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)& j$ i7 r' X, `
     {
, v$ c  x' \7 a5 c2 i& a        IEnumWbemClassObject *pEnumClassObject = NULL;; x0 e1 d3 z  B
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
' s+ u: E8 O' C/ O) T" M        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
' G% d+ q2 x% O( L         {
; I$ ~0 ~$ P, p) [: k           IWbemClassObject *pClassObject = NULL;
. |  D% x# ?. A2 B           ULONG uCount = 1, uReturned;1 A) C* h: S2 U* _
          if(pEnumClassObject->Reset() == S_OK)
% W0 v  `7 e- ]) [% Y% J) X( p            {3 q5 t9 [: ?  F
             int iEnumIdx = 0;+ m  Z$ o. V: S. n" d
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)3 L4 s; D; L. G
              {: l5 o$ U" k4 Z5 s
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");8 N& b+ ^, u, `5 W$ b
7 V! Y7 {0 P: _9 u
                SAFEARRAY *pvNames = NULL;6 O1 N; p2 I4 J$ {& M& P
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
0 m/ a7 r- _: G5 [                  {6 a5 F1 a( p4 D; Q! B, n0 S0 ?
                   long vbl, vbu;; N* b+ G  R' X; h
                   SafeArrayGetLBound(pvNames, 1, &vbl);0 o3 Q$ ~: Z9 j  ~
                   SafeArrayGetUBound(pvNames, 1, &vbu);" u1 Z6 u& L4 K1 z7 n
                   for(long idx=vbl; idx<=vbu; idx++), [# ?; {" `: h9 Q6 G$ ~' D
                    {
- L" q% w  ^9 N! u  b                       long aidx = idx;5 H# d+ S/ G) ^, v
                      wchar_t *wsName = 0;
. E4 v4 ~3 X$ P6 Y" a                       VARIANT vValue;' N  ]" s$ {4 B% r. |
                      VariantInit(&vValue);
! q' v/ Z. C( ], z8 ^                       SafeArrayGetElement(pvNames, &aidx, &wsName);
% h: l" g% a- w, a; C- G- G5 b0 F
                      BSTR bs = SysAllocString(wsName);7 ]4 L* w) G) h- J$ w- q. R
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
0 p/ o0 F* K; W+ d% a                       SysFreeString(bs);' {/ l/ t7 x! E* p; \

1 u  o* w* x  ?, K                       if(hRes == S_OK)0 S% x8 V# {# G, ]
                       {5 b: f+ x0 S5 P6 V( S) q
                         AnsiString s;; l' C1 r5 E; l: Y! w3 I+ `
                         Variant v = *(Variant*)&vValue;& x# j1 ?! a2 F9 E
                         if(v.IsArray())
( K0 N, N: Q2 O  e                           {* \# [# R6 A7 T" m0 ~
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
1 A  B6 W. B4 b                              {) b) _! m+ ~! E1 R4 ]8 `
                               Variant a = v.GetElement(i);9 Q8 h1 B" G; x2 P+ D7 ~; H
                               if(!s.IsEmpty())
8 P% I# e$ C1 L' ^4 q& P                                  s+=", ";
. w& J' g# I2 z0 r1 K7 g                                s+=VarToStr(a);3 c( O- O2 L1 d- r/ D
                             }
  ]. }" @! ]- w; w                           }' R6 A, z. V6 d$ S, }
                         else( O9 ]; E! Z% w! Y. i
                          {
) G* N) N6 f, y0 o' R: Z                             s = VarToStr(v);+ I+ \7 {4 a8 w9 y, }1 A
                          }
% t( D% n8 d/ u                          lpList->Add(AnsiString(wsName)+"="+s);! k7 P) \% N/ E; V% A  U" A
                       }
) r/ Z2 a% X( {' ~
  Q% U8 m, W' q3 H& H8 W/ l7 G; W/ q                       VariantClear(&vValue);
9 s' T" T% C: \9 [/ r- w9 z9 z1 n' h4 g                       SysFreeString(wsName);5 X7 C* ]2 {6 b& V" w- w
                    }
5 n1 ^/ j* Y, ~; `' }7 M                  }
; O, ^5 d% r5 M5 ?8 e+ [; E                 if(pvNames)SafeArrayDestroy(pvNames);! R8 M/ b% \0 v( g
                iEnumIdx++;
% q* R' {1 D7 s+ D               }
* ?* E1 k7 M' [3 l; l/ U            }7 T0 _+ [" _6 R) y# k: P3 ^* |
          if(pClassObject)pClassObject->Release();
# T, m+ m9 B# M4 t* g         }  G$ f% U" g3 @( B9 P1 D. z
       if(pEnumClassObject)pEnumClassObject->Release();' }# {5 O. i) t% H
     }
' G/ R  Z2 ~! N     if(pWbemServices)pWbemServices->Release();. S# k5 n" e. R7 A/ p4 Y
  }
5 Z9 ?: k. n: E7 K  X  if(pWbemLocator)pWbemLocator->Release();
& a! w5 i. [. I  t}
6 v+ y( @+ m; C  s9 M) F) h//---------------------------------------------------------------------------
: q- D' n3 W) I4 Z; d* K& N3 D
7 |) Y9 y* _8 @4 k( u// 通过 WIN32_bios 获取 BIOS 信息:
/ E; _1 W! {' ^void __fastcall TForm1::Button1Click(TObject *Sender). K( d4 r& p" c, }6 L9 N+ ~3 a. s' r
{7 ^2 |8 L5 R0 t, V' S! ~( Q! ?
   Memo1->Lines->Add("================== [WIN32_bios] =================");
1 J) l- ~  W7 g( y# h    GetWmiInfo(Memo1->Lines, "WIN32_bios");
# y" @3 B5 n9 \  I6 E    Memo1->Lines->Add("");! X9 m0 p5 g+ f5 `( `0 m' J6 k4 F
}
9 p4 K2 P9 h$ o/ K3 B1 p" X
. M- V1 ~- j3 r+ l- [- w& }--------------------------------------------------------------------------------
3 _9 B5 m) Q) G4 l8 U% `0 E7 ], E, |0 D9 I* S* i
WMI 可以访问的信息类型有:2 f" p$ O: n$ T" `8 g( T2 K- b, [
  Win32_1394Controller3 O7 I3 w3 |  {3 V- [2 y
  Win32_BaseBoard( Z# ?+ {% |& U' }6 ~
  Win32_Battery* L. T% j$ k1 F$ s, t
  Win32_BIOS
- B0 x1 }% S! J7 R$ ^   Win32_Bus
0 I6 ?. ?* q! T$ J9 q. R7 g- O3 P   Win32_CacheMemory' [( E( {0 V/ g1 O
  Win32_CDROMDrive
, W- n7 L0 T" }1 L   Win32_CurrentProbe% {& ?# t) v$ Y
  Win32_DesktopMonitor
! r! ]! W4 h% }; p9 w3 @% b$ g   Win32_DeviceMemoryAddress
7 L0 h3 v4 ~  S3 K" P9 x+ r+ u   Win32_DiskDrive6 V" P! \7 ]' w  U- h* X9 \
  Win32_DisplayConfiguration! [: A% t. A4 F; l/ }
  Win32_DisplayControllerConfiguration
3 z7 G! ~6 [, h9 i2 J; h+ [   Win32_DMAChannel$ G. m* z" S4 Q3 ~$ f" F8 E
  Win32_Fan
4 s4 Z4 \. Q; p. j4 D9 h   Win32_FloppyController* Q: Z1 R& B4 P" c' I& a
  Win32_FloppyDrive
; b  A  _+ A- ~  ~' V3 ?' k* ~   Win32_HeatPipe( e& u3 |1 g$ w% {( H4 z9 x9 M
  Win32_IDEController
9 `, j: T5 K8 ]8 a6 w' x   Win32_InfraredDevice
( m4 R  U* N! }) y" q$ [" \   Win32_IRQResource
9 S+ T* x9 h  N3 |   Win32_Keyboard1 V# y0 ]5 C1 ?4 E- H
  Win32_MemoryArray
9 S2 `& y. Q& }   Win32_MemoryDevice
4 _1 n" M, s- \' r8 D   Win32_MotherboardDevice  F; \% J5 S, C$ s2 i" s* ~1 ^
  Win32_NetworkAdapter4 B7 }1 G2 P6 v/ I9 s# P
  Win32_NetworkAdapterConfiguration3 ?0 d6 d6 f9 c( m5 C
  Win32_OnBoardDevice/ Z3 k4 o: |' W
  Win32_ParallelPort
  g# i9 B' B# |  e   Win32_PCMCIAController, V% x* O! e- ~
  Win32_PhysicalMemory
3 @% k" m; x' v$ _- H: |. @   Win32_PhysicalMemoryArray- G+ J* u) D  ~( v* z* F
  Win32_PnPEntity
7 ^, h. W+ O! |' d   Win32_PointingDevice
6 X; T; g  ?: Y9 o: q. p" C) c   Win32_PortableBattery
% ]; p$ E4 }  @  g2 @   Win32_PortConnector
( E5 o& U. V6 v, d' m; A  [+ o   Win32_PortResource) _# i- |! L2 q
  Win32_POTSModem
3 u: H3 Q, {. k9 J  Y   Win32_PowerManagementEvent. J8 R: S& T/ v5 y
  Win32_Printer* ]( R! y  H1 k( n9 T. g5 H! ]
  Win32_PrinterConfiguration
: g( N- V; Y0 I) H/ c1 Q   Win32_PrintJob, ~3 c) o' Q$ w
  Win32_Processor
3 p. ~4 v: A& v+ S   Win32_Refrigeration
5 H# l  S7 L& K  B* Q   Win32_SerialPort
3 R8 J7 A; J+ f! ^7 J5 O8 ^   Win32_SerialPortConfiguration
! U9 W6 M* U" `/ L  |   Win32_SMBIOSMemory- D$ z0 h0 F6 `# e$ D9 V: ]( K
  Win32_SoundDevice
( t5 v9 [+ j5 {: _  U8 ~9 e   Win32_SystemEnclosure
6 _. s- J" R. z* T" J- J2 L   Win32_SystemMemoryResource
- ?, X! C2 e3 B   Win32_SystemSlot0 R* q. ~; i8 I) h! L
  Win32_TapeDrive
/ u* I5 Z  Z6 R/ ]! f. z: S9 t   Win32_TemperatureProbe
2 m9 }& s2 s* q2 o  h% \   Win32_UninterruptiblePowerSupply( l! A$ x  M! r
  Win32_USBController8 g& g- D2 P- \! ]8 K6 m
  Win32_VideoConfiguration5 P/ ]6 P7 s6 m) n+ v# {
  Win32_VideoController6 P) _* |/ A  q' M$ W. A
  Win32_VoltageProbe
8 ^- L- j, J9 M. L' D' G3 e+ p# E2 f  y1 D7 d: ]; R4 ?: z
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-31 09:32 , Processed in 0.022526 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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