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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
  N, c. [* ^+ @5 H# m7 P) d! c  a! o$ w# h% |0 @
9 B2 I4 o9 _" t* t
--------------------------------------------------------------------------------
/ _0 R# a" J7 y' TWMI: Windows Management Instrumentation (Windows 管理工具)
$ m+ ~4 D/ N% M! k4 O# u: M$ ]   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
& T3 R: ^) y: q6 a& l   利用这个工具可以管理本地或客户端系统中几乎所有的信息。- O4 j7 ^# {$ b& B) S
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 " c: ~3 Z; d. h6 I$ Z* V
' U0 B, J' {1 ?3 ?& f
--------------------------------------------------------------------------------
5 C  h3 H8 o  s; ^- DBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面7 |' t: ?) P2 a7 o0 T( {

0 M' r: u: @- z2 H' n+ `* ?3 l--------------------------------------------------------------------------------
9 t5 f. r3 @0 d7 Y( s/ y9 a① 初始化 COM 接口:
6 A$ t" g: E" C8 {. m$ `9 b   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
* Q! o) g& w6 G7 c; v' W* E. s   这两个函数在 #include <comdef.h> 里面定义。
* C0 ]! W* ^# d" Q1 e5 Q% X! C- `- t% [; n' p; F: M
② 获取访问 WMI 权限:
- F( I0 u1 a( t  s! f* t! ]  C   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);+ J/ j" d) J) M9 i
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。7 J' J5 t" q6 A6 y( q

6 t6 _, d6 ]; G  `* R6 ^( b③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:5 V1 l8 {  }5 I. s( V
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。. r2 w; Y) s0 a0 L& i$ S
& Q! ~1 a- M! a1 K
void GetWmiInfo(TStrings *lpList, WideString wsClass)+ q  r+ _1 d) T2 a, X* q' J
{# x* C! X9 F* N& F' W
  IWbemLocator *pWbemLocator = NULL;
9 N/ x- K9 [9 f, s$ D" x; R  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)2 w- j7 @; u0 q6 ^6 K8 L
  {# c1 ~% i5 Y4 ^+ T/ m
    IWbemServices *pWbemServices = NULL;
+ m- V' p1 s& h8 K* M  o; W     WideString wsNamespace = (L"root\\cimv2");
5 k  [  p6 G3 \     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
# f# S* P' M! a      {
$ h' z7 f# b: X/ S1 ]        IEnumWbemClassObject *pEnumClassObject = NULL;
8 ^" X; D+ r  T        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
. L" d% r+ I- _# \/ J8 Z8 C        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK), t. R  r2 {5 q; z
        {0 e2 l6 M" u( V
          IWbemClassObject *pClassObject = NULL;3 }$ I! |4 f- H% x
          ULONG uCount = 1, uReturned;. X) O& r0 `) Z2 n
          if(pEnumClassObject->Reset() == S_OK)) w5 n$ V$ c: X8 Q! t8 H9 e
           {- n/ S' t  k$ |/ p) S, ?6 }8 h5 z8 A
             int iEnumIdx = 0;" N5 G% K- @1 \* G$ V/ i3 |( a
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)( R4 T. q* E9 T5 k8 C/ T: g2 v
              {* I) c( {; u1 g5 `$ U5 L  u
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
) s8 h" ^0 ^& w/ O0 y# Y0 ]' ]& P
, w/ m4 d( L7 _' @& i0 {) j                 SAFEARRAY *pvNames = NULL;
+ F3 W$ i2 n' l  U# }; x                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)9 g  q: T* H9 S; y
                 {
  v5 Y2 \$ k' |1 Y: I7 D: ~                    long vbl, vbu;
/ o2 k7 c/ Z0 T$ |, h; n. o! ?. _                    SafeArrayGetLBound(pvNames, 1, &vbl);% B7 m# o7 S. A- }" O
                   SafeArrayGetUBound(pvNames, 1, &vbu);! x; q, v1 |6 z  ~( B( G
                   for(long idx=vbl; idx<=vbu; idx++)' Y8 g. W; v  g
                    {" ?% {( o3 F$ g3 h/ G4 r1 p
                      long aidx = idx;
  L4 E6 i5 F" f6 ?9 m$ h# w: w' d                       wchar_t *wsName = 0;
3 ^' U4 u! S  D1 U- W! E1 U                       VARIANT vValue;$ V& G2 D: c, X+ M. `( u
                      VariantInit(&vValue);2 Y! e; U) L+ L8 @0 j7 @' b
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
' D2 C1 }. \. g& P+ f8 ?- M1 h  L7 G* ~
                      BSTR bs = SysAllocString(wsName);
4 i) J- h8 F' c* s. P                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
  d1 S# [! N/ ~0 v, {# c                       SysFreeString(bs);+ q4 o; p. z2 A( F) ~  A( m4 y2 g

: A4 z" x# u5 W5 f% q: |                       if(hRes == S_OK)
5 E4 M8 E$ w5 Y) j                        {0 i- T/ p- t6 r; G# a0 j8 q, `
                         AnsiString s;4 p9 ]0 m" ?, U
                         Variant v = *(Variant*)&vValue;
9 [! n* P6 |2 m+ d( H/ ^9 _                          if(v.IsArray())
; |, \# f& E9 \2 L1 n9 M9 t0 I                           {
# U4 }6 [/ I1 k/ H, C9 O( g, U3 @# l                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)4 d3 k. M1 R: s2 l, N: t# t
                             {
: n7 K$ J$ c9 ^6 C5 n/ I! W                                Variant a = v.GetElement(i);
- V: l/ Y% q2 o  ]                                if(!s.IsEmpty())4 ?( _0 g9 j1 p# w! ^: r, b5 `
                                 s+=", ";
) \9 e* v( ?3 M# w6 J$ c                                s+=VarToStr(a);' V( R9 ^! K7 q; Y8 ~  x) d
                             }
5 H7 U. r* k4 q8 \" r                           }
7 o8 }8 b4 M  H( G" n6 D. ~( Q: o                          else' m5 e2 a6 y& Y% z# B& ~
                          {: a% M* Z/ g% t0 y
                            s = VarToStr(v);0 j) N* f" d3 y; O( O9 g# p! b# q
                          }# y8 [' v4 A9 E
                         lpList->Add(AnsiString(wsName)+"="+s);4 o' N0 c  W9 {6 I* F9 k. u, H! n, o$ p
                       }' B- _+ }9 B) R) T+ F
0 _5 ]$ d/ Z! M6 V
                      VariantClear(&vValue);3 _- R: f3 J" N9 O4 a
                      SysFreeString(wsName);
