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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者). P* @+ A5 T7 W  t' L" {

- o. w- q2 T$ S/ o' E0 H) R1 ^7 q1 y2 \* @: \5 v
--------------------------------------------------------------------------------  W/ }0 o7 @+ I: B
WMI: Windows Management Instrumentation (Windows 管理工具)3 C% w, b9 K$ {) ?3 {8 s
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
7 O' ]9 l) k3 b, G" b6 N0 R   利用这个工具可以管理本地或客户端系统中几乎所有的信息。  S1 r9 `9 _5 t" f
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
4 f7 i: Y. f7 R) w/ l! o
# q# M. J- `! M( e" m--------------------------------------------------------------------------------
: Q3 K: K6 Z7 W- U3 t6 oBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
& E& y& M1 z% C5 g# g+ }
5 M# ]: x2 x" P& \--------------------------------------------------------------------------------" n  s4 o, z2 Q" z) Y+ q- z
① 初始化 COM 接口:
' `  O8 |- g$ X; e1 P0 V   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
9 x. \. I2 d4 d2 g( B% X2 w   这两个函数在 #include <comdef.h> 里面定义。# P$ u7 d$ q* `# c1 F- N

- x6 _) J' T9 f9 M6 U6 _② 获取访问 WMI 权限:
  L$ a9 \2 ]  U) m8 d$ T# q  {) J   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
$ W7 v6 ~9 X8 _- N2 a; l& [   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
, `9 n0 X7 W! @# t- `' L0 M, F
- R+ o; z& i5 P; ^9 v; I/ ^' M$ o, |1 [5 T③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
3 _8 \0 ?/ N# |$ d1 R1 h  G* Q   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
7 u/ V! |, [+ i8 Y/ x& c% I1 p. n5 D1 ]) e5 V2 |4 r; K2 b7 b
void GetWmiInfo(TStrings *lpList, WideString wsClass)
4 a: e0 b0 c$ r2 U9 o' Z* a{% R% q. h3 l  i' L
  IWbemLocator *pWbemLocator = NULL;
) j8 c! A& [) G6 p7 x4 e  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)5 g8 ^# C7 t/ J& N
  {# U  c" a% v8 ^& [
    IWbemServices *pWbemServices = NULL;
8 v$ X; ]  {. Z' T  Y, ]& d" K  x. e# n     WideString wsNamespace = (L"root\\cimv2");
, M9 u6 {" \9 N     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)& Q/ T9 i" C! y
     {- J& s) I+ b7 i) \; O( z6 @
       IEnumWbemClassObject *pEnumClassObject = NULL;
$ A2 D; n2 b, f$ x8 j( r        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;4 M, K9 N6 w: G: }2 ~* O
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
" B! o" r& M$ B1 J" J9 y         {
0 X+ Y. f$ g- a           IWbemClassObject *pClassObject = NULL;
3 O5 ^" F7 ]: z9 p* \% g2 P) x           ULONG uCount = 1, uReturned;
) g; n. L  w+ n1 a+ t9 s           if(pEnumClassObject->Reset() == S_OK)  m' F0 V0 ^- _  B! t' Y
           {
: H& u5 c* U+ ~: O              int iEnumIdx = 0;3 p" w9 i% B4 m* K- H6 D& k
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK): F, y! D2 H2 w, D, b$ S
              {
+ V- G. ?8 Y0 e- k1 l5 K8 |% P( ~1 m                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");# }8 r2 \4 L: x/ }& B; }% k
2 P2 N2 R9 ]$ [1 I7 Z6 L
                SAFEARRAY *pvNames = NULL;
" o+ Y5 C  k# u                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
( O7 G" V+ |4 t' ~                  {
! W3 q1 n( x, o1 q/ L8 z" P- v                    long vbl, vbu;
. P/ ~% |" L9 W                    SafeArrayGetLBound(pvNames, 1, &vbl);
" c7 s9 W5 r+ I                    SafeArrayGetUBound(pvNames, 1, &vbu);/ `# h7 n) `5 i" b3 q' N
                   for(long idx=vbl; idx<=vbu; idx++)
3 G; `: I3 B* r                     {
7 h) ?* h1 g6 O! g7 w9 p( P: o                       long aidx = idx;( l* i6 M; @- X, p7 b6 m% [" a
                      wchar_t *wsName = 0;
+ i4 ]6 f9 k( @" d" Q                       VARIANT vValue;: I: P! k( j# z5 ~' ~
                      VariantInit(&vValue);& q% w  T. m. E( f  @# O
                      SafeArrayGetElement(pvNames, &aidx, &wsName);2 `: A5 x" K. O8 ~4 @- d
% z$ p  n% B) Z; _; J% K8 W
                      BSTR bs = SysAllocString(wsName);
. ]3 |1 `- j2 v( [9 T                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
: \1 C  I2 q! C- h" A% f                       SysFreeString(bs);
! I& ~$ O0 L* ^8 f
% T" j8 E- X9 o' `                       if(hRes == S_OK)' `7 e  N! \- ?8 I+ |, l9 J$ p
                       {
: N4 r) j% m) G                          AnsiString s;
" L" \. c; E  j! X$ @) Y! O# b" I                          Variant v = *(Variant*)&vValue;
& ?9 O; ~1 a' y" r                          if(v.IsArray())
  A2 ]1 K- B5 {& [6 o0 g# S3 J2 x                           {
6 J' j. B1 B8 Z3 `3 m9 ]                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)- M8 m. d, R( S/ }7 H" m& F$ T
                             {5 P& v9 P: d2 ~6 W* u
                               Variant a = v.GetElement(i);6 v0 I6 w. B3 L& T4 i
                               if(!s.IsEmpty())
, g- h0 d1 g" L: \" R                                  s+=", ";
3 l. G  B* A1 k8 X% g* O                                s+=VarToStr(a);) ?; c/ o6 I$ w, k; M! I
                             }
# h9 A1 r5 f; b5 x0 p' }* X                           }5 g; ^6 j' I. L4 ~1 K
                         else0 ^+ d1 e8 P+ y6 O2 m1 a  H9 E
                          {; j( `, x* d- g5 A* C1 j
                            s = VarToStr(v);  ?, E# H) D. T: N4 y9 C8 w- k
                          }7 R, f) H5 y- r& K5 P/ R  |3 T
                         lpList->Add(AnsiString(wsName)+"="+s);
& {2 E( n: M/ |" Q+ H                        }( i# i+ [0 N9 N: [9 U6 j. c
4 y/ y% H5 R2 `
                      VariantClear(&vValue);3 ^5 ^2 _9 D7 s0 |
                      SysFreeString(wsName);
) ]8 I# A  H( V7 y# h/ w                     }
& J: h, T0 m3 x* U* T- R& B3 B/ P                  }& t2 T* w- U: L
                if(pvNames)SafeArrayDestroy(pvNames);
