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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)9 Y2 R8 w! L% S; r% S- s* X

1 R8 x& W% c" S* y) }3 P, {0 h3 K2 k4 x
--------------------------------------------------------------------------------7 x1 T4 r1 h, P( ~
WMI: Windows Management Instrumentation (Windows 管理工具)0 Q* _2 k. u$ F% y) ^
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
3 d) G# {8 B7 `5 v! c/ m2 w$ w) E8 J2 M   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
$ O: ]1 H* X- q0 n5 B3 [   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 + K: N2 R( l4 W4 m& L, s3 K' J) {3 {
7 x, x/ Z" y; I1 M4 ~) A& |
--------------------------------------------------------------------------------
0 ~1 @" Z4 k  ^0 `BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面$ R: G; S3 `7 n1 Y3 c% f5 G( R6 k

7 c/ K3 I" q! ~( b, {- l8 \--------------------------------------------------------------------------------
  x9 F( N* e: R' y① 初始化 COM 接口:9 j& ?/ s, W3 ?# \5 @/ S
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
- L. B, _$ S9 f2 ?   这两个函数在 #include <comdef.h> 里面定义。, E) e% `! Z) m1 A7 b1 I' j  a4 n

3 c3 k' {: N+ B5 K* ?% g' z② 获取访问 WMI 权限:3 D: y# a. M: l+ M  w6 C
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
% _: m8 u1 S: P' Q8 {   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
/ [& x0 h0 k' J. I" i% q. ^& Y
5 i7 ?/ ?+ Z7 C: {③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
5 H4 H; l) m0 [" w3 g   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
0 e, Z3 J$ j( z$ [' m$ q
* x' q4 ~  L/ d+ i3 ]& vvoid GetWmiInfo(TStrings *lpList, WideString wsClass)/ }0 B3 V" C3 i, T$ J0 L; k
{1 R% G) R* T& }
  IWbemLocator *pWbemLocator = NULL;; I2 s. |) B! i3 V; h  e
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)2 _! q+ I- k% B$ d" e- X; f
  {3 i$ U- ^1 u9 B; \+ p$ x5 y
    IWbemServices *pWbemServices = NULL;8 g; A4 j- `$ L5 n
    WideString wsNamespace = (L"root\\cimv2");
. K) O/ e8 X4 U) O4 }- I; W     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
* _1 q( ?! W' {6 x      {/ v: F% I' w0 W( `
       IEnumWbemClassObject *pEnumClassObject = NULL;+ G. `3 q* \  [2 F0 o6 N
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;  M; J% b& T( m
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)6 D! |' c& p7 h' I* t( o
        {
( @% H/ p4 G8 ^9 M; K; [  U7 O           IWbemClassObject *pClassObject = NULL;
8 p% M* ]5 K: l% T& }7 p           ULONG uCount = 1, uReturned;& A$ ?4 V: |8 Y8 I
          if(pEnumClassObject->Reset() == S_OK)  W! N- b! ]- e' b7 X
           {
5 K7 \; k/ r9 y- }' a' `              int iEnumIdx = 0;
8 k0 ~* E% W% b6 n* O, i/ E              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
% ?4 a& Y0 ?" @               {, N, ?; v. l4 d& o9 R" N
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
6 e, m# C* K$ S$ q3 u7 A+ d6 f- z4 v+ ~- T1 i+ [
                SAFEARRAY *pvNames = NULL;
/ |& `7 G& w* }9 U                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
+ P* m: T& `$ a                  {
; I3 K$ c' W# q; z* k                    long vbl, vbu;
+ e0 |& N7 T# x8 M8 ]- P                    SafeArrayGetLBound(pvNames, 1, &vbl);
: g" i' M# q+ j* B' N1 _0 G2 ~- d) H                    SafeArrayGetUBound(pvNames, 1, &vbu);
9 L! Z( [0 ^' q( O8 ~# U1 E                    for(long idx=vbl; idx<=vbu; idx++)) k" X* n* e' X+ D* q2 G
                    {
8 f4 V  I3 k; j. W% x                       long aidx = idx;2 O) Q* t  e2 W
                      wchar_t *wsName = 0;
* j0 Z& X1 E: n3 y  H. I! r# X# h                       VARIANT vValue;0 F! m! O' S: y7 \' |
                      VariantInit(&vValue);# x- b# I) y+ ~. R5 Z! y
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
/ [9 |) X* J2 h8 @: L- k+ ]$ h" B" y! Y0 z+ U' V
                      BSTR bs = SysAllocString(wsName);
3 ~4 X$ R+ ?. x3 [/ p8 j0 X                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);7 P5 l* W) o; l% K5 x
                      SysFreeString(bs);
! ~+ a/ ~3 X0 o* G( ?% U  Z  e6 P* n# k
                      if(hRes == S_OK)
5 D/ O; c; l3 L5 T$ E0 j                        {
/ x* Q: @  ^* F9 ]                          AnsiString s;% a/ J" k  \) q5 K/ M- G) K
                         Variant v = *(Variant*)&vValue;8 \$ C3 N% O) V
                         if(v.IsArray()); W- p$ w# D: h1 L
                          {
3 z0 d" f$ r& R) r3 F                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)4 ~4 S2 c; q: ~! v" E" x/ ^- Y
                             {
, A& ^! [# B6 p( B1 X7 }8 p! C                                Variant a = v.GetElement(i);
& J5 T0 o! ^, U" `                                if(!s.IsEmpty())
, H1 \. i% |7 W  n% m, v; N( X/ {# |                                  s+=", ";
0 b3 h& }: s5 U0 F                                s+=VarToStr(a);1 T; a2 _7 g, i7 _
                             }! S9 Z, B* ~* `% E! e( H% b
                          }. [. h; y; I  O* M
                         else! E$ P: T2 y! G7 Y. w' r8 \) _% y
                          {) L* l& k1 A; @, a! }% n7 T$ ~
                            s = VarToStr(v);
& R. U% E* C: s0 H2 p1 o                           }  T; t+ k0 A* P5 C, r+ h4 E+ ]+ u
                         lpList->Add(AnsiString(wsName)+"="+s);
- C- a8 r, F8 u7 e                        }
6 ^! s: ?- o, l8 k/ [) g8 R" m# P8 R
                      VariantClear(&vValue);: o  Q- T; D" X% W  i  ^* u7 u
                      SysFreeString(wsName);
' R/ v8 o9 ?' b, V$ x! ]( l                     }
; m! h0 U8 C7 J( |; i* ~! o                  }$ z. I3 u7 |) \$ S
                if(pvNames)SafeArrayDestroy(pvNames);
; b0 _$ c7 P- l4 k! ]1 ~                 iEnumIdx++;" |  l) B9 I7 o0 f: V% Y) e
              }6 ]) `, ]% y9 s: ?7 c
           }9 c6 G" m5 x0 M
          if(pClassObject)pClassObject->Release();
+ h6 V* {5 [6 n1 C& t7 K         }
+ a# U! {5 }8 p0 Q* R        if(pEnumClassObject)pEnumClassObject->Release();5 [1 @5 t7 x# R0 ^# \; {
     }
: a3 n+ v  u4 W4 x" u- l3 K$ R     if(pWbemServices)pWbemServices->Release();5 X& r+ _/ |- A, ~0 g4 _( H
  }3 M& M: c4 ^3 x9 B
  if(pWbemLocator)pWbemLocator->Release();
! `- H; I) a2 |7 J9 ]8 a}8 j$ Q7 s$ S+ i" g$ h7 _' a6 K* x
//---------------------------------------------------------------------------- q7 P7 D. X5 n$ U0 @0 u
+ ^* n1 i9 n/ W' R8 [$ ?- i1 C* x$ o
// 通过 WIN32_bios 获取 BIOS 信息:
4 D& `  m- e. B& Q- vvoid __fastcall TForm1::Button1Click(TObject *Sender)5 B) }5 f8 Q; t
{
6 l; F* B5 t7 p1 M2 p) i8 `$ ^' w5 X4 R    Memo1->Lines->Add("================== [WIN32_bios] =================");8 i6 R5 w6 z2 z1 o
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
; O3 g) T  d0 [$ K- T2 \    Memo1->Lines->Add("");$ c- |+ E( c9 ?% e- x7 Y0 o7 N
}
! a' ]& v: B5 W- n+ g# G5 P+ Y/ }8 Z. z2 @7 l
--------------------------------------------------------------------------------
( J: f5 a% D( b! M- a
: l1 N. X! v* I$ ~+ SWMI 可以访问的信息类型有:
2 g* j4 Q% |# ?# s  d# |3 B   Win32_1394Controller
' U  {. n' w& j- f   Win32_BaseBoard: O. w- l" J  K
  Win32_Battery
! q: Q, a0 O2 C' I# c   Win32_BIOS* K- E2 q& s; {, O. m9 N; P
  Win32_Bus  u# `/ ?' E. O& n/ E. b
  Win32_CacheMemory. u' T3 |1 c/ o$ m' g
  Win32_CDROMDrive! [  X; p/ L7 ?3 ?6 h7 z
  Win32_CurrentProbe
! f2 H1 J4 P5 C2 E2 w% L- y   Win32_DesktopMonitor' S' X5 U* ~3 s# Z1 c, B
  Win32_DeviceMemoryAddress
( D9 f1 g* o" b& `   Win32_DiskDrive! R8 g# O: t' ]( O
  Win32_DisplayConfiguration5 K8 V: y9 H% y" C' S0 S& N
  Win32_DisplayControllerConfiguration
7 ^  D0 f5 i/ \5 b! ?   Win32_DMAChannel7 l- R$ e3 V; k0 \, S/ i
  Win32_Fan
1 B& O8 L5 s  {( \1 u   Win32_FloppyController  O6 h5 K3 [, R5 Q  d
  Win32_FloppyDrive: I6 e+ E7 F" @1 _
  Win32_HeatPipe
0 \' S2 c. l# y0 y& E* ?   Win32_IDEController* N. W' p% i* y% k+ J# Z
  Win32_InfraredDevice
$ M# O- ]8 ~6 f7 K2 Q9 g   Win32_IRQResource
& f' j1 }, g0 K6 L' V7 c   Win32_Keyboard
) ]8 [# O/ x1 j  x) U# g$ S   Win32_MemoryArray
$ P: U3 ~/ Y. M$ n. S1 X4 v6 m   Win32_MemoryDevice2 r/ \0 S9 Z3 s4 z
  Win32_MotherboardDevice" o# ]* a# ]$ C( L7 ]9 x: r+ v
  Win32_NetworkAdapter
# t9 J  R6 g! P! w% |7 l( @   Win32_NetworkAdapterConfiguration
3 v  i6 Z3 W4 A: ^2 u   Win32_OnBoardDevice
% g2 F- A0 W  T5 p% Q2 c: ]   Win32_ParallelPort
; k6 Z  H2 X: Y7 \# C* z2 z3 M   Win32_PCMCIAController
( Y2 C8 z$ }% c! s   Win32_PhysicalMemory
6 X3 q; i! |! ?3 x" B: h   Win32_PhysicalMemoryArray
; ~# ^6 N) G+ ?0 I3 J$ |   Win32_PnPEntity5 X3 A+ I; \- C  X; ?- @
  Win32_PointingDevice2 D9 z5 `5 b1 W' W
  Win32_PortableBattery* L) d/ K! w' e! g: Y( Q/ {
  Win32_PortConnector
9 m8 Q3 s. c$ |   Win32_PortResource
! D# H& Y, {# ]   Win32_POTSModem% d8 J9 `2 I9 M$ u' `
  Win32_PowerManagementEvent4 _0 R- b1 m3 h4 q' ~
  Win32_Printer
0 Y" ~! v  Y0 Q   Win32_PrinterConfiguration
3 `8 ]5 X# w3 G& H$ H! e/ J   Win32_PrintJob3 k9 W& m4 g+ X9 j
  Win32_Processor
0 \& ^; E% i, s% c% a7 h   Win32_Refrigeration
' a7 {6 {6 u. U3 r   Win32_SerialPort7 S, X' r- Q" N: Y, E0 E! ~
  Win32_SerialPortConfiguration
" v, U: g3 i" }! [0 F! a   Win32_SMBIOSMemory6 n+ ~1 S0 x0 l' d
  Win32_SoundDevice0 u; ]& [; n  O( X: r/ e* B2 H
  Win32_SystemEnclosure
* T/ J" T$ Z% K+ d   Win32_SystemMemoryResource
8 U+ T& q  x5 S) {  d   Win32_SystemSlot
3 n' v0 P) ?9 P' V* h1 k3 W( f   Win32_TapeDrive
7 b4 q/ u' P* }, [! C" S   Win32_TemperatureProbe
5 f' l6 q9 s' z   Win32_UninterruptiblePowerSupply& v, ]+ R4 C) ^# f: I' n3 M
  Win32_USBController: n7 v2 x- [' ~+ \% s
  Win32_VideoConfiguration
- X6 a; Q) p2 S   Win32_VideoController
8 }6 ^+ a! J2 X5 r$ O* v   Win32_VoltageProbe
9 a; ]: C& I6 ~- X: s7 m, o1 \
7 X% D3 y7 a5 Q4 M* a: G以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-13 10:46 , Processed in 0.019640 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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