9 O2 y. q& s; A( i/ V) @                     }
5 n, h& P( R3 d0 H: q8 {8 k                  }3 p2 `7 N0 O$ @! U
                if(pvNames)SafeArrayDestroy(pvNames);1 }8 E% m- a' \/ U9 \8 `
                iEnumIdx++;  X0 ]  t2 E! _% d+ w9 a, F
              }
$ q% u% K4 z7 ~7 [% a            }' P9 Y0 }1 U) _, V+ \- R1 y) L
          if(pClassObject)pClassObject->Release();
  f2 C2 L4 b; ^+ c, W         }) l+ p: P9 ?0 w" e" u7 p7 ~: r2 u
       if(pEnumClassObject)pEnumClassObject->Release();3 t' J0 m1 j3 A6 ~' q
     }+ Y0 H6 a* O7 }7 G. p& V
    if(pWbemServices)pWbemServices->Release();
5 Y4 u# s, j) t! A2 V- I  A6 o. n/ ^   }
, V6 U% s: \, E( ?( \! u* m5 Q  if(pWbemLocator)pWbemLocator->Release();' H1 d8 @- F9 f
}0 E( o- i/ _& T1 \
//---------------------------------------------------------------------------6 G! E. o/ ^) Z) w
" r, G" N) L2 x/ s' n& ^0 V3 R
// 通过 WIN32_bios 获取 BIOS 信息:
3 w* m3 V* A9 \8 P1 \2 `2 v1 Tvoid __fastcall TForm1::Button1Click(TObject *Sender)/ t/ J$ q6 P0 }: q" T( M
{
" B; ^% j( {/ I% S6 g. Q    Memo1->Lines->Add("================== [WIN32_bios] =================");
. L: l2 d3 C- Q4 Z+ G    GetWmiInfo(Memo1->Lines, "WIN32_bios");
7 R  d4 [9 o& {7 U2 g    Memo1->Lines->Add("");
4 T  v2 l6 ^( T# |0 f}1 b- \1 r' Z- x& @3 M; m, S6 h  ~
3 e6 k9 S$ W7 Z  |1 I5 I3 H/ V
--------------------------------------------------------------------------------3 R. }. V3 L) c

/ n$ m& B* r! `$ M6 Q0 j' f" BWMI 可以访问的信息类型有:' y$ h6 }/ R1 t) A1 x5 f; U
  Win32_1394Controller
