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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
8 U8 j% }; s( v5 P# @# ~
( |* ?1 K1 u  j$ i+ V
; }# @. w. e$ d3 E# ~" O--------------------------------------------------------------------------------0 X9 h9 S& n4 r* Q
WMI: Windows Management Instrumentation (Windows 管理工具)' b, U1 n* t/ H9 N+ T
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
9 C. l% q' }8 F  S' B4 g   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
2 o- T% H- ?0 e! G1 C8 z; v   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ' _* o& V4 u! N
" p+ Y0 T0 `9 `% T. {
--------------------------------------------------------------------------------
3 _' I2 n; c! A) J- E' Y' WBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面7 z2 B1 ?8 i0 T* ?5 w' o3 z& k
/ ~& `3 Q3 ^1 K  _
--------------------------------------------------------------------------------7 r6 U9 E* L8 `4 R
① 初始化 COM 接口:
1 l' B# x; K' C7 L' h% ^. o   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。" v/ D2 |( R! V. {! ]6 v* \: K
  这两个函数在 #include <comdef.h> 里面定义。9 _, @5 b" m' Q% j

- J& o- C0 Q6 z% v. H② 获取访问 WMI 权限:
+ a/ l$ @' x4 |6 @% P   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
0 h5 N2 u* h# u) k  x" c   如果这个函数返回 S_OK 获取权限成功, 否则为失败。$ V) p/ z  J: X" N) N
* a: }: i$ Z; i& i. V! b
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:6 R" y1 g1 _7 b; }8 C
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
; |: I! s, X8 B" I$ ~
0 l) b- g0 h4 b* pvoid GetWmiInfo(TStrings *lpList, WideString wsClass)" @5 V; ]0 y$ q( ~' P
{' E, i5 P% Z* B8 Z9 o( l
  IWbemLocator *pWbemLocator = NULL;, x0 R) @7 Q  J6 E" W- k1 ^% M7 o
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)" r! _) N  Z/ `) q, W
  {- d3 `* z, u. R% j
    IWbemServices *pWbemServices = NULL;* T4 l! u( U- z# w( c
    WideString wsNamespace = (L"root\\cimv2");
6 i- i' S% F( ]     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)  X! e: O9 a8 T8 W2 N5 z; S
     {" Q* Z  z0 W; N8 J+ e
       IEnumWbemClassObject *pEnumClassObject = NULL;
1 n/ z0 K' G3 Y1 C: z        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
6 n9 n/ B% P$ d& N+ m  W) C' G        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
+ l7 I9 S7 ^8 B) s         {
0 A1 W% I7 b* b' \           IWbemClassObject *pClassObject = NULL;
8 ?) z1 p0 b0 J5 h1 C. ?: E# o           ULONG uCount = 1, uReturned;$ {- A9 Z) H' v+ B& X# C/ k- N
          if(pEnumClassObject->Reset() == S_OK)
- P# t1 x  i4 P/ q" @            {! |8 }0 h( {- m( O
             int iEnumIdx = 0;2 l1 \4 p' ?' o
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)) F3 A+ N2 T# V$ b) A/ u
              {$ w) |( T0 p1 a5 R' L
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");# n6 ~6 G; H' A* M7 _

/ x' E8 C6 f# q# c2 `, u# ]& E                 SAFEARRAY *pvNames = NULL;
7 T9 _& L! q/ R) Q: H- Z* i                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK). v" a" H) Q, q
                 {
( @2 U5 ?' e7 ~2 _% c2 _$ S                    long vbl, vbu;- j, b, F$ ^# s
                   SafeArrayGetLBound(pvNames, 1, &vbl);
  s. h/ f' B& D( F                    SafeArrayGetUBound(pvNames, 1, &vbu);& Z' O- Z3 W: f$ \2 q
                   for(long idx=vbl; idx<=vbu; idx++)$ j# m9 m3 i, J2 c5 _' j
                    {
( e$ ~/ w7 W4 }6 B$ S* r                       long aidx = idx;$ n" J8 u# ~3 m6 ^9 J* q
                      wchar_t *wsName = 0;. i8 t) x! @1 D- k, t+ b+ l2 ~
                      VARIANT vValue;
; R* u' z/ l. W- y9 F                       VariantInit(&vValue);* ~. r6 n; a1 `4 ^8 Q) A& U, k' A$ T+ z" L
                      SafeArrayGetElement(pvNames, &aidx, &wsName);9 r- D1 Q1 i4 L, D

# a! S; h7 T$ i# l                       BSTR bs = SysAllocString(wsName);
) `3 g' _) O0 E' P5 [( Q' i                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
* I* r7 ^0 n1 N& ^                       SysFreeString(bs);, w. V9 N$ d2 ~5 ]; o/ I4 K

% H0 I% N5 w, Z# U9 E! c                       if(hRes == S_OK)
$ d+ \$ v9 A* Y4 N4 ^                        {3 ~( m0 P3 e9 T* P0 ]
                         AnsiString s;
# n. Y  q/ ]' K, j' K8 R                          Variant v = *(Variant*)&vValue;
# ^  d: o" v' f5 U( N9 v/ t                          if(v.IsArray())
$ b; _6 t3 J3 G                           {9 Y! Z) B5 z4 y! y- J7 o
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)2 n+ {# {6 S. [1 l0 z$ Y! r% h
                             {* {. v  ?9 z7 c3 [
                               Variant a = v.GetElement(i);) T' F1 K( q' d* Y
                               if(!s.IsEmpty())
) P8 ^# S' L1 u7 f' O) j4 Z                                  s+=", ";
, H- i- o: w# `                                s+=VarToStr(a);
, W' V5 u) I, q0 W( N                              }, m* Y) V/ r" t8 z9 S
                          }
