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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)' M2 {7 o  }* J
- c5 Y$ t8 M/ f+ y) M
/ `9 P* {" Y$ j3 x( T* u( \
--------------------------------------------------------------------------------' H# R7 p) N* d$ V
WMI: Windows Management Instrumentation (Windows 管理工具)- }. a+ R3 o) L6 N1 p
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
8 o; N# L6 d% t" V" ~   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
! U: j/ t2 L& l5 j) T4 [3 e/ y8 o   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
7 j  \: z" m% [& O8 p, G! y
6 t4 F! h( u$ r, ^0 D) I--------------------------------------------------------------------------------# u7 \' A2 t8 U
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
! a* X  A% r* A# }+ e( t* E- n" G" d6 s
--------------------------------------------------------------------------------
% @+ _4 l2 y0 Y. o- B8 T① 初始化 COM 接口:9 ?+ @5 X$ s0 P7 b6 m
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
9 t" |$ @& A% p+ ]1 _, E) A   这两个函数在 #include <comdef.h> 里面定义。. w  p! F& V- n$ i: |; `) j  C
. h( C- w5 ], x3 x1 ]6 H+ N* |$ Z
② 获取访问 WMI 权限:
- ~' c1 ~+ {* w0 i- u   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
; Z  @* U# c; s3 I   如果这个函数返回 S_OK 获取权限成功, 否则为失败。; ~, p/ R  B: e% F2 r

7 x( m5 p* |" X, n③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
# L2 f: C7 [' ]1 J# l$ H! G   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。( ^* A) F: j  I5 e
: J8 F5 `9 M3 W+ e
void GetWmiInfo(TStrings *lpList, WideString wsClass)% b' Z+ }  E1 g' [/ Z1 b
{1 j4 I3 Z! o$ Q/ ?
  IWbemLocator *pWbemLocator = NULL;) O9 k5 O/ Z7 A& h
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
( o# a' L; W* c$ J' K8 H   {
" k6 q" o7 r4 ?5 x* Z. E     IWbemServices *pWbemServices = NULL;7 Q2 g0 n6 Y; j8 ~6 F3 Y
    WideString wsNamespace = (L"root\\cimv2");' G. Y, D+ l% b( N
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)5 R: Y5 p- G- |, k9 p
     {
: T( p, _0 e$ F2 b1 t        IEnumWbemClassObject *pEnumClassObject = NULL;
6 j+ ~% T8 H" A; \4 @% e" ^        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;; ]8 C* a. B1 D
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
  y2 l0 l7 B: ~0 W6 f# C1 }         {2 J# R: Q- D; O1 l+ R5 ^) D
          IWbemClassObject *pClassObject = NULL;
% ?- V. ^) u. D( e           ULONG uCount = 1, uReturned;
8 G4 A% h4 J: y( R( p6 |" f3 f           if(pEnumClassObject->Reset() == S_OK)  N$ z7 W: S  H0 H3 C4 S
           {
" y3 @5 ~' @7 B, Y8 w              int iEnumIdx = 0;
/ D! p& I" g- b              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)  k2 |% z/ I7 J1 L* @
              {5 E# J% z7 J& x
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
* a# @" h6 n% \) Y# o3 v  n! m: Y5 u1 o2 K3 ]; F% }& q% h
                SAFEARRAY *pvNames = NULL;  E) r0 {, U; E( G# b8 p( d
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
2 V0 p8 X0 C; j; |8 T                  {: N  R4 \1 n& T' v5 d5 ~+ b* {+ v
                   long vbl, vbu;
9 {6 C) S6 ]* v8 ~" o% C1 u                    SafeArrayGetLBound(pvNames, 1, &vbl);
. f9 U$ x6 `6 E# L                    SafeArrayGetUBound(pvNames, 1, &vbu);
( ^* ~: t3 Z; N: S- ~* K                    for(long idx=vbl; idx<=vbu; idx++)
+ _( w1 U% O- O- [- |+ I                     {0 `$ s5 v+ T$ u/ l
                      long aidx = idx;; ^. \& N. _9 _) T" ]$ r
                      wchar_t *wsName = 0;
, R1 L' \1 A: R" e                       VARIANT vValue;
* z5 Q8 `  Q( t- u- M2 t                       VariantInit(&vValue);
% F. q3 k9 ?6 T) c! I$ B( a& W                       SafeArrayGetElement(pvNames, &aidx, &wsName);
! P! B: R$ G& {" F* p% D7 w; M% \
" x) Y9 o" Y% p, R/ E% P7 A' j                       BSTR bs = SysAllocString(wsName);
1 d( W+ b( B' v* M, [# J; n; e                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
: g- `, H9 D& B* }: H                       SysFreeString(bs);, }, u& n- m) J+ a' c
* r4 B* F2 c, i3 B. a: w" h, s
                      if(hRes == S_OK)
0 E2 [) N7 q/ v# `0 ~                        {- y' R* F) z% c: j& y# f7 N
                         AnsiString s;4 `) J0 C; g. m2 J/ H/ u5 B
                         Variant v = *(Variant*)&vValue;
: w/ {0 T: Y5 r4 s. o) C                          if(v.IsArray())
2 Q( f8 S# }% f2 ]: l2 F2 O                           {
5 \  e4 I- z) n/ q0 m4 h                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)( A- X: F6 C9 I3 ]- H# }8 j! E
                             {
& k: f, Y4 v2 s$ T3 N$ X5 ^                                Variant a = v.GetElement(i);" E4 b" |9 _) o1 ^. s8 c8 h* n" x* m# X
                               if(!s.IsEmpty())
% @7 P4 v, `3 ?7 f; ]4 Z" {                                  s+=", ";! n. ^# [5 K$ ~9 j. D
                               s+=VarToStr(a);, j/ @: D# X4 `& z3 V. }( Y& J$ Q/ Y: J
                             }" `1 Q0 P/ r5 X3 x
                          }# s2 T: l( b2 D$ u5 u! S
                         else
0 P7 u0 E- R& n9 U                           {$ r! z. V4 o$ y" b, M. `
                            s = VarToStr(v);$ }5 I) }$ k  r) l8 G
                          }
8 X0 g& k; F7 x                          lpList->Add(AnsiString(wsName)+"="+s);
- J7 W0 X2 Z2 S/ m0 R0 j0 A" Y/ P                        }
( X5 |1 Y. F+ _. X3 D
1 T1 y4 s& f; {: _4 F3 B5 z                       VariantClear(&vValue);' n# e3 [- C' v0 I8 ^7 Z, v/ j% ?
                      SysFreeString(wsName);6 d$ I6 V" b. R. [9 t
                    }! I: w( x( Y; F& [& O
                 }0 o  c, Y) G0 z+ H- `$ ?! Z6 \8 f
                if(pvNames)SafeArrayDestroy(pvNames);
; v1 n/ G% H. k, X                 iEnumIdx++;
" p9 c! ]5 k/ m/ Q! Y  p1 O               }
. z% u9 i) Z# z            }1 Z  q1 j% z" `- P7 @
          if(pClassObject)pClassObject->Release();
4 F$ F: A" A: I) S. ^6 l         }$ b5 j! P2 K1 H
       if(pEnumClassObject)pEnumClassObject->Release();) L- C6 v; N) I0 s4 @
     }
) P7 |5 Z8 C" @/ P     if(pWbemServices)pWbemServices->Release();3 e6 `& t3 U6 c$ z/ H8 \9 h7 M
  }: p- M3 k2 @& h1 }. A* x) e% I/ O
  if(pWbemLocator)pWbemLocator->Release();
