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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)6 ?% O) A: Y$ h, ]5 Z7 z/ u

+ {! [0 m) V- O6 v0 d: L6 x0 A# [0 G  y; h2 l2 L! Z0 s
--------------------------------------------------------------------------------
. `6 e2 J! G0 d# U4 P# OWMI: Windows Management Instrumentation (Windows 管理工具)- I# N6 `4 ]! p, z
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。   R$ P3 t7 V7 q7 l5 Q9 {# i& j) s
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
/ i* B( v; T* d, `( D  G6 S   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
7 B# O0 U- J7 B! f" A1 {0 b& |+ E- {! J
--------------------------------------------------------------------------------+ s6 A4 x; f4 T; ]( t; o* v
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面; }/ u/ M9 x7 W" n, `7 R; u1 U

  y5 ~+ |$ r2 Y) V--------------------------------------------------------------------------------
* d* D6 K& d: ?, T1 }① 初始化 COM 接口:: j# j3 }9 ^  i. @  _$ s
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
; \& z! L/ x1 O% E+ \5 O  z   这两个函数在 #include <comdef.h> 里面定义。9 l) b( N  q' O  g; E7 N; p
9 w4 k: h* b4 s4 u8 q$ H
② 获取访问 WMI 权限:- t2 X( o( Z& C' i: _% d
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
9 U9 x' e# U! N+ z8 o- b+ s! w   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
8 w5 I% d" h, s2 e* H8 H9 P2 i( \0 X4 @+ G6 I& s, [2 O- `" @' Y
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:* T6 i2 \6 T8 x& b
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。/ ~- C# D; m6 s3 E% j
# K- {4 O# a6 ?, z1 R
void GetWmiInfo(TStrings *lpList, WideString wsClass)
+ f" c9 d: F4 q  A3 Y{  r' s" u; [- F7 `0 j0 i- W( s' u
  IWbemLocator *pWbemLocator = NULL;- Q6 n3 y  v% M5 z9 R8 y+ |8 b
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
. m7 R: V+ P( B; q6 W! ^   {% ]9 m9 `5 q6 @  b/ n
    IWbemServices *pWbemServices = NULL;, _3 l4 k& N4 p3 \: V
    WideString wsNamespace = (L"root\\cimv2");
9 p/ f: R6 n6 ~7 M, A; G$ i     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)" f4 R% W, V" `1 R. B; q
     {
1 |' e3 A4 k6 \7 r        IEnumWbemClassObject *pEnumClassObject = NULL;
  w* H4 N5 H( s: B1 B) Z6 w        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
7 ^+ a' `# y& [$ H        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
" r9 \8 m2 ]" \% I. o% [' S7 ?# C2 e         {
/ I* ]) v: F3 V3 H           IWbemClassObject *pClassObject = NULL;
1 j4 M) Q9 t- d. b           ULONG uCount = 1, uReturned;6 e0 q6 X6 c+ N% |4 Y* ^, T
          if(pEnumClassObject->Reset() == S_OK)
