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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
/ q8 l: l, o) J4 i- m  V8 E2 m
' V1 }9 b; s# t. ]- R  [4 m7 \) p# ?
--------------------------------------------------------------------------------
  g/ ^* u9 l6 H, v8 [WMI: Windows Management Instrumentation (Windows 管理工具): A" A% s, E5 U  K# y; y' H# s
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
& ]4 R3 I6 H, i) [   利用这个工具可以管理本地或客户端系统中几乎所有的信息。! i" \" P. w  i0 ~; H8 P0 \
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
9 J# O: I: X. }3 v9 W! l, p$ V; c0 O
--------------------------------------------------------------------------------$ r* r  ^1 z5 G2 Z# i. h9 J  t
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面' {3 k" [$ V1 J" E! i$ v3 @0 s! I" b
: f7 ~( D, l2 Q! J, ]# S  z  a1 A
--------------------------------------------------------------------------------3 z& b* a( t- w, F; N) u, Y# s
① 初始化 COM 接口:
; i* N) w  z& @' u! T4 m   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
0 v) K$ o( j' H5 r0 n   这两个函数在 #include <comdef.h> 里面定义。
/ c( k! o: X5 i6 o: K. g8 ^' ?6 |, j
② 获取访问 WMI 权限:! s! `5 I6 v' \/ ]2 s0 ^8 |
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);! V/ H, I) ^1 e) D% [  ^7 {; d: _
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。' P# }: m' i4 k2 ^: `8 G7 g

% O' h! ]3 F0 O: A2 [9 ?③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:" e& w4 i0 n3 l. f8 f* z. q
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。! O0 e! h0 T# J5 M! I7 F4 A

( j  x4 ^: O" {( t) Qvoid GetWmiInfo(TStrings *lpList, WideString wsClass)" F8 K& Y6 P' Z
{
! D8 G# _* T8 s  F+ W+ Q  IWbemLocator *pWbemLocator = NULL;
$ d8 j9 |+ R: q( L+ d2 E7 w; a6 x  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
( J' ^! V2 g; X" {2 G   {
0 L9 t, u  z! Y: {! q: Z4 Z! \     IWbemServices *pWbemServices = NULL;  W7 f3 R# C. v6 N
    WideString wsNamespace = (L"root\\cimv2");
( K# a- P, B- m2 g' G  A     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK): X+ R1 J$ L, E: a
     {/ p5 F. n/ h1 t- d4 u3 u
       IEnumWbemClassObject *pEnumClassObject = NULL;; W, Q6 x. w; s4 b5 y9 v+ d& a( K
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
% ]5 ?1 L- `4 M! O* P) P. W9 n9 O        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)( m' N0 _9 Q3 ]* Q# z$ Z
        {
6 j2 }; [! ?9 j: `3 Z! i* M* ~           IWbemClassObject *pClassObject = NULL;5 T  ^; z( _+ ^; V- ^
          ULONG uCount = 1, uReturned;: n+ S- T' s9 p9 D* h" r# b
          if(pEnumClassObject->Reset() == S_OK)
: o' O. b: R% ^8 B) D6 t) r+ Y% D            {
3 h) y; G! ^. _1 o! h; g- @6 v+ k              int iEnumIdx = 0;6 R& J9 A9 o! }+ e& M
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)9 O- d0 S1 [) F
              {
7 G" ~3 M: w6 t% C9 G                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
' E. s! j. z1 L, K: L& o
1 v, T, Y5 }, W( M9 M1 R                 SAFEARRAY *pvNames = NULL;* M# x9 x& e+ y* K2 S' g* \
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)$ Z  v/ i* g. K) b5 ?
                 {
2 Z' [' M+ }7 O1 @+ h0 U                    long vbl, vbu;
/ L: ^) j7 x4 C4 L) V# d) {                    SafeArrayGetLBound(pvNames, 1, &vbl);
# i! r% @) p- N6 s                    SafeArrayGetUBound(pvNames, 1, &vbu);5 `) K: K# O7 f- f3 A; S
                   for(long idx=vbl; idx<=vbu; idx++)9 e; }: p1 ?( n0 r% h
                    {
- X3 ^; h# l$ h7 g$ N$ s1 Y' Q+ C1 k                       long aidx = idx;0 P  c# R; A% f  h& n
                      wchar_t *wsName = 0;
  }4 c, ]* ^: b3 s9 \8 @: y                       VARIANT vValue;9 z7 l8 U. o1 D4 k- G0 y
                      VariantInit(&vValue);6 a) N) @, i5 N
                      SafeArrayGetElement(pvNames, &aidx, &wsName);( r1 p% @/ K. W, B( G

8 k' m# a2 v- \5 }" t9 _/ G3 A0 i                       BSTR bs = SysAllocString(wsName);8 J3 M  y9 _1 W" b* U0 F
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
7 A/ T! n3 r4 _                       SysFreeString(bs);
2 c  _3 E6 m$ P& V& g
2 j6 X  K; b& o" c" h1 Z# J  l                       if(hRes == S_OK)* V: J! h6 z9 V/ n' i+ l
                       {
& d6 M; K# f9 S3 |                          AnsiString s;* u$ \3 E% k7 `/ {9 a
                         Variant v = *(Variant*)&vValue;
9 h8 O: A$ f2 A6 U                          if(v.IsArray())
/ `& k# e- ^) b                           {! m% i" x4 F. }2 O
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
/ s6 E6 z+ J4 R! j9 I: B                              {  V4 F. `8 B6 b* G7 s3 h
                               Variant a = v.GetElement(i);) N, t" v; k! U" I( o
                               if(!s.IsEmpty())
8 {/ U; g& Y4 k                                  s+=", ";
% A: Q' t0 @4 s9 @- O# T  m: E                                s+=VarToStr(a);6 u: Q- r$ m  s: i" Z2 z
                             }* V6 K& V8 H9 k& E" J9 g
                          }, f+ l! Q7 h2 S" ]8 Z
                         else+ i8 \( k; m2 M- l. Q/ s2 K$ }: a
                          {$ v! H. L# t- J* e( s( b
                            s = VarToStr(v);
, I" ?" u3 I$ B8 w# K: T                           }
8 Y/ Y" m5 Y5 V8 Y                          lpList->Add(AnsiString(wsName)+"="+s);' ^( o' p. r$ u
                       }4 k7 C8 v  `" c& t4 u

2 [: c6 a" X; {( i$ N                       VariantClear(&vValue);. o/ t+ {) a* V- k
                      SysFreeString(wsName);
% B4 _3 D3 z" J* b. r                     }8 k) j! o- D. [) J- c6 @8 l6 R
                 }0 K6 |& m) m8 l$ h0 H6 g+ k
                if(pvNames)SafeArrayDestroy(pvNames);
! G# x: ?- n( A! V3 Y                 iEnumIdx++;
6 {5 F+ h* f) |8 t( [3 \$ c               }5 M* Y" y+ B" r
           }* e& h3 y) n9 q1 y6 U' f
          if(pClassObject)pClassObject->Release();
( [# C/ d/ E4 U  T1 _3 J         }
3 m! I+ }# P2 V( d; e/ f" G        if(pEnumClassObject)pEnumClassObject->Release();
, x- _5 ]. c8 ^" H      }- U9 ]" r% H  |# B/ S1 W: O
    if(pWbemServices)pWbemServices->Release();
& L* g" m) [4 {( W% j( d% O   }
7 c6 M6 p& U7 }$ b  if(pWbemLocator)pWbemLocator->Release();
! R# p# q: |/ Z}
  X! k3 l$ H6 R* G3 R8 U//---------------------------------------------------------------------------+ ~- X0 S3 X$ J2 [
* X* ~- I% ^* w4 N
// 通过 WIN32_bios 获取 BIOS 信息:) C! T, U* s- h/ a9 c# U
void __fastcall TForm1::Button1Click(TObject *Sender)4 t( [) u' L9 R. }# Y! s% F
{
  H0 u- a1 b2 m: o/ n    Memo1->Lines->Add("================== [WIN32_bios] =================");  D/ r$ @7 m% S5 n
   GetWmiInfo(Memo1->Lines, "WIN32_bios");8 q/ @. I. \- [; P7 ~
   Memo1->Lines->Add("");, F& P  x8 |, Z  R3 ]5 H2 B- N
}% Y8 X, L8 @3 E5 ]; `* }

1 L9 N4 |  r* \: w; N) L--------------------------------------------------------------------------------& o& _2 u6 w' c9 n0 L. ]

# o' X9 O) e) D' e2 v- [WMI 可以访问的信息类型有:
4 B: W( l" y& d6 m  @5 ]$ D   Win32_1394Controller
  j# ^6 H$ r2 t: I! l   Win32_BaseBoard
- T& i5 f6 u2 e# o: B7 \   Win32_Battery
7 {5 T. \- _2 T; J$ v8 T. |   Win32_BIOS" R9 w1 u$ J9 B8 j8 O1 @8 |! {
  Win32_Bus& t+ P- Y3 h3 u+ ^9 q, L
  Win32_CacheMemory
, y: ~$ ^$ K9 I  y   Win32_CDROMDrive
# ]% b/ r- r0 a% ]   Win32_CurrentProbe
1 [3 E7 w* q1 b" A- L0 l   Win32_DesktopMonitor
' Z0 C$ Y) O2 n! V9 V. ^   Win32_DeviceMemoryAddress2 h8 u" Q1 P& U; ?8 a; {
  Win32_DiskDrive
1 U6 [6 d0 u8 x9 ~, Q! X   Win32_DisplayConfiguration
1 l4 H( w- q4 c2 B1 S. E6 @   Win32_DisplayControllerConfiguration/ x0 H5 a0 h" a7 D  r
  Win32_DMAChannel/ q& w- d& o! \% h4 E
  Win32_Fan
" e3 X7 j( s1 h9 L% w" i: i/ \  d   Win32_FloppyController1 [; Q+ P, Z- t; t* x' @  K, q! z
  Win32_FloppyDrive
+ ^' B, f2 J3 ]   Win32_HeatPipe4 Q* @8 k! b7 z' f$ c* e
  Win32_IDEController
% s/ b2 J. u" P# k7 g. z+ r& U" K   Win32_InfraredDevice
7 {! ~! Z# X& u- ]& {( T) x: M   Win32_IRQResource
8 V1 G: q: \; T. ]9 B   Win32_Keyboard- v- R3 e2 d/ b. g7 M
  Win32_MemoryArray7 s% j% b! j9 i1 d% |
  Win32_MemoryDevice
6 F- g* ~% H2 a: @. ^   Win32_MotherboardDevice3 O8 P/ N  A3 q/ ?
  Win32_NetworkAdapter3 G2 S8 a/ p% r- J8 A/ ?: t* y
  Win32_NetworkAdapterConfiguration
( i: `/ \% m! J  ]   Win32_OnBoardDevice
! [+ X' {: b' M% B   Win32_ParallelPort
- Q3 W# P* L# _+ H: y- U6 H   Win32_PCMCIAController
  I- x9 d3 z) y( e& ^' [   Win32_PhysicalMemory
, D. [; @/ @. c7 ^! L) c   Win32_PhysicalMemoryArray
2 z; a+ [' `* N& B, ?1 L8 c! k4 F   Win32_PnPEntity5 f: c$ z# e- }" k$ }$ `
  Win32_PointingDevice$ y! V1 C( l* }1 J! s
  Win32_PortableBattery
: ~, z0 V+ f8 p0 m5 V" m   Win32_PortConnector
, a5 J5 t. r9 t  O& U   Win32_PortResource
( h+ z% ]9 c1 o! `' b, ]) ?   Win32_POTSModem- @: U0 s* O) }: m* }8 K7 n
  Win32_PowerManagementEvent+ M. K! z# ]/ W% K9 b
  Win32_Printer
5 a# J* }% q; p/ p8 t1 U  D6 F   Win32_PrinterConfiguration
* `0 |& X, Z! n9 r+ m! ?& O   Win32_PrintJob8 m6 Z* O) Y" b2 K- F  G
  Win32_Processor" H' L! x. {6 k' C& l$ w
  Win32_Refrigeration9 d4 P& P5 ~- ]" b( x1 _, Y
  Win32_SerialPort
; Q! G. ]& F, @   Win32_SerialPortConfiguration
' m/ }9 Z0 ?" B, d$ Q& E   Win32_SMBIOSMemory! h9 {9 Y1 J* ^* ]/ j5 Y
  Win32_SoundDevice
% h( D; M1 H- q4 f, L. a   Win32_SystemEnclosure# U! I0 ?* |/ H& i$ y
  Win32_SystemMemoryResource/ d0 k4 f  W$ u2 K* ~+ o
  Win32_SystemSlot5 u9 Z- u% A. i' h
  Win32_TapeDrive! q. i8 ~- C& e! w( I9 |
  Win32_TemperatureProbe
) r/ J# {! r2 R6 Z+ T1 e   Win32_UninterruptiblePowerSupply) Z" L9 Q( C, B
  Win32_USBController, v5 @# ]: X- w" c- m* M
  Win32_VideoConfiguration
4 C6 G$ P3 T1 K3 l) @) q7 q4 [: @& R   Win32_VideoController! ^# g4 @$ A8 y0 I
  Win32_VoltageProbe
8 ]  A( O8 W/ W5 c' w" H# u! e+ c3 {, ~0 x
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-25 16:14 , Processed in 0.017581 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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