. Y  X& ]% H5 J+ `1 I5 c! Y7 l                          else
# T0 K" x: n! q* q                           {! F6 j+ G9 ?% `5 r# r- ?
                            s = VarToStr(v);/ z- l; H! F7 P6 }8 x& i
                          }1 d1 h" k) B$ o/ V9 J: r' u* C
                         lpList->Add(AnsiString(wsName)+"="+s);
+ [2 H* e0 i5 D                        }
! |) R) D" A# Q2 n$ _5 [4 q
, u, X& _; p; U6 A4 S1 j' d* N                       VariantClear(&vValue);3 Y9 z( p" R( v* ^
                      SysFreeString(wsName);
  k1 a+ _) y# l. ?" \- O/ v                     }7 Z/ j- l: ]! a# Q  r* ^1 K
                 }
+ n: ]' s5 P% i: V' u                 if(pvNames)SafeArrayDestroy(pvNames);+ }1 j% k: t9 {
                iEnumIdx++;
" G/ f& m) S& \7 u& T               }
7 h* Q" i4 v0 ], T* C            }# |; a7 R( B# S4 g: S
          if(pClassObject)pClassObject->Release();
# S% E- @5 z: W         }0 P7 j. J& c: f- J
       if(pEnumClassObject)pEnumClassObject->Release();7 O% d5 Z6 U1 i; D- I, [) Q& t- L+ C
     }
1 j# n! O" e  H5 ]+ w3 E     if(pWbemServices)pWbemServices->Release();- T9 h! D9 ^7 g$ F, r2 Q9 I4 c, k
  }8 P6 \  f' p0 i- K& d
  if(pWbemLocator)pWbemLocator->Release();* b7 S5 t0 k! Z* s3 t( g0 r  O' x
}
# J4 W! L9 g2 v: b/ J9 O, [: h//---------------------------------------------------------------------------
$ [) o4 ]' ~4 v1 N, e3 C
$ Z1 a1 H/ g& m6 t+ l: c) B2 U// 通过 WIN32_bios 获取 BIOS 信息:- |& C  J5 q, B% `) f5 L$ N& ~
void __fastcall TForm1::Button1Click(TObject *Sender)
* q/ ^" I1 P7 Y1 Y! d3 E" O. V{
4 i; {$ [( }: p7 v% z, a) F    Memo1->Lines->Add("================== [WIN32_bios] =================");/ B. H& [# g. Q0 ^1 m8 J- N( L9 s
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
8 Z! ]: G/ O1 c' `+ I    Memo1->Lines->Add("");
  g% }# ^& q3 N0 B8 w  G/ j% f}
7 w5 c$ J( j2 }4 A- X/ |) G
' [! z7 o% z8 M, y! r2 t: f) ?& w--------------------------------------------------------------------------------2 C1 b/ n: H, I1 p% |