% K3 N$ h3 i6 ]4 ~                 iEnumIdx++;
6 L" X- Y9 j! B6 I% _2 x8 s1 g               }/ ]$ ?/ M1 ^: W' Q
           }1 N# x8 R1 L, j& x+ e& B
          if(pClassObject)pClassObject->Release();
+ U- }3 N2 _4 A( N0 I         }( u- x; X$ P2 p2 }( O
       if(pEnumClassObject)pEnumClassObject->Release();$ n  s5 w% G& w# V; S3 k0 q& L
     }* h" c  ]. D: e* J; u1 J6 c4 z
    if(pWbemServices)pWbemServices->Release();
% F. i7 B) \9 k; p4 d5 {# D   }
+ B9 @! k$ T) ~  if(pWbemLocator)pWbemLocator->Release();
  |- u8 y& d" e  t% b( |}
. [7 P0 e: a' H//---------------------------------------------------------------------------) B# v7 w) J3 m% E
+ Y- a8 Z5 J3 M7 ^8 B8 ~
// 通过 WIN32_bios 获取 BIOS 信息:9 X2 P( B# k. a# H8 J( h- ]- p
void __fastcall TForm1::Button1Click(TObject *Sender)  q1 ]0 [4 {6 c& y# g& ~' I
{8 D0 ~9 Z4 I6 W: B9 Q2 j+ _7 `. J
   Memo1->Lines->Add("================== [WIN32_bios] =================");
3 v% B7 Q7 I# }8 ~    GetWmiInfo(Memo1->Lines, "WIN32_bios");
& \0 q& c5 k8 a9 W  y8 c1 N1 r    Memo1->Lines->Add("");
5 t; k' R1 T" `& c; w# U}
; X: a8 s5 {4 K2 h9 P4 b* G( H" T+ r6 L2 `
--------------------------------------------------------------------------------
1 ~+ R, }& ^* s8 x
! }6 P" X% `3 A* t7 O0 rWMI 可以访问的信息类型有:9 B8 u, t* c* w( I: w4 b* |, b
  Win32_1394Controller6 s7 I' D7 |9 v
  Win32_BaseBoard2 H6 r7 M' i8 K/ t, Z1 X; T" @
  Win32_Battery
+ `0 I. o+ w4 E   Win32_BIOS
8 M" b% g) f$ [9 l( N9 Q4 G% ]   Win32_Bus
- d; L" B. p' b: L! |7 c# }   Win32_CacheMemory% \. F9 Z' ?3 Z9 g
  Win32_CDROMDrive$ k( @, r5 Z7 n: }$ M
  Win32_CurrentProbe
& X) g$ z6 ], l% c; u   Win32_DesktopMonitor$ R2 t7 j. S, b8 [8 K- U
  Win32_DeviceMemoryAddress
* I$ f5 M$ Y0 Y) d   Win32_DiskDrive3 a$ t4 I; |, h
  Win32_DisplayConfiguration
" h5 s4 X* b7 |1 J3 D   Win32_DisplayControllerConfiguration
; ~, Y4 g  R' N$ J: s   Win32_DMAChannel; l0 ~0 i; r, A- P3 Q
  Win32_Fan2 I( `) ?. D$ x. ]# T
  Win32_FloppyController
& n! s( J( l& q4 C6 X   Win32_FloppyDrive
. o* C9 X4 e8 k. A   Win32_HeatPipe7 Z# L$ [4 _# w' I
  Win32_IDEController8 P0 C- R" H! u$ ?
  Win32_InfraredDevice
. Z% A* ?0 n6 w) G  L: E3 p   Win32_IRQResource6 e; B( u5 g; c+ s/ n7 V6 w) H
  Win32_Keyboard
! h# k  v0 u0 L) j1 z8 _# ]. T& u' y   Win32_MemoryArray% C8 g/ s, T& {% [! y2 _
  Win32_MemoryDevice
  O; Y1 M9 a  f" [, R   Win32_MotherboardDevice' k* u! G3 ]) \& ]
  Win32_NetworkAdapter6 q! T1 s4 U5 K. G. Y: |" C
  Win32_NetworkAdapterConfiguration
8 I; Z+ D0 e- R7 }   Win32_OnBoardDevice
% |! q3 b' S3 H2 d" S0 W0 n2 u   Win32_ParallelPort
9 ?" x4 G( ?2 z  l+ j: |   Win32_PCMCIAController4 Y) Q8 [, J3 d0 D3 w" A
  Win32_PhysicalMemory% _8 R) G, C+ R8 e6 K
  Win32_PhysicalMemoryArray1 I2 f) R+ V6 Q7 N' I3 F
  Win32_PnPEntity% y5 x" g6 [9 v. c* K: q; ~
  Win32_PointingDevice6 H. i3 k' g1 ~) |" e* f# @% N
  Win32_PortableBattery
