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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)3 @. j' f6 M" G6 Q

4 v7 F, E" ?+ G$ A/ q& b( _0 W/ ~  U) U# M: R4 j
--------------------------------------------------------------------------------
/ |$ Q6 N6 ]( e$ xWMI: Windows Management Instrumentation (Windows 管理工具)$ b( h% q5 ^# f* U. c" v3 _
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
8 y* n/ s+ F/ B5 S8 B3 I# J   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
4 p3 P" s+ K/ F: [   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
) W6 f0 C" F, K$ e& Y( ]* Z& H; p) ]/ C& m( P% \$ L
--------------------------------------------------------------------------------
; I! D9 @' @1 ^  Y, b: S" e0 }* j2 HBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面3 R9 o$ G3 ?/ s. E% K6 k
" T  A5 A. @' z' b' B% h8 T
--------------------------------------------------------------------------------
' u1 k% A3 W- _" W8 M$ k① 初始化 COM 接口:
. x/ I6 x+ S: L# C" O   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。4 {; A% j7 c8 k; _% W1 N
  这两个函数在 #include <comdef.h> 里面定义。6 m9 h: H- z1 `+ C3 n( ^

9 P  k" P) \3 j7 J② 获取访问 WMI 权限:) w7 a: {$ E! X6 U% G. E) Y
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
. O$ Y) B$ y9 |- P  I# e/ M& ]   如果这个函数返回 S_OK 获取权限成功, 否则为失败。- X: o, x( I2 w- V( Q% c# S6 J: m& _
2 q7 V* j) E+ t$ o: d1 D0 E4 I
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
5 e& r" P! Q, o   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。& I0 G/ K; d* o2 [7 ~4 K- O

6 l  `. F$ i1 k$ m1 j, @  }void GetWmiInfo(TStrings *lpList, WideString wsClass)
! k9 Q/ i0 q) p  V+ s- a{4 h: w2 M. R, T) M- x
  IWbemLocator *pWbemLocator = NULL;( g) |, O& ^0 m) f4 S
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK), [1 W' [4 `7 v
  {
: M  D3 B& X0 F! @/ f     IWbemServices *pWbemServices = NULL;
; s4 a) t1 [' n  [; h     WideString wsNamespace = (L"root\\cimv2");) j/ f* x* w, w5 I2 d4 L# j
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)# f, f8 U8 ~, M& z
     {6 C5 H  ]# M. Q* U7 i' ^
       IEnumWbemClassObject *pEnumClassObject = NULL;
9 W3 d& R0 h  ~( f* O+ M0 Z        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
6 r* d# ]/ s+ I$ @/ i        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
4 Q* G" {1 \. O- v$ C: O. f. Z         {
5 ]. W, M+ X& F5 ?- c           IWbemClassObject *pClassObject = NULL;
; I$ N, p) r6 d0 u4 _/ Q           ULONG uCount = 1, uReturned;' r( G" h9 d0 Y" ]! W
          if(pEnumClassObject->Reset() == S_OK)
+ `- [  y* E2 M, X1 O            {
1 P& {, U/ ~( n' @  X  P9 O              int iEnumIdx = 0;
; a% G' K6 r/ K( Y: \5 q              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)! j+ S# q- [' C) p$ [# H! V
              {
. n# G/ a  t1 J8 W: m; o) K                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
# u: V1 e  Q! s2 n
8 t/ k6 `2 r4 _3 \4 v! f% l                 SAFEARRAY *pvNames = NULL;- H- L/ i! O1 R" k7 P
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)2 x' o! l  {, Z5 E; S* a
                 {
; [7 L$ c& ^+ d0 q9 I) }* ~2 K! O                    long vbl, vbu;* Q) i' i$ h3 B9 U) K. l$ T
                   SafeArrayGetLBound(pvNames, 1, &vbl);
# [6 a; w5 Q( R! [5 |- u                    SafeArrayGetUBound(pvNames, 1, &vbu);
9 H- Z  ], J/ ~                    for(long idx=vbl; idx<=vbu; idx++)' d2 k6 Y# v, k
                    {
% h' P9 `: G* U- c7 i1 J/ Q! d% J                       long aidx = idx;
; k$ A) `% U7 {  ]4 q! U/ D                       wchar_t *wsName = 0;
" u, h, ~. j& y5 I1 B" r                       VARIANT vValue;! i7 Z2 N3 _5 c0 M8 h7 W
                      VariantInit(&vValue);
4 r' G5 _0 E* c                       SafeArrayGetElement(pvNames, &aidx, &wsName);" c. l1 a' t3 E7 y6 E

; X0 o- D  d! C" |# ]9 ~, q                       BSTR bs = SysAllocString(wsName);  U  G  K, K1 X, y/ U3 c
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
. t4 n/ Y0 w6 ^7 e                       SysFreeString(bs);/ G. H/ `$ P% D