! {) |( J4 Z2 x- B; J* @WMI 可以访问的信息类型有:$ W. ^' {) Q: T' w" m; A* d7 o
  Win32_1394Controller
% R6 v: L$ j: i; `# s5 c   Win32_BaseBoard7 H/ {4 I. }! X) O
  Win32_Battery
$ k2 |' u$ ]. Q# i   Win32_BIOS
1 |0 K& o( n0 T0 \   Win32_Bus
! z& m$ T1 _8 }$ g   Win32_CacheMemory
* R! G- C4 A; y! V9 B9 O   Win32_CDROMDrive
/ ^4 i7 P5 r. L   Win32_CurrentProbe
7 j0 o4 L; p5 k. ~   Win32_DesktopMonitor& {, o8 a( E1 {1 p7 h
  Win32_DeviceMemoryAddress
# h1 P* o2 K. w, Z; D  s   Win32_DiskDrive
8 k/ z3 _1 {3 a, t) S( Q( X- D   Win32_DisplayConfiguration* D+ l: G2 v1 Q9 f8 U: @' ^, R. K
  Win32_DisplayControllerConfiguration
; E/ T# `4 }, c' `  @+ D   Win32_DMAChannel5 O! G2 D  y4 W2 N* {0 H
  Win32_Fan5 j1 P5 c' T3 X+ a! }7 {
  Win32_FloppyController: e  Y, A  P8 [+ Z7 |' U* d4 {
  Win32_FloppyDrive
* u! W7 W9 p7 C& q9 U) [   Win32_HeatPipe% N, n7 Y2 Q$ A9 D$ C
  Win32_IDEController3 F' @7 f0 d) p4 ^" ^
  Win32_InfraredDevice
7 D/ \* F4 ~: L, d   Win32_IRQResource# l: H4 O2 Z9 Q+ U+ R" ]9 v
  Win32_Keyboard# y1 C2 k9 e- v
  Win32_MemoryArray$ V# C# _% u' ^3 c0 d. ]9 S* b; D
  Win32_MemoryDevice/ g; i( y* i* ^# W7 N1 u  f
  Win32_MotherboardDevice
: `4 n( n; U; w' V) [  @# ?   Win32_NetworkAdapter
) u8 u1 R& {1 w& O8 L   Win32_NetworkAdapterConfiguration
- ~, D1 N5 ~" n/ Y! n6 r   Win32_OnBoardDevice
$ c  S; j, W, M! _8 y- w   Win32_ParallelPort
6 {( v7 [3 u1 F8 S6 q2 o! Q: Q   Win32_PCMCIAController
: L, g; u4 E5 m   Win32_PhysicalMemory+ S7 b. W' Z6 f( w9 x7 ^; S8 W0 A7 F
  Win32_PhysicalMemoryArray
0 {; P3 k+ h: ]7 }; B  ~   Win32_PnPEntity+ H( a1 _% G* E' Z
  Win32_PointingDevice
: y$ ]  r+ s! q' r5 i   Win32_PortableBattery$ p- ]" q1 p: r" G- K# q) x
  Win32_PortConnector9 z, P, L. v/ V! o2 L; m7 T
  Win32_PortResource
5 C4 z# D" o  {2 r* d( P   Win32_POTSModem5 q) E9 b2 f# M+ l- i% }
  Win32_PowerManagementEvent& U4 A' c3 k/ n4 \9 U+ `
  Win32_Printer4 ~0 ^' i0 H6 t% D3 q' Z3 r
  Win32_PrinterConfiguration% E! F. i, h5 W: F% ]  M& T1 j
  Win32_PrintJob
7 y1 m4 E+ W2 u: |4 z6 i$ B  t   Win32_Processor- i9 n* P' R2 j% `
  Win32_Refrigeration
) H! ?& x: S( q" e( V; S2 W2 `   Win32_SerialPort1 V) z( e, p* v+ e5 d# Z3 B
  Win32_SerialPortConfiguration
# D" b$ ~; U- F+ q1 j   Win32_SMBIOSMemory
7 ^7 a9 o. E8 u3 S3 `   Win32_SoundDevice& y9 J( Z% J; r( }9 ^6 M
  Win32_SystemEnclosure
/ B% c% ^( A6 e8 \9 y4 I& v: ~8 G   Win32_SystemMemoryResource9 K. N8 I2 C6 X
  Win32_SystemSlot/ @: x  w% g4 N4 X  |6 t( a
  Win32_TapeDrive
4 _' l7 l: @' I. e   Win32_TemperatureProbe& K8 b1 _. W+ ~' w( `, X: Z% \3 |
  Win32_UninterruptiblePowerSupply: u, D; }& M" k$ m6 g% [6 t/ M
  Win32_USBController/ d7 z; A% ?- Q! b
  Win32_VideoConfiguration
! A8 @- F  d1 b- |% K  G   Win32_VideoController- f/ T9 C4 o$ {/ v  L! Q0 A, M* M
  Win32_VoltageProbe
- a1 }1 X7 G0 A7 G; C* m2 ~! n
' f9 ~! E( U" q# f( k  K以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-22 16:41 , Processed in 0.019606 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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