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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)4 j8 a& z* }8 K. e& S# v- t
% `2 L4 u9 }4 X- @! R2 x1 W

6 a. @2 L6 N8 l3 j8 f0 |  U! c3 F8 P--------------------------------------------------------------------------------* {& K6 z* |2 r9 v, y5 O
WMI: Windows Management Instrumentation (Windows 管理工具)  S1 Y6 a" z1 B+ a* v1 H- [- R5 |
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 9 n% J0 S8 v: ~, U. @0 r# l
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。# f6 \& b$ ~) O% Y' Y2 r5 b8 _3 `
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 3 s$ k" t: V, o3 D# H5 v$ f. S
" B5 I4 X/ P" r* f
--------------------------------------------------------------------------------
0 Y- e3 |6 ?6 _BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
, p' Z* `( t( o. h
1 D6 y: i8 ^) K/ _& C0 `--------------------------------------------------------------------------------
# P. q6 L, M5 z, \' X+ y( Y4 D3 j① 初始化 COM 接口:
; W5 z& o' T9 N5 {   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。% x, I& r2 z/ i8 Q  {
  这两个函数在 #include <comdef.h> 里面定义。) o1 }' S- A( ?, r; V/ Z& d
  F9 ]2 \1 A. H8 L
② 获取访问 WMI 权限:# I  K8 q6 I. g9 k- ~: a; a
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
% s4 f$ [+ ?: i2 W! ~/ U! {9 Z   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
8 S) z# l2 I5 F. m! r" J+ C" F$ J4 r% o+ h) w( I! \& K* p) t4 d
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
  H' C3 F  |  W& x   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。/ q$ t' b* _% Y! L* o

) K4 _9 _. m2 Z4 p  ivoid GetWmiInfo(TStrings *lpList, WideString wsClass)
5 C; k/ z4 O: E% B% B{) e' _( q1 X' Y$ {/ r% a
  IWbemLocator *pWbemLocator = NULL;1 t  h8 w4 z) L5 h: t+ ]
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
: H# M! ?% M" x, r! i7 w1 T9 h; Y& B   {
6 W) L3 @+ F$ C& j  @3 Q     IWbemServices *pWbemServices = NULL;
$ r6 S7 w/ i% P: }. ~# z     WideString wsNamespace = (L"root\\cimv2");
4 o& o6 p3 r0 E( u! p     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)& `3 G. U  u5 |3 ]. N1 N9 @
     {4 V  o% c; {' l  L' j  Q; J2 n
       IEnumWbemClassObject *pEnumClassObject = NULL;
% b, K0 k1 V/ X7 Z- V        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
) A6 _+ [9 ?8 H  s! h" i( ?        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)& o5 n( T' O' w4 v0 j
        {7 c6 Y& Y9 Z( U% m& |
          IWbemClassObject *pClassObject = NULL;+ t( K! y, q; J: S: Z2 y# @  y  J
          ULONG uCount = 1, uReturned;
9 E* L# Y5 ^& }2 ~6 }           if(pEnumClassObject->Reset() == S_OK)5 y& O5 u. H) l$ N% ^( q
           {4 O; M4 r% `! V' y; Z& F  {* r+ j
             int iEnumIdx = 0;4 s- U- G6 P  P9 Z$ `9 u) t9 }
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)7 [5 e3 n9 Y8 O+ T, ~
              {$ ^0 Q4 [6 L+ i+ o, r3 M' L
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");0 O/ V' c/ {& n0 z/ I) `2 b

' ^/ A5 l$ r7 g2 I. f$ F                 SAFEARRAY *pvNames = NULL;2 K2 Z* B7 ]) }" n& C" c
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
4 H2 c/ ^- p. l) ?. q                  {
* n# _. y8 o. R. q" ^% p! H5 t. v                    long vbl, vbu;
# ~$ v9 @7 w# Q3 t2 W                    SafeArrayGetLBound(pvNames, 1, &vbl);9 e+ A, ]3 {0 N" m6 V+ c
                   SafeArrayGetUBound(pvNames, 1, &vbu);
1 U3 G7 k* B& N6 ^6 r  n' h- E                    for(long idx=vbl; idx<=vbu; idx++)- |5 J2 ^6 c9 C0 C# P1 p& M
                    {
. `. P( F( I  a* V- d, R                       long aidx = idx;( p3 F9 [9 P7 V8 s
                      wchar_t *wsName = 0;: [5 T7 Z+ h5 V' N: P
                      VARIANT vValue;! Z) M$ f+ a% X0 \# ~# h) W
                      VariantInit(&vValue);
; D4 s$ M0 K: ?; F) u2 b                       SafeArrayGetElement(pvNames, &aidx, &wsName);
% y2 v, S7 c6 k; F: u, C7 g3 m3 o
                      BSTR bs = SysAllocString(wsName);
2 {& L7 R: _& L( T6 j- n                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);) K8 y* p8 R( z( `3 }  C
                      SysFreeString(bs);2 N& i: c% F8 e" a5 S" U
. j6 z/ j1 @) _) G$ l
                      if(hRes == S_OK)
; \  p- p; S6 Z( F( J" t                        {( s  N5 w( k: P1 U% Z
                         AnsiString s;, ]6 `) j5 i  w0 m  e+ N$ I% V2 i
                         Variant v = *(Variant*)&vValue;
3 ~1 |3 A+ Q4 l                          if(v.IsArray())
8 H# B+ C& W( t                           {
8 g7 w5 H% t5 ]) b6 p/ Q                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
) W# j0 A; [6 [                              {3 j* N' X4 o6 s0 Z' c2 M; Z
                               Variant a = v.GetElement(i);0 L' b, ?! ^8 C, h8 W
                               if(!s.IsEmpty())
/ z' c, p$ a9 H& D) D" w- C5 S" R                                  s+=", ";, G8 E4 z9 C$ N  q& j
                               s+=VarToStr(a);
2 t+ z( G9 n6 D( }! F. B$ S( {                              }" V! _* a9 x* Y( r5 f
                          }
7 X/ A. Y0 M! M# J; f2 _$ z+ Q                          else
* s* d# }2 l1 q5 U/ A& ~                           {
8 ^/ \$ N4 D4 D) S' p8 k                             s = VarToStr(v);. i+ E8 T' d" c' y! |' V
                          }
: a6 I  j+ v" Z                          lpList->Add(AnsiString(wsName)+"="+s);7 m  }! O9 F5 C; g
                       }: R! Z: n* e. n: h4 j) B

  G& v6 q! a1 H                       VariantClear(&vValue);# u7 y3 [! |: b) t
                      SysFreeString(wsName);
4 u% ^3 t* Q( i2 k1 \( p# z1 B                     }
& {3 r6 g- y! D+ }                  }
) d1 @2 R8 n: Z0 |- k! `                 if(pvNames)SafeArrayDestroy(pvNames);3 ?% n2 I- T7 v4 {) o- D
                iEnumIdx++;! l7 s0 l) N9 z' q2 x
              }% K( U6 c4 h) Z; v
           }# B4 A) \2 H: R, m. p; i
          if(pClassObject)pClassObject->Release();
. T7 n+ _3 Z; a2 r% [         }
9 Y/ @# E# {* T, F6 Z        if(pEnumClassObject)pEnumClassObject->Release();
: l$ W4 ~3 I, g      }; g0 \) ~6 R# O4 x2 s# {6 E7 ~
    if(pWbemServices)pWbemServices->Release();8 M8 Z% [) T0 k4 G- b
  }