( J& U) h. I6 d8 P  I5 M$ I}, h' `/ w# n  @5 ~  C. P3 ?" D
//---------------------------------------------------------------------------
$ |5 ^2 F  m/ \) q% ~( F8 |9 L( _" L) l' m& `1 J
// 通过 WIN32_bios 获取 BIOS 信息:1 a8 d$ V4 J  y/ K0 X1 r2 ~- }4 ]( y
void __fastcall TForm1::Button1Click(TObject *Sender)+ _' I7 y8 e. E; ?
{/ z7 y7 W+ F: n
   Memo1->Lines->Add("================== [WIN32_bios] =================");9 }# H& y  z/ G! m' f8 M
   GetWmiInfo(Memo1->Lines, "WIN32_bios");- i1 y6 N' a' u5 ]4 Y
   Memo1->Lines->Add("");
0 o8 G& Q  V% E' f3 z}9 ^/ z9 X2 H% h, @  r2 N9 K) l

3 G! [9 V& i4 }" Z5 O--------------------------------------------------------------------------------
% R7 H) W( p8 G8 M
2 S4 b+ b/ T  d5 tWMI 可以访问的信息类型有:* y( U% G# c. R9 ]. Q  ^' S+ V  A
  Win32_1394Controller
$ t" N. L0 ?6 K2 W   Win32_BaseBoard9 G- B% K/ q8 w' u- Z6 u, O
  Win32_Battery. N: z5 Y: m: `. L. S
  Win32_BIOS
6 a: W4 o, u% Z9 v# A   Win32_Bus
6 i1 |+ `* G# l. @( i   Win32_CacheMemory
% m' Y1 ~, _7 P2 |4 j+ E   Win32_CDROMDrive: E3 u2 `- `- F/ O% M
  Win32_CurrentProbe
6 a$ Q6 g4 C7 H( X- D1 _   Win32_DesktopMonitor
; z5 R4 B1 V, ~( h/ C' X* g4 F   Win32_DeviceMemoryAddress
! Z. h; x8 q  A2 Z   Win32_DiskDrive1 _7 _( f5 R/ N$ `, I
  Win32_DisplayConfiguration- O2 S. S$ W/ z5 m2 j
  Win32_DisplayControllerConfiguration* P1 x1 D: t5 h# `% P
  Win32_DMAChannel
+ c- T8 A& P6 ]' m. G1 k8 \5 J   Win32_Fan; q4 q: X, g7 U# z5 y6 }7 K- e" y4 b
  Win32_FloppyController  h- I# z4 C* X1 q/ Z
  Win32_FloppyDrive
4 b: q4 E+ W0 Y3 e   Win32_HeatPipe
" J1 ]' \' l( |  Y" n; \4 ^/ k   Win32_IDEController6 R/ x$ R, J5 x# i$ ^' E
  Win32_InfraredDevice8 e5 M* }2 Z5 y
  Win32_IRQResource
6 O9 Z$ \" f" p' B5 D% x   Win32_Keyboard
% f' [1 y; {- _- v. g' [' T9 @   Win32_MemoryArray
( m) {' l) D  r! ]' r4 X' s, @1 k6 Q   Win32_MemoryDevice
- a% V3 J9 [# z' ~   Win32_MotherboardDevice9 v9 c8 {; q& p4 P, u; J* v6 n
  Win32_NetworkAdapter
2 V/ ^' a) ~/ `2 \* d   Win32_NetworkAdapterConfiguration
1 [3 o0 H9 S* r   Win32_OnBoardDevice
8 d& k0 k$ b9 V$ o# P/ R   Win32_ParallelPort
  ~: L$ z: X3 C/ B! Y* q% X9 `   Win32_PCMCIAController
$ I! Q2 a' y! K: f$ Z6 f   Win32_PhysicalMemory, Y3 c5 b' C# A( L+ U3 |
  Win32_PhysicalMemoryArray& H: ?. I0 a8 ^1 H% B/ U
  Win32_PnPEntity5 D' X" o  u# T* x, D  T/ q
  Win32_PointingDevice
2 l4 q2 ?& I0 @/ D/ l   Win32_PortableBattery4 L1 l1 g8 ^% F8 Z$ k2 `7 @
  Win32_PortConnector
. L" r4 v+ r" J, s  o, @   Win32_PortResource0 ?* A! A' v1 _
  Win32_POTSModem
, m! m7 i$ `; b/ o" b   Win32_PowerManagementEvent' `9 b7 _8 z9 z9 j: ^/ {- f
  Win32_Printer& U' d. Z: [- z- p& u. ?3 Y5 s
  Win32_PrinterConfiguration
: v" g4 |" h5 l7 G4 n' a   Win32_PrintJob
" N' P& M/ n4 P; s: \   Win32_Processor. B) ?& p* E4 T/ e
  Win32_Refrigeration# h: e; X1 Q* p1 e
  Win32_SerialPort
( j5 p1 L* V! Z  B+ d   Win32_SerialPortConfiguration$ Z" N  k. z1 s9 Q
  Win32_SMBIOSMemory1 _  S8 x6 H9 D: v" A2 g! H7 q2 }+ [' O
  Win32_SoundDevice
1 l; f2 D  F/ G   Win32_SystemEnclosure
$ R) G# G8 q" T( D# E  f) s   Win32_SystemMemoryResource, E- X2 K0 P) M: m4 D# t
  Win32_SystemSlot
9 J. K) Y7 r- [! ?- w0 ^6 F   Win32_TapeDrive5 d0 h) D; Q* e" q# D+ N
  Win32_TemperatureProbe7 x1 ]) O7 K7 j. |
  Win32_UninterruptiblePowerSupply% X* O4 P, L+ ^8 ?
  Win32_USBController
1 k5 U0 X* u! W3 y& q   Win32_VideoConfiguration! \0 e) E  @, d* |1 Z+ S. v) |
  Win32_VideoController
3 M* e% r) P' Z# |2 C4 X) l$ s) X   Win32_VoltageProbe
7 S: [# h2 P3 b3 y* T  r* `0 ~! Z  K7 o0 X) M6 |2 |$ f
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-19 04:46 , Processed in 0.019843 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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