0 J/ Q$ S: e& \; F# ]                       if(hRes == S_OK)' \4 s! l# K. P" ^8 L
                       {
. C4 u% }: h; [                          AnsiString s;
; z' L& e4 D+ S. C  N2 @, E                          Variant v = *(Variant*)&vValue;& O, p* U2 b4 s. r) ~$ _4 I
                         if(v.IsArray())3 g  T: u9 w8 c9 ]
                          {
  g2 L# Q* m: X' E                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
6 A. g2 c+ M6 N& v                              {1 v4 x" x" D" k8 N- e8 N2 B
                               Variant a = v.GetElement(i);2 _0 K/ Q. y# Z( ?5 T2 o/ y
                               if(!s.IsEmpty())  n3 U9 i" [9 T3 p, X
                                 s+=", ";
4 }' C9 S- ]) W/ A& j0 N                                s+=VarToStr(a);/ ~) K4 y& Q0 T" T
                             }* X+ ]6 }  {* p* i
                          }2 E1 y+ Q% x2 N3 O, c3 Y5 E1 B$ {
                         else
, t6 p, a! P, \! p. v, j4 o3 h                           {
- @9 |( T$ H  q                             s = VarToStr(v);
. H6 s/ x, Z: ?$ y+ Q+ Q: n                           }
$ J: @) u9 y9 e' U; T2 j$ ~3 J) V) |                          lpList->Add(AnsiString(wsName)+"="+s);1 t: a( b- t. }0 o" ~! x: ~- q" s/ Z
                       }
/ F+ k) d9 u& q* M, J
$ R/ O7 ]$ g# u+ e, q& H8 q2 p  O                       VariantClear(&vValue);
9 L+ A. A2 J# Q5 d. b6 x, I8 ]1 e5 @( o' \                       SysFreeString(wsName);9 O8 z' {/ e2 U# P( j: c2 ~
                    }
6 ^9 s: ^0 \; k3 ~3 w( \                  }
; S4 ], b* i8 K- ^7 \* R) F( ?5 B                 if(pvNames)SafeArrayDestroy(pvNames);- I9 x2 \6 y! u3 ^" B! c8 t7 n
                iEnumIdx++;  z  ^4 a7 K6 Z) w: r
              }) [3 q8 I; ~. O6 ^6 |% L" d0 e
           }
, ^* r; W* Y$ C! P8 ^           if(pClassObject)pClassObject->Release();' u& F; Y, G8 w& N. ]  Z
        }& X6 ~6 K! h9 R) l; B4 A
       if(pEnumClassObject)pEnumClassObject->Release();
9 y+ h$ Y0 p# B$ Q      }
$ s# l& |) G# B0 `, b% U8 m     if(pWbemServices)pWbemServices->Release();
7 @0 F5 t0 L/ f) E, M! B' e   }
. A$ Y9 Z9 A% f, a- U4 O$ S  if(pWbemLocator)pWbemLocator->Release();
+ p5 x8 |+ w6 o! \}
! K# O. }0 s& j; f//---------------------------------------------------------------------------( A9 r( I4 s% J- I

! b+ }# u( Q0 L- c! w// 通过 WIN32_bios 获取 BIOS 信息:6 I/ s, c+ X7 W; ?. ?: X# p* Y
void __fastcall TForm1::Button1Click(TObject *Sender)
2 ^8 m% D( j) ~4 k# {{
. R1 b3 @) D" o" K# R( r    Memo1->Lines->Add("================== [WIN32_bios] =================");
0 m; ^* w8 I4 m' }    GetWmiInfo(Memo1->Lines, "WIN32_bios");
1 x+ Y$ q: `9 j- g' H. u' S- n    Memo1->Lines->Add("");
4 A- h2 A" A9 L/ I- w. v}
1 X/ G  k( p. _( J6 j2 g8 x( w/ x$ v
+ ^" ?' \; g7 O# z--------------------------------------------------------------------------------% L) h8 j: W7 r( y
. k* o" T$ n& A* p
WMI 可以访问的信息类型有:# ]4 Z$ E1 G, j1 ]
  Win32_1394Controller, K# e: y1 `% g6 G" F3 F
  Win32_BaseBoard