$ W7 G, A+ j: o- W4 ^/ N            {8 [7 q' d" c' t5 m/ @% f) f
             int iEnumIdx = 0;
$ T$ L, C; d' R% }6 [* }+ o- O* s, m              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)! k! ?* I: M5 {1 ]$ P: g
              {
$ c' Y8 {; a1 e6 A4 i( Z                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
5 z2 o* z* {8 }7 w2 k% Y
2 V& a9 U: z* h4 w- ]                 SAFEARRAY *pvNames = NULL;
! T6 P8 j1 X2 W  W$ ^' M                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
# G# j. f3 X- x' E4 }$ {                  {: M' D7 n3 I$ A4 u
                   long vbl, vbu;
" W$ s; r9 y* h' x                    SafeArrayGetLBound(pvNames, 1, &vbl);
1 X0 q) Y" ~1 [* l6 o                    SafeArrayGetUBound(pvNames, 1, &vbu);
) ]3 e8 _1 L- M) a+ O3 J                    for(long idx=vbl; idx<=vbu; idx++): F; o# w+ i. R7 n! ?" ^1 M2 q
                    {
3 `+ e) X) v6 _& S8 e                       long aidx = idx;- H+ L# f# ?" t7 G
                      wchar_t *wsName = 0;
' y$ N. j+ A0 R1 a& y- y: O- M; X                       VARIANT vValue;
3 o5 j" b! B# V( D* V. v                       VariantInit(&vValue);; ~( J. u, i+ Z3 l2 A
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
$ S3 I% }7 Z# _+ k# |4 c$ k
8 \3 @3 D; S4 H                       BSTR bs = SysAllocString(wsName);
  m3 b% |" R- @# p                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
; o( G+ l7 s! s                       SysFreeString(bs);+ L7 T. L# j; a) U: ~7 f
4 I) l& R( v; r. N
                      if(hRes == S_OK)
. W& s) W. n3 B5 }                        {3 y% l- ^9 R" l* G) s# O
                         AnsiString s;+ B0 P" q5 n; i: T) f: n
                         Variant v = *(Variant*)&vValue;6 F6 `4 T- R$ `) m" u* }3 R
                         if(v.IsArray())
3 J4 O/ }+ F: V$ i0 y* m                           {$ E% {% i0 S9 Q
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++): [' h# M3 u1 p8 V
                             {! L8 @7 k/ n1 z  V2 S4 P7 Y- w
                               Variant a = v.GetElement(i);; I+ p. q4 r. f: n, S
                               if(!s.IsEmpty())
; X7 }- m; p5 q6 r  ]                                  s+=", ";
+ \- `% E$ V$ D( E                                s+=VarToStr(a);
) |- h* u( P* Q; @( L                              }
; \1 @- l( S$ F, d) B8 U                           }
, a( N8 Z  ]+ ^2 `' V! t+ ]4 {7 D                          else7 i0 E$ _) l) {' E4 R3 J
                          {* x4 d$ C$ W, P0 {
                            s = VarToStr(v);: T; D8 y3 e+ }
                          }$ u% }, o: I; w
                         lpList->Add(AnsiString(wsName)+"="+s);
1 \# _. D: F( J8 G6 w                        }
1 U8 V/ d* [' b, d2 y4 [5 Y: w" h$ o* }% {# c, H6 m; b4 }
                      VariantClear(&vValue);  ?/ E9 k  E# j# N4 M( E1 q4 U# e' n
                      SysFreeString(wsName);+ h( u" M! A" Q, h
                    }1 |: \+ Y: s) K" r- Y, I
                 }
! l# S+ _: b& r  t/ m5 M4 z  ^                 if(pvNames)SafeArrayDestroy(pvNames);$ W1 U4 s! j" q) }( G
                iEnumIdx++;
5 ?& j6 N9 r7 \+ m1 O# D               }3 N+ v/ P5 S' e0 Z5 F1 K
           }
' Q% R- t1 l( Q- f2 ~( J           if(pClassObject)pClassObject->Release();0 X* R( k& k# `* E  U7 r8 `
        }
3 D6 p( A7 U0 Y8 G        if(pEnumClassObject)pEnumClassObject->Release();
) T4 A" [7 B8 m( J! U) ~      }
! a. `/ b4 [( V  I     if(pWbemServices)pWbemServices->Release();1 R! k' W4 T- m' p/ {: L, D: F
  }
+ Q( i, |9 ?. p5 G0 c/ {* S7 O  if(pWbemLocator)pWbemLocator->Release();
' s; h; z4 H0 e$ W}: s, t* b  j/ q1 n% ^' f
//---------------------------------------------------------------------------
9 j' R+ ?5 G, Z4 H3 @; s; K
' N  o% z' f( Q1 o9 z2 @' m6 J// 通过 WIN32_bios 获取 BIOS 信息:; S$ ?7 Q2 e$ y
void __fastcall TForm1::Button1Click(TObject *Sender)
# _( q; z* R- z; t, G{
; j2 X7 b% v1 [0 |3 L. E6 _% _0 D    Memo1->Lines->Add("================== [WIN32_bios] =================");
1 y! C: v: p% _$ v    GetWmiInfo(Memo1->Lines, "WIN32_bios");" U9 o! R; k6 u6 ^* d) i7 Y
   Memo1->Lines->Add("");
- b5 y* z3 d% ~! X* p- a}6 G0 B' {% x0 h( k2 W* O
; ]  ]% V2 N- g, O% f7 _
--------------------------------------------------------------------------------
  S; t& ?) |" Y8 v7 v) W# P  y' j& n! p. U
WMI 可以访问的信息类型有:2 y" u9 G- O9 l# l) v  p, {/ Y+ _
  Win32_1394Controller) u% l* g2 [- m7 p+ P
  Win32_BaseBoard7 ^0 U/ \0 S  _3 G# p  z. F* h
  Win32_Battery% o& A& M3 @; s
  Win32_BIOS
: l6 F7 K/ P4 a   Win32_Bus
- {6 ~$ R* j1 B   Win32_CacheMemory( ?/ m8 R( M0 z
  Win32_CDROMDrive7 z5 i. ^5 p8 Q9 e/ [
  Win32_CurrentProbe& b5 U+ x, @  W1 r
  Win32_DesktopMonitor
* S( x  u+ Z: l* S4 V   Win32_DeviceMemoryAddress
) n6 _( P5 `) y. P1 T; z   Win32_DiskDrive! u7 G; q: t: m4 ~$ q, ^
  Win32_DisplayConfiguration% N- z  r" E5 Y( n- K
  Win32_DisplayControllerConfiguration) z2 v& G1 A' L5 C9 g  a, z" z
  Win32_DMAChannel
( ^0 F( F" H* M5 a9 Y! V   Win32_Fan
3 P1 f) I4 {4 B( @& k" j2 y( r, S$ [4 y   Win32_FloppyController
* P. C- T+ A: O4 ~* G0 D; R6 s   Win32_FloppyDrive* G! ^. X. ?0 B* l8 a, e) a7 y
  Win32_HeatPipe
% j; N9 @0 j; Q8 m5 V! ?   Win32_IDEController
  `' |1 Q# c. m3 \! A, ]   Win32_InfraredDevice0 L6 v# n5 ~8 y+ a. g' H, F
  Win32_IRQResource
4 d3 G3 l& c7 F5 d  {/ h   Win32_Keyboard
( Q# P3 q# q9 H) `5 A; g   Win32_MemoryArray
, K  M& }# l2 Y6 q   Win32_MemoryDevice
5 ~- M4 G3 L" `9 V   Win32_MotherboardDevice0 ~$ ]" z3 g9 a% ~
  Win32_NetworkAdapter
7 K* d  c% ^7 \; t/ b8 e7 E9 [   Win32_NetworkAdapterConfiguration- M7 W0 Q1 w6 I1 G* x
  Win32_OnBoardDevice) F/ [+ P2 [- A( O2 j( t
  Win32_ParallelPort
2 r8 J: [( N0 n& F% u   Win32_PCMCIAController9 j3 w4 A4 M: {/ N
  Win32_PhysicalMemory# R% W9 o: r  r6 ?, q
  Win32_PhysicalMemoryArray+ {! j0 d; V9 v& \' ?( Y/ P
  Win32_PnPEntity# U* F( s% s: d* F( v, G2 f
  Win32_PointingDevice: C" }; a; p, d
  Win32_PortableBattery
" C! y9 u; Q4 Z. b) s   Win32_PortConnector2 Z6 g& A. x9 D
  Win32_PortResource! B- o3 s/ X  H" U& E
  Win32_POTSModem
3 j" h" H9 Y. I/ ]9 }   Win32_PowerManagementEvent2 v& l& M# z" O$ `5 F
  Win32_Printer( i# |' d$ y, E8 Z- m. E
  Win32_PrinterConfiguration
* }, _  M( c; p$ n   Win32_PrintJob
; Q: ]/ v6 @; Q5 d, K. q   Win32_Processor
* j- ~7 \. l. \8 F9 h9 n   Win32_Refrigeration, ]# F2 [5 b5 O. X
  Win32_SerialPort# V, p' G: |' S, d' |5 N% p1 }; G
  Win32_SerialPortConfiguration
! A; W4 d+ S8 x3 ^. l$ Z   Win32_SMBIOSMemory8 l- q0 v, {; Z: Y, N2 A. c
  Win32_SoundDevice' r: n) ~! R  O; e  N" u- L$ J
  Win32_SystemEnclosure2 h$ X0 ?+ ?( o+ R5 Y  o; \+ s
  Win32_SystemMemoryResource& j9 [8 d* J& M
  Win32_SystemSlot
3 Q$ ?6 N: _; C9 T   Win32_TapeDrive" z" y, ~9 a  P6 g/ p2 V6 C
  Win32_TemperatureProbe' `# A* O% U7 `6 k* C- e0 N
  Win32_UninterruptiblePowerSupply
: t$ l* i, C( o6 z' C! t# l6 \( p: K   Win32_USBController% z9 t$ w" O7 l
  Win32_VideoConfiguration
" Z+ R/ t' @& _% T   Win32_VideoController
! L0 v( L' Z( H1 p   Win32_VoltageProbe
3 }9 S7 f3 Y" X0 q3 h( I) |- z
, Z2 q$ ~( O, p2 ~. k: Z( x以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-24 05:50 , Processed in 0.017949 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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