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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)- ]  v+ K5 o8 y: a$ F8 ]
! W1 y. m4 z7 r- D* W
& Y3 ^2 C3 p8 W+ G' w
--------------------------------------------------------------------------------" W1 J/ N$ ~3 {) z
WMI: Windows Management Instrumentation (Windows 管理工具)- H7 b1 Z% R2 A/ P
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
( z4 ?* C' `- x( Z+ k# W% ^  }4 ^   利用这个工具可以管理本地或客户端系统中几乎所有的信息。- W7 C6 i- k# g- ?* n
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ' n$ S2 y% r  b  d7 z- f

4 f' I+ g6 J0 d' w& ~" t--------------------------------------------------------------------------------
5 t- u5 J" e! `( Q. A- z$ x" pBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面2 p9 h2 Q% y- S. ^) C2 ~

' q) G7 y1 D1 c$ W  h--------------------------------------------------------------------------------
) ?, I- `; S. S  Y9 P① 初始化 COM 接口:
! L! b. f2 N! l' s9 ^4 z! ]) H& F   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。/ w- B0 Z9 i' |/ k  E
  这两个函数在 #include <comdef.h> 里面定义。' f$ E% R1 n' @, r
" o9 O5 P. s- F1 S
② 获取访问 WMI 权限:( k( e; V5 V8 r, G0 c5 n1 m
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
6 X; j6 o0 y1 `. e- j   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
7 k3 D. @2 c8 o+ p- j) j+ {* r. i. n9 n; f' T. a4 @
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
6 P! V4 h6 n" A- i! P   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。; r6 _& ]# p- f* V3 Y. n
# I5 x5 H0 g5 q& Y- ]& G
void GetWmiInfo(TStrings *lpList, WideString wsClass)
* _# l/ w$ B/ ^7 `  k& l{6 J: `. d7 D" W- \! w' W$ {5 f
  IWbemLocator *pWbemLocator = NULL;% U8 x: p" Z* v, J! w) J
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)4 J( Q) R% M$ z
  {
$ Z, ]; D" f6 V" X     IWbemServices *pWbemServices = NULL;
6 S) l. k' A8 `! b4 ]     WideString wsNamespace = (L"root\\cimv2");
$ Q' V1 a% w9 i  t( o  x     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)% V/ d4 S/ w% s
     {% j, i6 B% N5 C
       IEnumWbemClassObject *pEnumClassObject = NULL;' u# B- \* m/ ?% |6 E" F- i1 ^
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;  w" w% Y, [* E, E" D
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)' V; I; S6 k* R! m$ q! u  ~( Y
        {
: C$ g) v+ H6 t/ a' P           IWbemClassObject *pClassObject = NULL;
) s0 T2 I/ p- R. d2 H           ULONG uCount = 1, uReturned;; B7 L: t6 ]. B
          if(pEnumClassObject->Reset() == S_OK)