, I1 L* h% c. W- O0 R% r5 u7 q  D   Win32_Battery+ f) _$ K4 L6 p3 H( X0 I- E
  Win32_BIOS& ^; D8 q) v+ \. S0 D6 w
  Win32_Bus0 t0 v2 K/ H$ M. m/ C. Z! B6 D2 m
  Win32_CacheMemory+ O$ C. s5 \" R
  Win32_CDROMDrive8 n+ p! }8 L2 w- \! ~, u4 H$ `
  Win32_CurrentProbe
4 K& {* `5 z/ j' o" T  N   Win32_DesktopMonitor
! ^' V: N% e! c6 G! @+ ~; N4 m   Win32_DeviceMemoryAddress
/ t' w! z9 O+ y/ i$ ^( S( z   Win32_DiskDrive
  j9 k" ]; V4 N! k& q4 e& i   Win32_DisplayConfiguration
! x) q: B6 g: b9 `' r$ ]4 ^& T   Win32_DisplayControllerConfiguration( V$ ^# Z# v- ?' X1 ~7 W$ ]; M
  Win32_DMAChannel
+ U% j: \% H/ r: @( D0 J   Win32_Fan+ H1 I' K! ]9 r; p5 n
  Win32_FloppyController
) l, y! s3 u! E+ _' _   Win32_FloppyDrive
. t* N8 k( C) P6 k- ?6 B; h1 M( z   Win32_HeatPipe
9 ]: a. d  m# B   Win32_IDEController6 S- ?/ @. e# D
  Win32_InfraredDevice2 U) X, Y( L" ~2 A5 u
  Win32_IRQResource
& N+ Z* j" W; @4 V$ P5 ]   Win32_Keyboard
4 l% I; _2 }5 w   Win32_MemoryArray
8 U2 |; S6 X8 z   Win32_MemoryDevice; Z2 r* l. F. J4 J; w9 u0 z
  Win32_MotherboardDevice* g+ s! e8 @' j0 r
  Win32_NetworkAdapter
5 C; r; V( P4 F# O( F5 B   Win32_NetworkAdapterConfiguration
% P  u4 M( D3 o* d3 a   Win32_OnBoardDevice
4 G7 Z) v8 }3 R' {! p: Y   Win32_ParallelPort
& P5 M" r8 c: c6 d' e   Win32_PCMCIAController/ |8 r- Y% z& K0 s. k# B
  Win32_PhysicalMemory7 D% m* W0 f% a# x+ H
  Win32_PhysicalMemoryArray
: F4 p: c( m  R& C' O6 W' O" E$ h   Win32_PnPEntity
( A( R2 g1 F4 w5 R; T/ {1 G   Win32_PointingDevice
# Q  V! x: o5 O) z5 Z   Win32_PortableBattery* S0 i: U3 G- L4 l
  Win32_PortConnector
" m% T. [0 w" G* Y% x! k   Win32_PortResource
+ |+ h. i; X% R4 u   Win32_POTSModem$ p! j; g! J! H' g3 [4 }2 ]* G
  Win32_PowerManagementEvent" k8 {+ A# J, @( U2 {$ y( [. Z
  Win32_Printer
) {! W  Q+ U; R8 G4 Y3 Y   Win32_PrinterConfiguration
( i- \; G5 o) Z. ^! l   Win32_PrintJob
' U" m, i+ _8 d* y   Win32_Processor% z- B( \; X/ p, C) o" ?; }
  Win32_Refrigeration9 ^* Z- ]6 M4 ]& C0 B. O4 z! @
  Win32_SerialPort
/ X( J, _8 O& t; l+ b( W   Win32_SerialPortConfiguration) m* a1 y! r7 z3 i) V& b8 i
  Win32_SMBIOSMemory& A2 u  q6 g1 J1 p; y! \  i* V
  Win32_SoundDevice
/ ]* j2 x' G1 ~: x9 c) |- V/ g9 d   Win32_SystemEnclosure" m: ?+ j# X: H! F
  Win32_SystemMemoryResource
, |! L( _5 n) l: ]  x+ Q# u   Win32_SystemSlot
. G& m. E( b$ d% T! a  M/ S- |   Win32_TapeDrive
- K  v: g7 w% X4 q: j: j   Win32_TemperatureProbe
+ Z2 B0 R& N0 x7 _) F9 m   Win32_UninterruptiblePowerSupply5 H5 k$ u2 x& F( }) `
  Win32_USBController# {" E7 d; }( _% V& q! x: c& t% P
  Win32_VideoConfiguration
" O  a! {: S- i( i. K  N) c2 @   Win32_VideoController7 F  V1 ], J0 D+ _  i
  Win32_VoltageProbe+ U0 g7 k0 l' N7 y! n
9 a8 L4 v' Z6 g5 @( [4 [7 R
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-27 16:31 , Processed in 0.017758 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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