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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
8 }- e5 a9 l9 T; o7 o/ b* [; b9 X( H* V, g8 S, n

$ Q3 K: b8 |- T8 p. `3 C! |--------------------------------------------------------------------------------
3 E1 G0 @: p% wWMI: Windows Management Instrumentation (Windows 管理工具)  F- W; n! C' y* h3 F& }; b
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
* v: I9 m, T; I1 A; F6 v   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
& [( O7 C& Z# c1 N) ^* Y7 w   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
1 X+ s( E6 d: r4 E
4 o' \& Z# |* _% ?: q--------------------------------------------------------------------------------
% Z# x  R* M! {* W$ xBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面$ [+ O- S, T7 x: ]9 ^5 Q

8 h% V% W( z7 y4 d% M% h" w--------------------------------------------------------------------------------1 }1 F5 d5 t; `$ X* L% p7 F
① 初始化 COM 接口:
8 S+ ], `1 `6 V2 L+ D- `' R! b$ y   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
: Y+ \# u. L9 A) b& W5 t1 J3 H   这两个函数在 #include <comdef.h> 里面定义。, i( d; W9 j! y9 c0 @

  x. [/ h" v$ V! A5 _② 获取访问 WMI 权限:
7 ]! I+ i  L4 \+ H$ ^   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
  Y% V/ I  ^  Z& C6 m   如果这个函数返回 S_OK 获取权限成功, 否则为失败。2 ]1 c; j: Z* L- A- Q4 O" j, ]
  V( ~/ e; S1 g3 t1 \
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
/ [1 C' @4 F0 w% R( Q$ y" U, T' q, K   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。* j: {5 O$ P: _8 z* G

3 A' u# i/ A2 Vvoid GetWmiInfo(TStrings *lpList, WideString wsClass)3 c% \! Q/ ~$ }  E. G8 T, ]
{: x5 j2 t4 y" g7 X
  IWbemLocator *pWbemLocator = NULL;
3 |6 Q$ ]# I$ X. Y3 C2 Z  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)- f3 a; Q7 r  i8 h
  {9 G* Y7 H$ ?! ^  \5 I
    IWbemServices *pWbemServices = NULL;
8 _% s+ ^' D. n4 A* O* J     WideString wsNamespace = (L"root\\cimv2");' g% ?8 Q# T* E
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)) M2 v4 M) W; R- }1 a
     {7 h4 A! k0 ?) d: Z
       IEnumWbemClassObject *pEnumClassObject = NULL;) d; s9 ]( @; d8 s& x6 p
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;: M/ B  t/ e: R  s& V6 S$ I5 Q6 y9 ?
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
  v4 ]7 B+ N4 y0 h+ C/ o         {
5 l2 {+ W! G( N- u           IWbemClassObject *pClassObject = NULL;
5 p0 `8 y6 N* f5 D" r. |' f           ULONG uCount = 1, uReturned;
! Y' L" E$ y6 n# b- o( i) }5 B5 F           if(pEnumClassObject->Reset() == S_OK)
" y  K3 o( I) O2 A. t; E! }- h2 Z            {7 r/ Y# l( G) ~
             int iEnumIdx = 0;
6 G3 `( X3 N! F  R4 e              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)! Z9 ^2 J# h1 T
              {
" `# Y3 A" c3 D1 o6 G6 n+ i/ H; }                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
4 p8 \4 H) m( d6 c! y- ]! N  m7 e: |* m3 I' S7 b- Y' @3 f2 |% D/ z" ~5 ^
                SAFEARRAY *pvNames = NULL;
