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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
9 T0 f0 {: r5 @: k8 M$ |4 a. I$ c, I' f8 w2 p* q1 f+ }

* k$ T& D! T; s, I--------------------------------------------------------------------------------
& Z! g5 V; W/ R9 ]9 J3 P; b9 T* ]WMI: Windows Management Instrumentation (Windows 管理工具)
& m5 e4 q; k# Y, C+ ]   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ! Q7 ]( }' [) {& K
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。3 e. i$ B9 W8 H" Z6 D+ Y0 x5 b- [
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 0 p6 }  |& }* _0 R8 V4 |
* N4 n4 r' C$ ?. |) }
--------------------------------------------------------------------------------
/ s  C) h- B# h/ E  S/ RBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面2 V1 S% ]% P, S/ L: q0 G

  X- l: J9 O) j6 I--------------------------------------------------------------------------------
( l0 [( ~( Y' N① 初始化 COM 接口:$ f4 M, m1 Y- e. E" K
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
9 \$ x! K: [. i4 l   这两个函数在 #include <comdef.h> 里面定义。
) c( I7 j, `/ w! I4 K' F/ K- x9 |; k6 }/ }/ P) f! s
② 获取访问 WMI 权限:
# P& E( E; y- m% ]2 z   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);) b0 C& y5 r1 ^5 P! R! D
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
0 h% ?# N" M$ G: w  H
- ^: O6 x* }, ^" l8 Z③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
3 e0 ?' r) X  Y. Z   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。. h1 a9 M7 U3 f# e6 y

  p- m  |5 A5 r( f+ D$ C* h5 W* @void GetWmiInfo(TStrings *lpList, WideString wsClass)' y+ x6 n$ Q; U
{
; w& m# `. N( O& X6 y( i& @; O  IWbemLocator *pWbemLocator = NULL;/ P  p" z, f& F9 I% n
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
7 R" H  b  A- X* [5 f1 H/ Y4 [   {
$ L( _% _0 H/ ?  o4 N2 D     IWbemServices *pWbemServices = NULL;
1 f& x( v5 D! j5 r7 Z8 D4 v     WideString wsNamespace = (L"root\\cimv2");
3 ?$ E7 w/ E' a) K; z     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)4 E3 N  l/ ^, C
     {
: d. d  s- B; h% h# F5 ^/ b- n% u3 r        IEnumWbemClassObject *pEnumClassObject = NULL;
: ]4 k" g; h6 O6 F# V        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
. q6 S# R' F" d! T        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)& V/ {& |7 ]- v4 F1 P9 Q
        {
. m1 _) x/ }7 R2 r0 o% d& m8 A9 m           IWbemClassObject *pClassObject = NULL;8 K$ |% g5 W4 O: j- v( q
          ULONG uCount = 1, uReturned;
1 b5 _8 ~, ?) S9 a1 D! `1 A& N           if(pEnumClassObject->Reset() == S_OK)* h$ i) S2 o5 _7 v7 S  m& f0 r( \
           {
( A- F# y. I  _+ v1 o! _; }              int iEnumIdx = 0;
! p: e) H0 ]; @3 R7 J              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)7 P9 D) p! _) J3 Q# Q
              {
$ Q0 C8 m5 {: ]3 J: S6 _                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");+ S- W; B. a! H0 q& F

: ~) P2 W- O1 P                 SAFEARRAY *pvNames = NULL;7 T" I% ~/ ]; E8 o
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK), b7 y2 T7 F1 |7 u2 E: U
                 {
9 h- `) m/ l5 }( r1 {                    long vbl, vbu;
8 R5 R) X( |4 y/ c4 B- n                    SafeArrayGetLBound(pvNames, 1, &vbl);, t2 x! f* B. `2 s7 v
                   SafeArrayGetUBound(pvNames, 1, &vbu);3 c/ D$ Z" K# i% @
                   for(long idx=vbl; idx<=vbu; idx++)) h: {" u  h2 D& P+ @" i+ S: @$ z0 k
                    {
4 K& }5 \3 t2 X6 |7 q1 W                       long aidx = idx;
3 I6 B# c& F; A                       wchar_t *wsName = 0;
' M0 _! y2 t7 l1 T4 D, C                       VARIANT vValue;
6 C) e' g5 T6 W+ Z" P                       VariantInit(&vValue);
5 h: e4 d7 v1 O' Z                       SafeArrayGetElement(pvNames, &aidx, &wsName);; T9 R3 e# b( u5 a$ h5 t
9 X9 O, X' I( U' o' i% ^
                      BSTR bs = SysAllocString(wsName);- U8 S( h, G, C6 i& j/ J1 p$ X
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
9 L, z7 @* x: c2 x                       SysFreeString(bs);' \( [$ K( C! q5 T: I
( C; E7 S  _# f" _3 |
                      if(hRes == S_OK)
3 o8 ?+ z: s+ Z9 U) r                        {
5 o: l: w1 E7 n# }. F% g- ~                          AnsiString s;
5 y3 F. |+ U  o0 i                          Variant v = *(Variant*)&vValue;" I& F! L- k5 m* j& L4 k  q
                         if(v.IsArray())  o) d3 k3 R& ], P' M0 T
                          {
* J5 D1 |* s8 H' V: H5 ?                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
2 {1 R  W! `4 l! v8 y                              {# ]4 R2 Q# W; x) u
                               Variant a = v.GetElement(i);
) [- K& ]3 J0 i# K                                if(!s.IsEmpty())
9 R' X" ~4 P6 d$ @                                  s+=", ";0 O) ]' P1 f0 B) \  R
                               s+=VarToStr(a);
- l0 t* ~9 @3 Y( Z3 z9 W1 e                              }6 G/ h" N/ F* G3 {6 M
                          }; m+ V9 Y; K. N* f
                         else5 ^. ^& i" R0 P1 w: h$ a3 Y7 y/ t
                          {
! r; K! Y# i( k6 C' V                             s = VarToStr(v);
) I* [5 O6 s8 B( w                           }  D3 p* Z2 ~4 H4 [
                         lpList->Add(AnsiString(wsName)+"="+s);; a6 o1 \; w2 x5 G# F1 U% ?
                       }
3 g% i5 Z; i2 m0 o. u' Z, B; |  B- ?' z, R9 J
                      VariantClear(&vValue);
) }3 G) {7 M* G: _                       SysFreeString(wsName);
7 k% s) b- g! t& }8 V, `& _4 t                     }
. Q' i/ v& B; s* W# L" ]- ~# p+ K1 I                  }2 V4 r+ Y. L8 K$ R. M$ ?
                if(pvNames)SafeArrayDestroy(pvNames);, a3 i2 r9 f6 m/ K( C
                iEnumIdx++;: `2 R0 W: n2 D/ K
              }
2 b/ W- b+ k% R, j3 X% A/ U. p3 I            }3 E% v( D! Q  X* Z
          if(pClassObject)pClassObject->Release();  K$ G, Z2 B6 j1 z1 t3 B
        }
$ F& `3 S. }( F0 [        if(pEnumClassObject)pEnumClassObject->Release();
4 R/ R, V; l: S; {- r& k* K      }8 y) I4 n% p2 {8 p- U  y2 u, a& K
    if(pWbemServices)pWbemServices->Release();
" [# y- ]2 _0 Y/ i: }: \   }; R% {% J( R. x8 C$ d
  if(pWbemLocator)pWbemLocator->Release();  a5 c8 {9 n6 d7 R! p+ |) w
}$ I( E6 Y( F, n. k- B8 H
//---------------------------------------------------------------------------
" N$ @% {( _$ J" ?! Z( X( v2 z$ o1 `& A. `% r
// 通过 WIN32_bios 获取 BIOS 信息:! D- q4 W7 ]* [# a
void __fastcall TForm1::Button1Click(TObject *Sender)2 L3 C- ~4 `# f
{9 _( |  k. I" M! o$ B
   Memo1->Lines->Add("================== [WIN32_bios] =================");
9 x+ D% T. p; F# c3 f& j$ P9 o8 T    GetWmiInfo(Memo1->Lines, "WIN32_bios");
8 P, `" k) m4 M! k    Memo1->Lines->Add("");" A! ^  L9 {: b8 ~$ Z. ~! m
}& I" y" b& F' D' y' e; u$ _

( H3 \5 M* h0 G% A2 K--------------------------------------------------------------------------------& B8 o  f; k( j$ O* d* A
8 y7 a) A5 o1 Z& n
WMI 可以访问的信息类型有:
4 A; P# n* R3 v   Win32_1394Controller
$ t% X; m5 r0 t4 }2 j1 D   Win32_BaseBoard8 Q( E  p( t. e# @" P7 e6 `1 T
  Win32_Battery
) w# U  R" g: x   Win32_BIOS$ X: X6 W! F* D0 F3 U
  Win32_Bus
7 `1 w/ H. ?; x0 D" G; g; g   Win32_CacheMemory2 C! w/ J6 ^3 Y" K+ w5 }! \
  Win32_CDROMDrive
7 E" w5 a, c9 Q) a& B8 l. u+ k0 t   Win32_CurrentProbe
0 Q# R. a' A5 I   Win32_DesktopMonitor: ?  M& A8 M; r' a6 k$ p
  Win32_DeviceMemoryAddress% p8 b' s- ?% K9 Q/ g
  Win32_DiskDrive
2 V2 D0 H$ p' H% G1 [   Win32_DisplayConfiguration
- j& }4 ?- g; {7 A9 L1 C   Win32_DisplayControllerConfiguration
( A/ m. b% e/ L8 F. Z3 j0 _/ {   Win32_DMAChannel
' y4 S. ^& v$ `( e8 }- D   Win32_Fan
9 e+ j9 p% h% B/ @& ?$ A# G   Win32_FloppyController% z' v, |  b! {- [1 l1 A; g
  Win32_FloppyDrive
4 Y0 y- G" q; o6 d! _# L. b   Win32_HeatPipe1 U' Z7 O( k, E) k
  Win32_IDEController0 y' i4 Q% }* Q+ `8 Z0 j
  Win32_InfraredDevice
4 w1 ~/ ~# B$ n; U5 D" z! \' W   Win32_IRQResource
0 P* x5 V7 \7 [+ [   Win32_Keyboard. ~1 L* x9 `3 ?9 W( ?  ^
  Win32_MemoryArray/ N: g* R% t3 r  Z$ W  M
  Win32_MemoryDevice
7 c2 q( G. @  Z) P( K. ]  S# d   Win32_MotherboardDevice
0 `" J9 e- c- u/ J& c   Win32_NetworkAdapter; G/ ]8 W, v2 \" s. W
  Win32_NetworkAdapterConfiguration
' S  c! b" S( a   Win32_OnBoardDevice
/ l4 l* J4 D1 ~: B& b( B   Win32_ParallelPort. {% ^( j( W' b4 c1 H+ n: u
  Win32_PCMCIAController) q$ Q# o0 W$ ^1 G6 n: L) L
  Win32_PhysicalMemory6 @2 X) L1 Q* y1 m( }
  Win32_PhysicalMemoryArray
& m8 l# {( R( ~6 C% n, W1 v9 X   Win32_PnPEntity
3 j8 l6 t0 o$ t   Win32_PointingDevice" O* N2 v$ M( b8 T, I
  Win32_PortableBattery5 p  [5 Q, g1 h6 X  o) U# Y4 o
  Win32_PortConnector
( Q2 n2 v9 F3 H' s   Win32_PortResource
. x% ?( `2 @8 B   Win32_POTSModem8 T9 Y: b! |1 P3 Z" T" |+ M0 d. C1 U
  Win32_PowerManagementEvent" Q5 Q2 b% x# K
  Win32_Printer) \. W. L1 ]- E
  Win32_PrinterConfiguration
5 z  n8 v. z8 z" `5 o   Win32_PrintJob$ {) x0 @( Q8 i1 z: X
  Win32_Processor
  Z9 }* F' B+ ^   Win32_Refrigeration0 b( H+ V8 \! X' C) a, K  k# R* B
  Win32_SerialPort
1 ~" t0 f* {( F, T3 @$ W: }3 }' e   Win32_SerialPortConfiguration
2 I9 Y) C: Y5 \) h6 C; N1 ^( o2 N   Win32_SMBIOSMemory7 U: A9 y5 K" e# o) K+ H7 i/ u6 w
  Win32_SoundDevice+ @) p! ^1 M) P0 X* j  L& {
  Win32_SystemEnclosure
6 C/ Q( b8 I6 F, B6 ^( J8 L4 T) M- {- y$ v   Win32_SystemMemoryResource" G7 I5 \( _: O4 d4 I; s3 p
  Win32_SystemSlot
' m* ^& q# t- z; H2 P. @+ x# r   Win32_TapeDrive' e9 L  |( A1 L
  Win32_TemperatureProbe
% W" V- v: C! @% E- x( @   Win32_UninterruptiblePowerSupply
" k. Y4 E: `% X8 ]  m7 f% v; ^   Win32_USBController. d6 n* S, k3 i2 j7 c7 Y
  Win32_VideoConfiguration
) F$ r3 N( \! o$ o+ P& n0 I6 o. N   Win32_VideoController
1 Q, x( w8 Y; Z   Win32_VoltageProbe" s9 @- M3 c( @  d+ x9 r, e
0 h$ X# Z" o: D- K5 f- I
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-13 10:58 , Processed in 0.021332 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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