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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)+ i* d) b/ j9 ~" s

( s) S9 n  z/ c) c
3 P6 \" S; Q! p) E+ z6 r/ h1 j. O--------------------------------------------------------------------------------
: F/ ?' F# m3 a" f1 b8 Q1 CWMI: Windows Management Instrumentation (Windows 管理工具)
0 P* [, e5 b% c) i) [& i- ?   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 9 j2 u. z' i( V/ ^' v
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
1 I0 J/ @! |. \3 ?4 l   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 3 H: U, t: X, \$ \
& |# Y, I: x  ~: {+ l  n4 K
--------------------------------------------------------------------------------" y; N6 b  [/ H0 T# K6 c
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面; b8 M; s& B/ i$ [3 K+ D
5 i, U  b) v$ T
--------------------------------------------------------------------------------
/ W( f- i4 B7 N* }  a6 ?① 初始化 COM 接口:
. J$ x3 q8 s: w% J9 J! h- k   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。9 R( w/ T! j" L! v
  这两个函数在 #include <comdef.h> 里面定义。
% X0 J( v- d! n0 \" p
8 e# o  q! G& P2 }& @% R② 获取访问 WMI 权限:4 D' ?; K, ]7 M8 b7 _
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
/ G0 J# V$ h5 o- u* {$ o/ B) A   如果这个函数返回 S_OK 获取权限成功, 否则为失败。# U# R  m. C# J3 [$ q1 V3 h
2 W! q8 o( p5 N1 B) t
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:2 T# W  \8 f; K4 \/ x
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
; f" U3 ~" Y  d# g: m% X+ ]9 T- T+ z! j+ w7 v4 P
void GetWmiInfo(TStrings *lpList, WideString wsClass)% k& _0 J9 y' K
{
# T; W0 q$ j2 t( g  IWbemLocator *pWbemLocator = NULL;
/ v! w: K4 s8 c8 T4 R5 r$ M  T  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
3 I% }9 l7 u! V, p+ d; p. k   {
" U& c' l- I1 n1 Q/ G+ {+ O     IWbemServices *pWbemServices = NULL;* A& w( s: o6 h3 B
    WideString wsNamespace = (L"root\\cimv2");
9 `- V  w7 W* v0 G7 M! X8 E. x     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
3 V9 h2 @& D- w      {
7 v! X3 Z" J* o6 W0 A* e0 N$ g        IEnumWbemClassObject *pEnumClassObject = NULL;
3 u3 W9 ~8 ]4 W3 l' l3 Z, r/ I        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;9 h2 e) k, u; x
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
, z' k- _% |1 F" i; B         {
+ v! Z1 S) y. j: |0 G           IWbemClassObject *pClassObject = NULL;
# a7 I, M$ ^3 R" l+ ~4 T# i           ULONG uCount = 1, uReturned;- P+ d: h' J& L2 p$ R3 t
          if(pEnumClassObject->Reset() == S_OK)0 X! @7 w' _% H; E, M$ v
           {" @* g1 E9 Z! c9 N5 G9 F9 w
             int iEnumIdx = 0;
. t. ?. N) _9 V              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
% c$ k, m" l0 o' n* O; i               {
1 Q/ ?5 \0 }' y- H# F                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");( {7 }/ J9 i$ X, D, Q
# P# W# t! C, o9 i2 `7 P+ B
                SAFEARRAY *pvNames = NULL;
* r5 ?( D1 x. _: o3 E" L                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)3 H" J. S6 m) ~- \- L9 L1 o# G
                 {
1 }4 u, m2 n! ]7 D                    long vbl, vbu;
, K4 m9 ^& S3 v& O" x                    SafeArrayGetLBound(pvNames, 1, &vbl);& d5 L. S/ J- r( W- g6 [' G% A' k
                   SafeArrayGetUBound(pvNames, 1, &vbu);& f9 Q' k8 x- ?3 R# ?) z7 K
                   for(long idx=vbl; idx<=vbu; idx++)$ p' Q/ R2 Y; r. j% Z
                    {
6 d4 t2 V" ]! O" m- Z4 z9 E                       long aidx = idx;
" n0 ?7 g' m, P* ~+ L5 ?                       wchar_t *wsName = 0;+ G; v' N  v) o0 r, r; G
                      VARIANT vValue;
0 p- F9 t' X/ v                       VariantInit(&vValue);
. c. m: Q* Z2 [! i* L% s                       SafeArrayGetElement(pvNames, &aidx, &wsName);
* u" r7 V* E0 o
* E2 G1 H, N/ Q, b# p8 h                       BSTR bs = SysAllocString(wsName);4 \) B7 [1 f0 N) K% K* {
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);9 @8 K7 I5 ]' \" l* A) n
                      SysFreeString(bs);
, Y3 W* P# A& M, z' D% |# o- \, M
8 H2 X9 U& S6 S5 ~- V& B  |) r& p                       if(hRes == S_OK)
9 S- `5 d# g6 D' R) H                        {0 }. e  a# G5 Z
                         AnsiString s;4 k' ~/ ]8 k; b  \. P) N" N
                         Variant v = *(Variant*)&vValue;& z' c  G2 H: d& J" Q# ^
                         if(v.IsArray())' h2 G( L* j; T$ u  D
                          {
* W* G# y, W+ @' ~3 n                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
- f% \: H$ @- X" j; d) K3 q" m1 x& s( ]                              {, ~) `9 d, ~: k' |; f* n/ w
                               Variant a = v.GetElement(i);
& \1 R$ H4 ~' y                                if(!s.IsEmpty()); t+ V2 v* l6 V
                                 s+=", ";
# p' o5 V% S4 R+ K. u                                s+=VarToStr(a);
" v/ L9 {( D, B6 G7 V' j; f$ b                              }
2 _' D' D* d+ u5 O8 c  }. A9 e                           }: B5 J# y7 y: S- X- t. U
                         else& J0 ]( g/ Y. E/ v0 U
                          {% c! ^) m' S- F( t9 S  Z3 C
                            s = VarToStr(v);% [3 T* O& `8 l' [' i, H1 G3 o# m
                          }+ d: G# D' r$ P5 y. b
                         lpList->Add(AnsiString(wsName)+"="+s);
, j* t. m( T( A5 Y8 t" _9 R! {  `7 o5 K                        }9 d# [. j2 H( p2 N6 [: J

% d; R# K2 v$ h* z0 m0 ^                       VariantClear(&vValue);
4 L! H8 ]( r% j% e/ X1 G; \% r                       SysFreeString(wsName);
4 U2 k& K: [3 A! ]6 }, V                     }
5 y. R. w6 p; ?9 \* T2 B                  }
3 p; D2 B- E& U8 K$ N                 if(pvNames)SafeArrayDestroy(pvNames);
( D: s  X. O# a* L; ]                 iEnumIdx++;
; V+ y% V; N5 L- I) ?- l4 F               }- Y3 Q0 ~; n- w9 X* U, x
           }  t/ U* U; z& Q7 Y; I$ U
          if(pClassObject)pClassObject->Release();