! p) \7 h$ h: |                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)( c$ Y& B0 Y- t  o
                 {- m+ P+ t9 t8 i* t
                   long vbl, vbu;$ o/ V; @7 D; |7 ]2 V( C
                   SafeArrayGetLBound(pvNames, 1, &vbl);$ B7 P1 e7 U# {; z
                   SafeArrayGetUBound(pvNames, 1, &vbu);
" @" w' y+ e4 c/ g. W& d/ W                    for(long idx=vbl; idx<=vbu; idx++)
# H5 L8 u9 E: [                     {$ x+ i+ @. u* }$ [
                      long aidx = idx;! ]; n9 A. B% |9 \' x6 i
                      wchar_t *wsName = 0;$ d1 B( c8 h* t: }2 v) {! A4 g. p
                      VARIANT vValue;8 p& I9 R$ y2 R- c
                      VariantInit(&vValue);
. @3 ^* b4 K# m; V( {- j                       SafeArrayGetElement(pvNames, &aidx, &wsName);
! x( f+ B$ Z$ Y( k! J3 N4 L$ |7 h; s2 r$ S! ~
                      BSTR bs = SysAllocString(wsName);
- N3 h; l  d- j6 b0 g: N9 _! m                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);8 y+ d8 Y4 _( D
                      SysFreeString(bs);; f0 z4 p$ ?; _7 }4 Y# J
" h/ u$ l) k# \4 b; V5 q; L
                      if(hRes == S_OK)1 n, [. J- i$ `# b& p+ V
                       {
* x2 A9 ^6 h4 k                          AnsiString s;
% [6 M% X# e( Q& G  V0 Z0 }                          Variant v = *(Variant*)&vValue;: f$ b' j8 Y% _( H
                         if(v.IsArray())$ h. C9 h* V, y0 v; o# S
                          {
; f  ]" P4 n- C                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
% _& V7 _: g  ]* P# I! A                              {
! [3 r1 \% T& w) W9 z1 z                                Variant a = v.GetElement(i);
- _7 j% ?# e$ r7 D* H# ]" p                                if(!s.IsEmpty())
) \* A2 G/ b9 `' m) q- ?                                  s+=", ";
( f/ ^: D" H  j+ w8 p                                s+=VarToStr(a);
# v- h/ d7 r: u1 F0 j                              }6 O% Y4 }( q( {0 f
                          }/ N2 E' p" l' ~2 c
                         else0 ~& V( E# ~/ [. S. Z- R; T
                          {
' ]" @4 L, q  X9 l! n                             s = VarToStr(v);6 I; E* {0 c! L- S! p
                          }  U9 K. ^5 Y9 F1 N9 k% Y& |) n
                         lpList->Add(AnsiString(wsName)+"="+s);
: o2 l& `% `1 I                        }3 |+ j/ e% v+ Z% H

% t7 G: ^( J* l6 R8 ^3 W6 g: ?4 p                       VariantClear(&vValue);! x: e  u7 N7 f1 A. |
                      SysFreeString(wsName);
8 Z& r4 S: x: ]# z6 |" F# x1 l                     }
  E# F7 M3 b, j' H% e8 w7 s+ U                  }$ T' }6 L. @" @
                if(pvNames)SafeArrayDestroy(pvNames);
* Z& ^; R& O2 a" v                 iEnumIdx++;
5 z+ e6 {2 w+ U7 I               }5 X8 y  |) |/ ?$ u' R
           }# T0 C3 T. c$ h
          if(pClassObject)pClassObject->Release();