, z$ g1 ^) q, [) m4 s4 N/ M  if(pWbemLocator)pWbemLocator->Release();* R6 H1 Z+ V) I. s1 Y2 M
}
5 o  X+ b( f; M" q  ^//---------------------------------------------------------------------------
' a4 r: ^4 c6 a* Q4 Q( B
: q1 v' R8 x% x2 f8 p// 通过 WIN32_bios 获取 BIOS 信息:- J  V& Y3 p2 O: ?3 X
void __fastcall TForm1::Button1Click(TObject *Sender)
5 ?  q: O) u* Q) v{$ Y+ K8 j0 b, C: \2 M
   Memo1->Lines->Add("================== [WIN32_bios] =================");- L$ y/ [# t  l: `. ^
   GetWmiInfo(Memo1->Lines, "WIN32_bios");# N1 T# d+ [( a7 B" H
   Memo1->Lines->Add("");5 D4 I1 V& [4 `6 T6 }9 ]" X
}" R5 I+ T1 r; l

" B) i2 o, W5 ~3 l1 V& w--------------------------------------------------------------------------------
# w% _' T4 e  \: X: A; j: H- i6 F( M# s# T/ L% ^
WMI 可以访问的信息类型有:6 P; C' z$ c2 v( r& t
  Win32_1394Controller
7 L" N0 A" f8 S# l( V   Win32_BaseBoard! G3 y+ V$ t3 u* I: e4 H
  Win32_Battery
  u- L6 r* c% C& Z6 G  ~   Win32_BIOS! ?5 d) p4 t5 A' p1 K1 Q/ C: l" D
  Win32_Bus* J# H# n% J( ^3 O! ~6 \
  Win32_CacheMemory
$ e4 T" n1 i: ^3 |* @' F   Win32_CDROMDrive6 ^6 j6 Q0 ^! H0 K, o
  Win32_CurrentProbe' j3 y( d! `# M/ v3 H* T
  Win32_DesktopMonitor  I/ j8 C" S$ G' ~
  Win32_DeviceMemoryAddress
+ ?( W/ x4 ?. v4 B4 r$ {   Win32_DiskDrive* j9 M0 z) ^* K$ i- X9 a
  Win32_DisplayConfiguration
. @) H5 ~  F/ o% P) x   Win32_DisplayControllerConfiguration
! G7 e" W3 E5 R: k$ O   Win32_DMAChannel
: C9 x  y, i, s1 Q2 W   Win32_Fan
, R. i. M( s  r2 a   Win32_FloppyController* m+ `! I# Y; U# U1 l. A
  Win32_FloppyDrive& D; b* a* x* d4 K' o
  Win32_HeatPipe3 |* {0 J" I. l
  Win32_IDEController5 Y2 _* Z+ M% U$ }  i  ]. X5 c1 j
  Win32_InfraredDevice
4 h3 n. Y( T9 T2 M& g( {( V   Win32_IRQResource
& X+ w# z7 I8 j: `   Win32_Keyboard0 N" X' ?4 e8 ?! z6 P
  Win32_MemoryArray
" E/ J+ {( N; \9 Y% F0 X6 H   Win32_MemoryDevice" m) P; |5 S0 D$ s; n. x
  Win32_MotherboardDevice2 ^' ^5 b: p7 P2 Y
  Win32_NetworkAdapter
' b& ]$ f% l& a7 ^   Win32_NetworkAdapterConfiguration
) l* `. l( S6 h% G: d   Win32_OnBoardDevice6 c  ]+ _$ N2 ^% C: f4 t
  Win32_ParallelPort
  ~+ k, g' Q6 ]' t, j) j   Win32_PCMCIAController% ]6 ~, L" n1 A- F
  Win32_PhysicalMemory9 |- X; y; _5 e/ ~2 D. l* ?7 Z$ s1 E
  Win32_PhysicalMemoryArray
# N- J, m( M( ?/ a5 L5 {1 ~6 U% E   Win32_PnPEntity2 w. _2 c1 l+ I- Y3 U
  Win32_PointingDevice/ x9 L" L, F3 L. S6 z1 W
  Win32_PortableBattery
7 W% V1 U  o8 h5 D9 E   Win32_PortConnector* B9 B! b" Z; z
  Win32_PortResource5 X4 I) ?. a0 [2 S' [! C
  Win32_POTSModem( ~9 p# D1 H* T4 a( U
  Win32_PowerManagementEvent9 H$ s( e1 P& F. O
  Win32_Printer
* }6 B8 R" j5 W# D5 a% W   Win32_PrinterConfiguration2 c% j" w) H, X5 ?
  Win32_PrintJob7 D( F$ d) \" V( Z" N
  Win32_Processor! W3 p. [2 \3 T
  Win32_Refrigeration5 \( M, z& G' H+ f# U
  Win32_SerialPort
* a  n9 O' I; l" j1 ^+ M' _3 Y   Win32_SerialPortConfiguration6 N+ T7 D- v( s; S& T2 r+ R
  Win32_SMBIOSMemory
$ R" i  [7 |- D" h( f6 P   Win32_SoundDevice
2 t  _5 ]7 |8 D& q5 r5 f! Q# k   Win32_SystemEnclosure
" ^0 W7 M, i8 M6 v' a   Win32_SystemMemoryResource
9 m5 }! W3 M  [+ `& p   Win32_SystemSlot& L" S  B7 z- b8 D
  Win32_TapeDrive1 I" O/ D+ y% ]/ O/ y
  Win32_TemperatureProbe
2 j; R" `( q7 l$ _   Win32_UninterruptiblePowerSupply' D: e/ p) B' l! y
  Win32_USBController
- Z" X. y. Y2 |4 L5 L   Win32_VideoConfiguration% g* z$ [. f3 d: ?+ C+ Z
  Win32_VideoController
: I& d: m. T6 |" F# S$ U   Win32_VoltageProbe# E, g$ N3 v& E+ N, E
3 ~! Y* ?+ r+ n5 h2 h# o
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 21:31 , Processed in 0.018345 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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