! I$ d9 f1 f$ U) n  V4 Q7 ]4 D            {
5 J% m8 K( E+ s2 g, ]7 G2 Y  _              int iEnumIdx = 0;' e4 g$ q6 @3 i4 \
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)" T- o* J8 ]) d$ [. M
              {
2 q1 C: C/ {/ @" A                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
5 |4 q/ D! C1 u( a# q* I
/ |+ s" `- z: N4 s; e" ~1 {# [                 SAFEARRAY *pvNames = NULL;8 e( w# Z  y0 V7 x
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
: |$ i" c6 Y4 D/ M: I' m                  {7 A& d  Q9 z9 J
                   long vbl, vbu;! m* Y; N" E+ j3 p- O2 k
                   SafeArrayGetLBound(pvNames, 1, &vbl);
  K" K/ J* S( a" R4 S0 |% O# x                    SafeArrayGetUBound(pvNames, 1, &vbu);' o# ]5 t1 h9 ?+ ?' Q, l+ Q
                   for(long idx=vbl; idx<=vbu; idx++)
% q. c9 j: N- e; r1 Y                     {
0 @3 N7 }8 C* u" U0 a; }9 P+ N" X. b                       long aidx = idx;" X# u! M- z  Y8 O: h1 l7 D
                      wchar_t *wsName = 0;
6 A9 W6 ^0 z' Q9 b. b                       VARIANT vValue;
3 E! u! y) H& u% O                       VariantInit(&vValue);
' q0 r: [8 Z; [                       SafeArrayGetElement(pvNames, &aidx, &wsName);
5 j. M8 D) P0 [$ `. s' ?3 ~9 e( F, C; C4 w$ q/ ?* V! Q
                      BSTR bs = SysAllocString(wsName);
+ W( e6 \' y1 |                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);8 G! z3 o; r1 P; W6 a
                      SysFreeString(bs);
; l2 o: c3 s0 j8 L' p; A- `' r* w1 J* T$ [/ i
                      if(hRes == S_OK)
2 L7 V, ^  H6 b2 y" p0 P                        {
9 ?7 [1 O! l. d4 p4 F; ^: v                          AnsiString s;
+ w% ^+ t  y8 ]5 a0 p# D                          Variant v = *(Variant*)&vValue;
$ _/ J, Y7 Y3 b8 B% A                          if(v.IsArray())
. m  s1 ~, h% x+ y9 S) o. l$ L                           {& h( @( v, P4 R! S9 p  H
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)" i% T; B( H4 q0 [  ?) b
                             {
+ z2 i' b( P. G) G/ o9 _' s0 D                                Variant a = v.GetElement(i);" b% A: Y3 E3 B: W2 a7 t% ~0 g- C
                               if(!s.IsEmpty())8 u% Z; s& |! t/ w) R% r8 t, I* o
                                 s+=", ";
: s5 w  @+ o/ F% \7 N7 G( v" a                                s+=VarToStr(a);+ ~: ]) H7 k2 ?& v. |( B& Z
                             }: k1 S' ?0 T+ y9 M  B( D
                          }& c! E3 \! s. d' R  j' f$ U
                         else
' O3 n3 g+ ^- j8 ]                           {
6 b8 w/ d6 o9 i3 d  F& s  i# Z6 H                             s = VarToStr(v);  |9 g/ E# W: C2 {" b8 i
                          }
. Z$ Y- h" j* d; a                          lpList->Add(AnsiString(wsName)+"="+s);5 N0 Q: M  j% H9 N
                       }
; N. d8 u4 L2 |: q, a4 w! O% w. \0 F& R  f
                      VariantClear(&vValue);! o( I, u( ?# W% @* ^" p
                      SysFreeString(wsName);
9 d2 Q+ ?9 o' t. u1 w% g" i                     }
) A9 j  ?7 I. Q3 w; T9 n2 N( W. `                  }
! p  W; S+ n+ b: d( C                 if(pvNames)SafeArrayDestroy(pvNames);4 S, ^% B  t) C8 X- g& u" u+ T+ {
                iEnumIdx++;1 i# m: E" K# j9 S
              }
& d' V6 k, B5 F* |/ o            }9 X* K/ ^6 J- ?' X; a  c
          if(pClassObject)pClassObject->Release();
* T) [4 w3 C& D8 R% z) S, ?         }" B2 I+ B6 m9 e, A/ p$ M4 b' i
       if(pEnumClassObject)pEnumClassObject->Release();
6 Z7 b. ]/ k! B      }
9 e/ R# |8 [# R( f& H     if(pWbemServices)pWbemServices->Release();  t9 ?$ a5 s1 i" Y; c8 K6 d
  }
" O$ f5 A8 q. K$ t( {  if(pWbemLocator)pWbemLocator->Release();
: Q3 d$ f5 s7 I1 F3 i7 Q}; E( T- h' [; b! `; y8 q8 w! ]& u. @
//---------------------------------------------------------------------------) Y& w. ^* m; e+ k
" S5 E  J  o, K- P
// 通过 WIN32_bios 获取 BIOS 信息:
  E: N8 r( C: Z* N3 `void __fastcall TForm1::Button1Click(TObject *Sender)2 `, d2 O, ^& l
{7 B% p+ o  t0 I/ E# I% F
   Memo1->Lines->Add("================== [WIN32_bios] =================");6 i4 ?% d2 ?0 U+ A4 D2 }" ~
   GetWmiInfo(Memo1->Lines, "WIN32_bios");( K' [7 L7 Y" @+ y. n( c) Z+ K& J
   Memo1->Lines->Add("");
  `" v) W' w8 ]6 T& A}  R5 D- k, n% b
& [/ M  @8 G. I* s7 W
--------------------------------------------------------------------------------
7 K% q9 P7 E: l: ^& k5 m. m! {1 X6 t" p0 W/ n& z
WMI 可以访问的信息类型有:
7 l; A5 b, l+ P% h% O6 y   Win32_1394Controller
  d* N* ~; r9 z; Z4 W   Win32_BaseBoard; _, Z, S* ~9 ~5 ]- i' v9 }* S& k" I
  Win32_Battery
, V2 s1 Y" W; }   Win32_BIOS9 R# m; U) K! F! F
  Win32_Bus: X" a; L# s- t! w& C
  Win32_CacheMemory
2 I/ K! z* D( }) f9 c   Win32_CDROMDrive
2 u/ {4 J/ d) L5 n6 b   Win32_CurrentProbe- w& a& g- J4 ~) B9 Z0 q1 ^
  Win32_DesktopMonitor  A( z4 M$ b, _6 [2 S1 l- [; t
  Win32_DeviceMemoryAddress) g" z8 h/ E3 ~2 L9 _/ u) h
  Win32_DiskDrive+ N, x. ?- x$ y$ H( }
  Win32_DisplayConfiguration6 S- m6 O) [# N' Y
  Win32_DisplayControllerConfiguration
4 O0 U- d7 b' Q% W   Win32_DMAChannel; v3 i- B! p( D$ z  ~
  Win32_Fan
9 ?& @/ B! I: q2 |7 _   Win32_FloppyController
" h" g9 y0 S1 a- r# v+ E. b2 M: L, r   Win32_FloppyDrive
. H2 y$ ^# x* h8 F) S! Q* u   Win32_HeatPipe( |" q. v( ?. m( _
  Win32_IDEController
, O2 z# c8 d8 k   Win32_InfraredDevice
8 a+ `* l0 q# G! }   Win32_IRQResource
& g6 I: |8 v& k! v  |( z, u9 A   Win32_Keyboard, n* e% d3 h. _
  Win32_MemoryArray# |8 s2 W' U9 Y' \8 W, A+ `
  Win32_MemoryDevice  m, G8 B+ e0 o: j; c! ^
  Win32_MotherboardDevice0 |; D* d8 @" F# e
  Win32_NetworkAdapter
- E6 t" W0 t) T! o8 j" w   Win32_NetworkAdapterConfiguration9 `2 Y. U$ {/ G  j. O
  Win32_OnBoardDevice
8 Z9 I0 e$ ?* L- [   Win32_ParallelPort: ]& _- A# y5 R4 X* `
  Win32_PCMCIAController' r$ W) T; A$ g5 w: n
  Win32_PhysicalMemory
$ k3 c0 K( |3 k2 p# T4 @  ]; w   Win32_PhysicalMemoryArray" K# J$ I" O. d$ a" l
  Win32_PnPEntity
5 f& @7 ^' Y9 e8 P3 n0 r# g7 _   Win32_PointingDevice; U  ]9 S& ~/ h" Q0 W
  Win32_PortableBattery
1 g4 L  E4 c  _6 R   Win32_PortConnector3 N  T2 _2 H+ V
  Win32_PortResource) c5 ^8 R) `2 J+ I7 M9 o, M
  Win32_POTSModem
( w. o5 q& u7 v   Win32_PowerManagementEvent: O, g9 m8 }' ?; i. k6 ]# ]$ d
  Win32_Printer
  q/ z* o  C6 o   Win32_PrinterConfiguration+ C$ E+ [4 s& S* B5 d
  Win32_PrintJob
& b$ H* Y& G7 h   Win32_Processor
/ u( M- d8 o3 W# A* O   Win32_Refrigeration. K% C" ?0 ^9 Y7 t# v3 U4 W( s
  Win32_SerialPort/ l: N/ h4 i& h
  Win32_SerialPortConfiguration+ j; w# [' r1 V% F
  Win32_SMBIOSMemory
7 N+ M" ~2 [$ j6 S. i, V   Win32_SoundDevice9 Y: k1 N( j( y# `$ G" H
  Win32_SystemEnclosure* J( ^; v2 \7 U6 _% C4 j# X2 S
  Win32_SystemMemoryResource9 F1 v  W7 W9 g: d
  Win32_SystemSlot; l( [% R  S0 N$ A2 y4 N6 f
  Win32_TapeDrive$ z7 F" f) p3 ], o4 @1 _# w1 U
  Win32_TemperatureProbe5 h" O: ~6 E$ s/ n2 E! A5 y
  Win32_UninterruptiblePowerSupply
, x2 h& d: Z4 J( d   Win32_USBController
0 u' ]  t, j; w   Win32_VideoConfiguration* A" Q1 C2 J6 n- [" l' z. n; i
  Win32_VideoController
- I: J/ Y9 ~9 g/ L   Win32_VoltageProbe
( P5 W. O# d; ]2 Z9 C- f6 \8 _$ A. O1 A3 d! ]! D% ], H) P8 [
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-16 22:19 , Processed in 0.019278 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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