% T8 p1 D0 L8 v( G( M" \         }
% X. ^2 V' @; v2 d8 A        if(pEnumClassObject)pEnumClassObject->Release();" f) P% I% b! c% k. i/ [( X7 ]1 [
     }. ~  R: d3 ?0 ]+ [. x3 E9 F
    if(pWbemServices)pWbemServices->Release();3 y4 V2 w) c1 r8 H* R
  }1 X. {' t, ]2 L2 ~& i
  if(pWbemLocator)pWbemLocator->Release();
* {* u8 l2 U; A8 V}
. I+ V' e0 D, L8 ]6 t2 y, ]//---------------------------------------------------------------------------, p, \) x! H) v$ b# J2 X3 \7 f, i

* q& \7 l* X/ f7 H// 通过 WIN32_bios 获取 BIOS 信息:
2 M+ e/ y7 {: [5 Q1 A. u. H1 svoid __fastcall TForm1::Button1Click(TObject *Sender)
+ i+ M# U( ?" n2 n! Q{
+ y$ R. j4 h3 i+ U7 G, L1 J    Memo1->Lines->Add("================== [WIN32_bios] =================");% i# c+ Y0 q1 `) |1 n, B
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
3 z" T% t, E/ _' h4 E    Memo1->Lines->Add("");
( c3 l! N/ `6 }0 D' s}
9 F$ i1 {+ ?& a% Y. q. M7 N  F* c
--------------------------------------------------------------------------------
7 j0 u% u: o/ O- \
' `, S: C9 K8 V6 f+ z6 e$ K1 XWMI 可以访问的信息类型有:/ I$ {  r, U) u! H2 A3 ]$ Q9 K3 t
  Win32_1394Controller& `1 }! D* `7 [7 B- `! i
  Win32_BaseBoard! ~8 [5 [( C8 q/ s+ O2 R1 b) c
  Win32_Battery
4 g! _! V5 b! r4 {' h8 J   Win32_BIOS
1 X) t- q/ s4 i- S) p0 v   Win32_Bus; k! R0 v6 Y. D. W/ M7 h% @' Y
  Win32_CacheMemory
# I7 g: L! l  C# I/ V0 B2 P4 ^   Win32_CDROMDrive
3 i. f- t7 X9 C7 ~. _) m* ^+ P   Win32_CurrentProbe
1 j5 b# d" n: a. R   Win32_DesktopMonitor4 N% {( X+ G  P9 m8 B
  Win32_DeviceMemoryAddress
* a) H9 ]4 o# k" j6 G5 {1 T   Win32_DiskDrive
: \  r3 |8 {# B1 Y   Win32_DisplayConfiguration2 o( M1 P+ V. L" B
  Win32_DisplayControllerConfiguration$ K& h: q. D) y) h
  Win32_DMAChannel' I$ ]6 L( @7 m% l1 _3 A
  Win32_Fan4 n# ^8 |3 P0 i
  Win32_FloppyController
/ D2 C* j0 B9 g; R) w   Win32_FloppyDrive7 [4 K+ i$ |. @/ A& U
  Win32_HeatPipe; `' k4 A% y& B4 ~3 B2 R& B
  Win32_IDEController
4 C# I0 v9 @# f% I' Y   Win32_InfraredDevice) a3 `. J  `" \0 u7 f
  Win32_IRQResource
! }  E+ H5 |, e% h  V   Win32_Keyboard
2 A% s5 j2 c# m' i6 ?* u8 W   Win32_MemoryArray3 W. D/ L6 Z% c8 u
  Win32_MemoryDevice
0 v  l! K& ]5 V/ b# X   Win32_MotherboardDevice
& O/ @0 ]1 b5 \  ^- C   Win32_NetworkAdapter
- L. @) o# B6 ?& p- m   Win32_NetworkAdapterConfiguration% X/ @% b- _( l' n/ r* s
  Win32_OnBoardDevice* Z& H7 u3 ]; I: F0 u* S: p
  Win32_ParallelPort  y1 O8 v) i+ M- G' U( \1 k8 A
  Win32_PCMCIAController# h+ s5 q' ]7 i7 T
  Win32_PhysicalMemory
) l6 E; h1 t6 k! C   Win32_PhysicalMemoryArray
& N8 U4 e$ `# p9 X0 w   Win32_PnPEntity
# w  d3 {, @: ^! ]5 f1 @7 o   Win32_PointingDevice1 f8 g8 f; {& U: _: I# J, o
  Win32_PortableBattery7 w4 ^0 p8 W2 D
  Win32_PortConnector
$ z2 o% g1 f  W& T9 l   Win32_PortResource
$ d& L! ~6 Y5 ]- z5 B: h   Win32_POTSModem' d7 b6 |( m+ i1 P, S
  Win32_PowerManagementEvent
: z% q) y% Z% p9 F4 Q   Win32_Printer
: f! c/ y* |0 t   Win32_PrinterConfiguration
3 h. t, r1 t% M1 H2 V   Win32_PrintJob
8 ]$ a) A  M/ b9 N% p4 F   Win32_Processor4 V) \+ o2 _& i5 w9 @# d6 M( b
  Win32_Refrigeration" o* u! r- @+ }
  Win32_SerialPort% }8 M* |' R$ k( I/ B2 g  Z- c8 }7 r
  Win32_SerialPortConfiguration( V0 B  Y" D: K* z6 l4 X
  Win32_SMBIOSMemory
% z2 X% R3 M: b: ]   Win32_SoundDevice' C$ G, N+ U" Q4 W! Q* M
  Win32_SystemEnclosure
2 P6 R: n1 ~4 t4 m   Win32_SystemMemoryResource' V1 B! e4 D4 O" N' X6 t1 e7 J
  Win32_SystemSlot
. D0 n# ?% ]3 `; m. p   Win32_TapeDrive1 l! S: s4 ~9 u; T
  Win32_TemperatureProbe
6 w: V( P( w2 i1 N$ i9 w   Win32_UninterruptiblePowerSupply" D5 K: R& O' q3 L
  Win32_USBController
8 j- F$ ]+ Z: D5 O0 C  v   Win32_VideoConfiguration
6 \4 U7 n& ^+ ]3 k( E7 m   Win32_VideoController/ c5 H  Q0 I+ L
  Win32_VoltageProbe! _9 u# K8 n0 C+ R+ H' L+ i; Z# G6 n
8 ]0 n& k7 ]0 c# f$ D: u0 l
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-9 13:21 , Processed in 0.035485 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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