+ |9 `8 N: |0 {) O. T         }
6 b1 ?; I. V+ x$ q; D$ X, o        if(pEnumClassObject)pEnumClassObject->Release();
6 d& ?1 e" F8 O7 |      }! ?% y& V  _  ~5 d# ^& D
    if(pWbemServices)pWbemServices->Release();
, _: z" C, L3 E; a4 a   }
% M& }, M& Q. S: Q; }/ x  if(pWbemLocator)pWbemLocator->Release();
4 Q2 `, D0 s0 `3 g$ `8 O1 h}
. M- F1 `# B5 K5 r0 V//---------------------------------------------------------------------------
1 l0 ^- [! P& y& |. m. ~) m0 |  s5 c
// 通过 WIN32_bios 获取 BIOS 信息:  Z. u7 z  o% v4 C/ v
void __fastcall TForm1::Button1Click(TObject *Sender)
! W% A- K' ~, O5 M* G2 d7 V6 Z{. ~1 [' Y( l4 n& u
   Memo1->Lines->Add("================== [WIN32_bios] =================");4 G. J8 k* A) E0 j; A
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
( W8 d6 K! Z- ~. D# H  S) @1 j    Memo1->Lines->Add("");
4 m4 v: g6 o+ n4 {% T+ q! A}
6 v9 q( @: V/ p7 s) N6 b( M
9 Q& h1 g+ a  n% g--------------------------------------------------------------------------------
' \2 J; W: A6 E' k8 G  E9 w& y/ o; o9 F- B& a
WMI 可以访问的信息类型有:3 S) k0 x  U) w9 _" ?$ P; c7 Z! `
  Win32_1394Controller/ F* ?3 c6 _. x/ j6 j" B  j
  Win32_BaseBoard: w( A9 d) Z  ?5 ?7 S8 G
  Win32_Battery
6 y/ v# f) I& c. h  z  r) \. V   Win32_BIOS
* {( @9 O( }5 b: X- ]& ~  ]! V- n   Win32_Bus" \$ l  X+ Z1 Y& f5 j. Z
  Win32_CacheMemory
