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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
8 }1 a6 T5 f, J, F
- R& K! q6 X) C+ B! j. J  `! b8 N, A7 n2 ]! I# l; h
--------------------------------------------------------------------------------4 V" W- g0 B& c. K& J+ I, J3 g
WMI: Windows Management Instrumentation (Windows 管理工具)
% |9 ?$ ~" s( K8 X) K$ e   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 8 o) `( V4 P6 N/ m, a- |
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。' j! W; w$ G: n9 d. ?0 ^
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
" P- `& v7 ~6 f& V+ Y% r/ N
, x4 n2 V3 |$ g# t7 k--------------------------------------------------------------------------------3 ^6 p7 \, ]6 z2 V
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面5 W- L/ M. C* o+ f
% K* p4 l7 T9 k8 i
--------------------------------------------------------------------------------6 s5 b2 d! [7 e2 C7 K* _
① 初始化 COM 接口:
9 Y4 r. M  U9 }   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
6 G* O' z/ Q* t+ ~' k! {9 b   这两个函数在 #include <comdef.h> 里面定义。/ a# q: |  t9 ^: n6 K
$ F5 d, _1 V* \7 S/ f
② 获取访问 WMI 权限:
2 {/ H; v: V/ l8 ~9 F5 ^( t   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);- L' g) C! U+ ^/ h4 b& Q
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。- i3 s" ]3 ], |; p
  h5 q& f( c+ O" J+ s6 E
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:, ]2 ^+ R/ P5 V1 M  b
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
$ b7 h5 B" I9 R; T4 N" |/ Y
0 [& T. N2 W* D. Z+ v/ l' f8 Svoid GetWmiInfo(TStrings *lpList, WideString wsClass)
: F* ]0 b4 S  l( {. z{
) ?+ n2 A" f! x: A' {  IWbemLocator *pWbemLocator = NULL;  k% P, V* U9 W! e- n
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
* K6 A+ {3 k5 a* t/ E: P   {: c! s% W- w! O+ U
    IWbemServices *pWbemServices = NULL;7 g/ T2 |7 }6 h5 q
    WideString wsNamespace = (L"root\\cimv2");* c; m# m7 I( w" f/ J+ v/ w
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK): E( m. V' X6 G5 m! j/ t( u
     {
* q/ ?; u  a6 @& w+ s$ X5 Q        IEnumWbemClassObject *pEnumClassObject = NULL;; t5 M+ m4 u2 @) m. \8 e8 |
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
) L8 Q) f# `5 r7 b1 U' O4 f        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
. @/ C0 f0 I8 y3 N- z" r  f2 H         {. g) a& \  K9 t' J% ^
          IWbemClassObject *pClassObject = NULL;5 p0 [, t4 X# w' i7 u
          ULONG uCount = 1, uReturned;0 J) _0 I# K7 c/ S/ _# @
          if(pEnumClassObject->Reset() == S_OK)
8 z4 c/ A2 U7 B7 r            {+ N" y! }. X) x3 N$ J
             int iEnumIdx = 0;' H7 e4 _1 W- }5 p4 A
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
  V: e$ L  \; N               {
5 `& Q  ~1 {6 e& Y1 j9 F+ @                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");6 k9 R  }0 y; c4 I; D* G+ G
! k% X. F- v! R! D4 r
                SAFEARRAY *pvNames = NULL;
, W; [8 }4 ~2 X. ?4 H                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
6 n6 ]* Y0 k& ^% w                  {
+ k9 d  |( P" u' _" Q: D6 J                    long vbl, vbu;
# u1 u% z8 R9 e1 L, q                    SafeArrayGetLBound(pvNames, 1, &vbl);
7 |8 F, ^: ?% n3 R                    SafeArrayGetUBound(pvNames, 1, &vbu);
0 k7 b6 W1 [4 s. a! u' J5 Q                    for(long idx=vbl; idx<=vbu; idx++)
. H* J, O7 c* ~+ L                     {6 P% F; p4 V: v6 C* Z
                      long aidx = idx;
, D2 q- ?" ^4 J                       wchar_t *wsName = 0;) W3 A; O5 Y) }/ F8 g
                      VARIANT vValue;2 i4 A* u4 I& i( s9 p3 s! |
                      VariantInit(&vValue);
/ R7 H% {% B. B2 w! A                       SafeArrayGetElement(pvNames, &aidx, &wsName);, s6 z$ O  E) v

1 u. w  q, C9 l/ i; ^0 o                       BSTR bs = SysAllocString(wsName);
) C+ S) F6 n0 h4 O                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);. V( F+ j" @8 W% i
                      SysFreeString(bs);
0 |7 x3 g$ S# d1 z9 b
' x' \8 w" \7 x. v% n5 Y                       if(hRes == S_OK)* S% c7 C: l+ r% o, ~
                       {
, x# Y% q' Q+ Y& m                          AnsiString s;
9 \4 p' g9 H* I1 @& f7 }1 I                          Variant v = *(Variant*)&vValue;8 V; h) G1 I5 O% q. p9 E) w3 [. x
                         if(v.IsArray())
  N4 k8 D& W" A4 p9 [" V                           {8 {* {+ _- C/ \$ _: f. o: `
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
- o/ [8 `' S4 h0 `- c                              {
$ T) a7 [; G# B: N, q% u2 _& ?0 F                                Variant a = v.GetElement(i);
# ~' C8 ?, ]- X0 ?" S% z6 [                                if(!s.IsEmpty())5 X+ N5 a; o7 F* a8 _$ L
                                 s+=", ";! T) h3 [( \* h3 H: O# d3 M; d
                               s+=VarToStr(a);5 |9 j; H& R5 J2 E
                             }
9 w9 Y2 y. J( P6 V                           }
5 ^( m7 s" {. N                          else! f3 e1 |1 l- }! e* w  r
                          {
; x  W3 q7 z2 @+ s                             s = VarToStr(v);
, P$ m  @2 U+ o! [( I( ^                           }% y# P+ t$ G9 }3 o6 A
                         lpList->Add(AnsiString(wsName)+"="+s);' H: v8 m7 p! `8 o% `! e; T  i6 a
                       }
$ _0 r! U) O* |) t1 p2 ?2 y6 o: a/ C. D2 z  o+ x4 R
                      VariantClear(&vValue);3 R) `) l/ p. F& b9 T8 j3 q. S4 w
                      SysFreeString(wsName);
" |2 Y' k. N3 G                     }
; u! A. P9 }& m* E. G6 \  w                  }9 o. f5 Q- M: K0 |
                if(pvNames)SafeArrayDestroy(pvNames);
4 s+ V7 i, E  F& x$ `6 @9 x                 iEnumIdx++;
) m6 N  V! s9 m4 `! F) S               }( k2 R* x* _1 a; D3 n3 U
           }
6 h6 [0 b5 a9 K8 c           if(pClassObject)pClassObject->Release();( F  t" |& N0 _) W$ k
        }
3 U- ^/ W$ s) E        if(pEnumClassObject)pEnumClassObject->Release();" I- R* _; A! R
     }
6 w! z4 d0 ?% L4 D     if(pWbemServices)pWbemServices->Release();
+ h" M' q& t- P   }0 @0 Q5 F9 ?+ t
  if(pWbemLocator)pWbemLocator->Release();
) r* q' n2 [9 P5 h}7 A# n0 u% k3 h1 T
//---------------------------------------------------------------------------) s1 Q. L! D/ A4 S$ t

0 F7 W9 P* r' Y2 l/ |& y: e// 通过 WIN32_bios 获取 BIOS 信息:
; i: A6 _" t) R- v! Dvoid __fastcall TForm1::Button1Click(TObject *Sender)
9 I3 Q2 P/ [) r" R  B{
+ e" P! j- [% M: Q2 D3 n    Memo1->Lines->Add("================== [WIN32_bios] =================");
, B' m7 I, a" Q% i, v* N    GetWmiInfo(Memo1->Lines, "WIN32_bios");
& i9 B  a) a3 I% W2 J/ j    Memo1->Lines->Add("");7 E  X0 W' J1 o
}
" X3 m) S& K  s: c
# l2 w9 E3 O2 P- D--------------------------------------------------------------------------------
& L7 d* h( m* C" A1 [* e: m
+ q& z% n# e) O. P$ C: xWMI 可以访问的信息类型有:
% Z5 A6 L" \& s3 `   Win32_1394Controller
4 e: e8 B7 c9 P- I# j9 c   Win32_BaseBoard
7 p1 p- c; m' j' a; Q5 ~9 x   Win32_Battery
+ Y1 P, s9 m" B5 V9 O   Win32_BIOS" @5 _: ]' ]+ W
  Win32_Bus
3 p+ |+ t. F* D% h; c   Win32_CacheMemory
8 U; q2 h+ N7 Q, x& c( p: X( P% k& Y   Win32_CDROMDrive( i4 ^; R! ]. C; s' y% {! x  ]
  Win32_CurrentProbe
0 o% Z% _+ }% ?3 T   Win32_DesktopMonitor
" z& a/ I1 p$ K: `/ e0 _   Win32_DeviceMemoryAddress; h. x2 M( `: t3 \6 c5 G! G# L
  Win32_DiskDrive! H; ^1 R; ~- r' V- t& q! b# X- [; m
  Win32_DisplayConfiguration
1 T* a7 a/ r8 C; w1 ~   Win32_DisplayControllerConfiguration
/ u! j. }5 _* ~7 o   Win32_DMAChannel1 R  ?% j: T' x& N5 Z6 T+ n" m  y
  Win32_Fan
5 x4 y0 V$ ]# q5 B0 f5 K   Win32_FloppyController' P9 ~4 m5 V2 X" ^& T& X, ?
  Win32_FloppyDrive
, i1 Q0 a5 z  [   Win32_HeatPipe: k' g$ B; l) t9 H* B$ ?
  Win32_IDEController' u- e* F- n2 {7 y4 f! N
  Win32_InfraredDevice
, b7 J6 U! M  @% X( ~7 }0 G7 _   Win32_IRQResource. `+ a8 U: B+ I- I( g5 V2 @- t
  Win32_Keyboard  z2 \) E7 z1 f5 n! r- N! y
  Win32_MemoryArray. U' [1 ?1 t0 N0 _& x
  Win32_MemoryDevice
  m6 r3 }4 P5 g; E   Win32_MotherboardDevice6 s" S  q) G; p3 B, s5 o. [
  Win32_NetworkAdapter2 E+ X9 n+ t: G) P/ W# x
  Win32_NetworkAdapterConfiguration
9 q( e6 l0 H+ Q  f+ a   Win32_OnBoardDevice
( X2 K: L, b5 |% D( i! D   Win32_ParallelPort
9 i* J% w$ |& E$ l4 U   Win32_PCMCIAController
# P: k$ k4 k; R   Win32_PhysicalMemory
  P+ N) J' \  w/ w  r% p   Win32_PhysicalMemoryArray. z6 E3 I8 ~- C) F& N3 z% K
  Win32_PnPEntity. Y, x7 D6 W; t" p& w
  Win32_PointingDevice( s$ w& X* V: Z7 k
  Win32_PortableBattery
$ h, h, G+ \( n1 C4 W! f2 r% a   Win32_PortConnector
( j% _! u, ^) c" m, [   Win32_PortResource# g; I, B: H! u7 I) U; B! _& [
  Win32_POTSModem0 n4 P2 W" ?/ @( z. l' l) p! \
  Win32_PowerManagementEvent& N+ {$ {- G4 M/ s; B
  Win32_Printer& U+ c4 S% H( ?
  Win32_PrinterConfiguration
5 F$ V: X0 v- E5 }   Win32_PrintJob" \  o8 M2 I% V1 Z
  Win32_Processor
0 U7 ^' H- M1 ^- S! y   Win32_Refrigeration* M4 s, B. M! m  a- V
  Win32_SerialPort
( [- a+ D! c/ w   Win32_SerialPortConfiguration/ p+ g- c7 }6 z0 J& G: i, ?
  Win32_SMBIOSMemory
+ d0 I+ ^5 O- o8 y5 y0 _   Win32_SoundDevice1 ~4 z5 n- K" G, H/ ]
  Win32_SystemEnclosure& T/ Y" |' c- v9 |7 y% W3 u
  Win32_SystemMemoryResource- N3 o& X: S$ @( w  V
  Win32_SystemSlot! j# l7 s* C8 P# I1 L  R  Y5 x
  Win32_TapeDrive+ M8 Q, [& q# x5 m
  Win32_TemperatureProbe
1 d& r9 }' l" |* h2 f   Win32_UninterruptiblePowerSupply
7 g+ @' N5 t; \# |% c   Win32_USBController0 @0 r8 G7 G- e/ A; x( Z
  Win32_VideoConfiguration
; e4 w. N7 r, w" H% |' Z   Win32_VideoController8 v# c  R& Y8 u$ q' X: ^
  Win32_VoltageProbe! k0 p( D; n$ g& y8 T

7 t4 a6 G9 y6 U% o- n以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-25 22:08 , Processed in 0.019900 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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