. M8 Q# h3 a! A$ h* m   Win32_PortConnector
/ ~: n3 k5 e, G# }  ^, x; ^# B+ F   Win32_PortResource# }1 p1 ~6 S1 l6 O$ z* i: J1 m
  Win32_POTSModem& I5 ]" t1 b% X% }. ^
  Win32_PowerManagementEvent
8 V* R  c3 p9 T1 o/ j# `# h( T# V   Win32_Printer) b4 @0 v; i, K& h* ^" R" R, t
  Win32_PrinterConfiguration0 E3 `# Z* q, n4 V! d
  Win32_PrintJob
. z6 A* n- h) O6 u5 `' b0 V, e# f   Win32_Processor3 C# D$ k3 P8 F4 ]9 H! R
  Win32_Refrigeration
( {$ E0 {0 V# f. E   Win32_SerialPort! p+ ~% S& Z5 a9 x* J  `
  Win32_SerialPortConfiguration
8 _- S6 K/ P" _: {* c   Win32_SMBIOSMemory
, B9 J0 }0 P; z9 C   Win32_SoundDevice  }; N$ ?+ y5 L& {6 h
  Win32_SystemEnclosure( \, `, C5 [5 ]0 T+ Y
  Win32_SystemMemoryResource' Y& `7 e$ K+ h
  Win32_SystemSlot2 M- D: H! M, @7 S! V! m
  Win32_TapeDrive9 f) C0 |6 u! Z0 w$ i. o
  Win32_TemperatureProbe
% b* `- y1 i0 [   Win32_UninterruptiblePowerSupply, K4 `8 I) H; q1 C( W0 d
  Win32_USBController. W6 w3 x- `5 N8 ?- V2 P
  Win32_VideoConfiguration; Z6 c2 U/ ]5 r7 o1 w  s
  Win32_VideoController
5 _# z" ^+ z1 j& q+ y. L5 p  P9 E   Win32_VoltageProbe
2 F" G: t& z, s( h1 R! N/ V
; i. O3 M7 r' D; _& X* I+ Y以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-21 11:21 , Processed in 0.018789 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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