- S: y& E8 d7 B2 b9 _# q   Win32_CDROMDrive
/ O( [/ ^. _  U. S* z1 L   Win32_CurrentProbe9 S/ p" ?; \* \, j4 k* }
  Win32_DesktopMonitor  T% q! c, l7 M- X
  Win32_DeviceMemoryAddress3 `* e" B& |* e
  Win32_DiskDrive0 N: J3 S0 K6 W: P8 x% l9 D
  Win32_DisplayConfiguration
2 y  E/ ?4 f, L3 H3 c: X$ ~   Win32_DisplayControllerConfiguration
9 A1 K. [/ E& V   Win32_DMAChannel0 Y% E( R; }. Y5 u4 |5 o
  Win32_Fan' m9 a5 J4 Q2 d
  Win32_FloppyController+ b4 T- X, w: ?( }6 ^+ |
  Win32_FloppyDrive) ~$ s3 i8 v; z1 m/ n
  Win32_HeatPipe% O) b3 Q/ P! s) e& x. j
  Win32_IDEController+ V! J- {+ M% a6 {+ ?+ d9 x' Y, v
  Win32_InfraredDevice
6 G( t  p8 H( h   Win32_IRQResource
2 A6 n7 [( C! {   Win32_Keyboard& K4 A/ u- _3 F* t
  Win32_MemoryArray
- E! Y5 U3 g! m9 p' N   Win32_MemoryDevice/ @, Q3 K' j, \7 M- |! n  f
  Win32_MotherboardDevice
4 [8 L' w$ f" Q# e! ]6 v   Win32_NetworkAdapter* h2 X4 M8 D3 U- v- J% `3 _7 s, m" R" \
  Win32_NetworkAdapterConfiguration
7 \& B1 u4 T0 x: e; c; [   Win32_OnBoardDevice& u# {9 u% g; N2 ?/ E& b% _1 u
  Win32_ParallelPort  F8 }- k1 O. _
  Win32_PCMCIAController" w' |, }) c/ v/ G, V2 [
  Win32_PhysicalMemory) T6 K1 z6 a5 J' x& y
  Win32_PhysicalMemoryArray
( b) i7 b/ \/ c! F: X  M   Win32_PnPEntity" R" W$ P3 Y! G0 {! Q, A7 N
  Win32_PointingDevice' Q$ A" J$ ^! `( ~$ R3 J7 O
  Win32_PortableBattery
- m4 a' |; ~( z  A! k( J4 l* X   Win32_PortConnector7 C% S# z& V; q3 I& ]9 l
  Win32_PortResource
" q5 Y7 S0 Y( b( K% v   Win32_POTSModem
8 R+ D! b( F5 L1 J   Win32_PowerManagementEvent# e1 P0 h7 r5 r: |% B
  Win32_Printer, U- W. _! Q/ H  Q* A& z' o3 X
  Win32_PrinterConfiguration
! i( X* ~* [! h! w8 f$ Q7 }2 v+ d9 x   Win32_PrintJob+ q* s. Z: P1 `9 i4 Z6 A
  Win32_Processor2 R8 t) n  n5 K: d: J+ y
  Win32_Refrigeration9 ?; l1 d5 k: X7 ~* \5 t7 |  q
  Win32_SerialPort
: O6 ~; T0 N2 Q4 @" @/ k   Win32_SerialPortConfiguration
8 p* {% M- `- J: |1 T& W$ O% e   Win32_SMBIOSMemory
! ~7 s- C$ C% ?9 T" B   Win32_SoundDevice
2 Y1 D5 t) B+ [) G   Win32_SystemEnclosure3 n, h2 A& N& y- w' T# @
  Win32_SystemMemoryResource
1 M" N0 S' U! A2 P- T! j   Win32_SystemSlot
" X1 Z$ l% |6 p& t   Win32_TapeDrive
, `5 |  }2 x; o/ d* {3 b! H   Win32_TemperatureProbe* y7 r4 G2 D! f# H6 N/ q% `% {
  Win32_UninterruptiblePowerSupply
$ l9 {6 v0 Y9 H5 v' y6 z   Win32_USBController* _8 ~" V/ m" ?3 l' d' Y
  Win32_VideoConfiguration; ]% P$ x, N- t$ w
  Win32_VideoController
2 z' O/ g( G; l( L! D: ~1 |- M9 C   Win32_VoltageProbe# s) u3 H! a6 a7 b

3 y7 j5 e+ |) [, m) ^! b以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-21 09:25 , Processed in 0.017332 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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