' x$ V7 Y6 _3 f6 q% U. w   Win32_BaseBoard
% E$ \! x$ m4 Q5 y. R7 ]   Win32_Battery- A- W9 o8 f5 V2 \
  Win32_BIOS* \% v% i% e, k9 ^7 d  D
  Win32_Bus/ v. B& P0 L1 f0 z$ K
  Win32_CacheMemory: Z& J! G# e+ e& _! T
  Win32_CDROMDrive+ J7 a8 Z' D2 E1 m; L- y
  Win32_CurrentProbe# S' f9 A7 b9 k+ n) \  K6 {
  Win32_DesktopMonitor
1 ]! p3 \% a- _   Win32_DeviceMemoryAddress
! n4 j8 j2 `% e/ U" a* R: W3 m1 Q   Win32_DiskDrive! ?; I$ J8 [, n- k1 A0 u
  Win32_DisplayConfiguration5 L& e7 L: n$ S1 g1 E4 K7 v
  Win32_DisplayControllerConfiguration
) J8 L2 X9 ]3 I   Win32_DMAChannel, X* V6 l) E# |  W! L( q" E) }
  Win32_Fan+ Q, E1 X# ]0 j9 g
  Win32_FloppyController
4 Y4 B4 l3 X" X   Win32_FloppyDrive
, V. B& p2 q, b   Win32_HeatPipe
& }/ c+ I3 w9 n+ }# O   Win32_IDEController9 E4 Q2 l' X. A0 ~0 r: P
  Win32_InfraredDevice
1 X9 W3 N1 b1 V* U* |! |0 o  Z   Win32_IRQResource
- M  n% P" n/ Z) `, F   Win32_Keyboard
9 l5 o; [: y, w$ t: U* N9 \   Win32_MemoryArray
: h* ]0 A( S  c  [0 _   Win32_MemoryDevice
# a; |6 U# _* Y$ G8 S; _4 V. @   Win32_MotherboardDevice
1 p7 j/ r' F% e7 ~; @8 ^3 W. P   Win32_NetworkAdapter! q. ]3 a% o( ~" o( A. P, y
  Win32_NetworkAdapterConfiguration7 R  m0 y6 b: n) U
  Win32_OnBoardDevice
9 P9 e3 d. `9 J% l& ^) M( G3 `   Win32_ParallelPort
+ q# k* g9 m+ j+ w; D8 P+ J' R2 X* y& E   Win32_PCMCIAController- U4 v7 [: Q0 m
  Win32_PhysicalMemory
1 z+ d, `5 I- r( h. e0 c   Win32_PhysicalMemoryArray
* e( f4 }, ?, j+ g' H4 W   Win32_PnPEntity
5 Y+ E# x8 N7 e; L/ w   Win32_PointingDevice
& ]% Q, T; v3 s- x, h   Win32_PortableBattery
# x9 z2 Y, H. [& W( G   Win32_PortConnector* Y( B9 G/ A4 q7 ?/ A7 t& A' D; Q
  Win32_PortResource& w+ m1 a3 F& E) J# M
  Win32_POTSModem, o6 `# z& P! s- m; U# A$ E. S
  Win32_PowerManagementEvent( X! Y; F8 I: y8 T: `# v3 W8 N
  Win32_Printer1 P  s) x" i- z' @0 U; S. u7 {
  Win32_PrinterConfiguration0 r" S( x- p$ a( h- g/ S
  Win32_PrintJob
9 s- ?! b9 e! t   Win32_Processor% e; X) O& [$ Y+ A7 H
  Win32_Refrigeration. C! U) |% ^4 ]! U4 x# B% k3 S) [  i  ~
  Win32_SerialPort& m# ?6 W6 g- _. A3 j, K
  Win32_SerialPortConfiguration
1 \3 `7 ]1 ]$ h9 Y" ?. L   Win32_SMBIOSMemory
" t  z* n- e/ w0 h/ n' O: J; `   Win32_SoundDevice4 Z. ~0 c! D9 K
  Win32_SystemEnclosure6 f" I$ u1 x7 Q) D) D' [" s- K0 ~
  Win32_SystemMemoryResource
, X, g" V: C! F% F9 v# s. z   Win32_SystemSlot
( C/ F8 y) r% {1 n. d4 M; r   Win32_TapeDrive/ I1 v: T- d" m4 E% {3 H% E
  Win32_TemperatureProbe( |2 F3 E, t6 U5 E- U
  Win32_UninterruptiblePowerSupply* r( |( M$ R! x1 [' W  ?! V. n
  Win32_USBController; |, T& N) X! f3 z& X( d" w+ Q
  Win32_VideoConfiguration
$ l) s4 V" Q2 c4 N* M   Win32_VideoController
0 p$ n' d8 U8 a0 e4 U8 {4 s   Win32_VoltageProbe
3 c5 a, \2 q/ ~" f3 ^. M! L& r/ l7 q7 l7 ]
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-4 19:57 , Processed in 0.019650 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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