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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
9 @0 J" F% ^' I3 O: ]4 a& A5 k1 j9 P- ]

8 Z. u4 ~, R; b& ?6 B. Y--------------------------------------------------------------------------------% Y- q& }4 Q; c3 _/ e  j
WMI: Windows Management Instrumentation (Windows 管理工具)
/ L- `/ s+ `1 Q2 t7 k( u   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
( ?& Z8 U. I4 x$ D* h   利用这个工具可以管理本地或客户端系统中几乎所有的信息。" n5 z* ?+ X4 V$ Z
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
" h0 }4 f5 L7 [& y' w4 R6 @9 y+ a# D. c" ]9 g3 X& t
--------------------------------------------------------------------------------0 m5 A: t0 M! l5 N% }3 M! ~
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面3 a$ ]: S( r0 q  M3 v$ f
% w$ x* G6 ]# v# ?8 W: j" ~
--------------------------------------------------------------------------------
+ U6 B- ~+ O; P% m: h8 Q! o" Y① 初始化 COM 接口:  _; ?- [& b  m% ?; y
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
" L" j/ `$ k% w1 k+ I   这两个函数在 #include <comdef.h> 里面定义。* t4 U( P3 r" ^; Y$ s) Q$ K! f

5 I+ r" B# k: F8 Y! x② 获取访问 WMI 权限:6 Y$ Z# J6 l; o3 ]7 h: r' W
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
9 a7 D) I8 x1 k) h4 b  b9 c/ O   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
, A: [5 @. y) S  B$ J8 y: M
& u9 Z0 B- |$ F/ Q1 ]③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
1 d. z0 Y: ^# X: I8 f; o) Q9 c# o   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。& ]; r, t! Y7 j3 z
( q1 p8 L: m' Y( Q$ C. _
void GetWmiInfo(TStrings *lpList, WideString wsClass)
4 W7 r) @7 n* K1 z: R{* |: S. F0 n* a9 v
  IWbemLocator *pWbemLocator = NULL;7 B- U6 @4 n' h1 p, ~7 s
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)9 h) ^4 {1 V& A8 `) |1 r
  {/ r& k- l! I9 k7 p; B
    IWbemServices *pWbemServices = NULL;
' [: r2 |7 Q5 o6 v     WideString wsNamespace = (L"root\\cimv2");
$ g( Z0 @9 d( |- T8 K- ~5 P' t* i; [     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)$ L$ }* \% P) j0 }. I; L9 [
     {
# S5 V* A6 {' D/ D4 \3 I$ s* D        IEnumWbemClassObject *pEnumClassObject = NULL;
6 k+ z: I+ ^) H* r- F5 m. R4 @        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
8 ~* a% [. v7 h! B6 i1 [. z        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
) z6 p$ U! }: D6 w         {
9 ?2 G  _2 y1 \3 F           IWbemClassObject *pClassObject = NULL;
$ u5 I/ N( |4 i           ULONG uCount = 1, uReturned;& D2 d  g' r6 h2 ?+ @
          if(pEnumClassObject->Reset() == S_OK)
9 J: L- ?; V% C! C, P            {
" ?- s( X" F  P/ v; |" Y; R0 ^  ~  U              int iEnumIdx = 0;
- ^0 e  h) Q: L7 n% e3 M9 s8 c              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)) c1 m* c4 v6 d  ?" M5 j5 ~1 G  q( S
              {
+ l) Q- ?. u5 d  r1 N7 x( l                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
, ]3 U- t# A$ b; t( l0 z5 R0 \# o3 w
                SAFEARRAY *pvNames = NULL;
8 L1 D! g5 A/ b1 Q                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
/ @6 c" M& R" H: t; ]! a) a                  {
, c8 Y' S: |1 C* R9 _                    long vbl, vbu;
2 ?" C2 C+ U7 X2 L3 L4 B                    SafeArrayGetLBound(pvNames, 1, &vbl);9 \  o8 E- k  P  x+ w. d& J
                   SafeArrayGetUBound(pvNames, 1, &vbu);& K% b' G% u) U  A: C
                   for(long idx=vbl; idx<=vbu; idx++)
2 S+ s' A0 m8 K1 V                     {
$ `" m8 f7 L1 d                       long aidx = idx;! j2 I. r, b# n4 g/ q8 o
                      wchar_t *wsName = 0;
7 j( d9 t. s0 A# z! w/ g% J. c( r1 M                       VARIANT vValue;
! n3 K, @5 u8 @; x: i                       VariantInit(&vValue);8 i8 p& A! V, \4 J. ]
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
" y) _# W1 c) ?4 X% w7 q0 p8 H0 P8 i- d& Q) Q9 r# R( s  E) Q
                      BSTR bs = SysAllocString(wsName);8 S( H  C0 d9 o3 J6 J
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);+ x: M( v6 v) y. I( b
                      SysFreeString(bs);
8 l. }/ A# p" ^
9 g! {; J/ v/ M5 K, T) d% Z$ |! n                       if(hRes == S_OK)
6 L( Z  e) h9 ~$ Y, _; p# ^& i                        {
" O7 h! x/ ?# T4 L5 g0 Y7 C                          AnsiString s;
. {+ ]3 u6 ]( k" U* }# ?6 P                          Variant v = *(Variant*)&vValue;( ]) P0 D& f( s. {" D; A0 }6 b, z
                         if(v.IsArray())
& K/ i. r1 ?/ {' C                           {. U0 M' I5 A. w+ L( U" Y; T+ r; C' f
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)3 T( @$ B1 ^7 i# h' g7 }
                             {, V7 e, A( l& M; E2 W8 m
                               Variant a = v.GetElement(i);
( h/ p( i% q$ l* T2 w                                if(!s.IsEmpty())
6 l3 E; R/ s. b& q                                  s+=", ";) a3 [( @3 a) \0 G& M  A( Z
                               s+=VarToStr(a);
$ ?8 q# v# K5 M7 I                              }
# T; R& u& t2 B% _: I) o                           }2 f7 D+ v! T0 o1 l
                         else
+ H2 k' h: F! L" V                           {3 i; M6 S9 N- Z4 U; L
                            s = VarToStr(v);
& O8 J/ I# s( m3 D0 Q9 t) G                           }
3 W/ P: F+ Z6 ^( v7 o- c                          lpList->Add(AnsiString(wsName)+"="+s);3 |+ C0 y9 \4 ]; E3 z, h# y
                       }
& ~! W3 O/ @  f! w! F# o1 Q/ Y
+ k% i! f5 X4 f- T+ }. H' Y8 n                       VariantClear(&vValue);
1 X) U& \1 e: A2 f                       SysFreeString(wsName);
4 v9 p, s' B! ]: C  O; r/ E* ^( E                     }
6 n* {0 K( p& M9 \' \                  }& h7 g' |0 }  ~* t
                if(pvNames)SafeArrayDestroy(pvNames);& D8 t1 u3 l9 {- f) K3 `9 M  q( w
                iEnumIdx++;- o" k7 L+ ^3 M% _' [
              }, G" f# i0 x7 h& X
           }& F/ R. z9 ~% U
          if(pClassObject)pClassObject->Release();
+ c+ }6 Q2 f( N$ R  r9 a7 V+ }         }% B2 |: ^/ _1 q
       if(pEnumClassObject)pEnumClassObject->Release();
+ j! T& L% D* i4 u3 R+ b      }  m1 q" D) f2 ^: `3 c: d. ~0 G  n
    if(pWbemServices)pWbemServices->Release();  T, u! D( m2 Y; K6 {* ~8 ^
  }8 t, x7 I1 C2 p5 T
  if(pWbemLocator)pWbemLocator->Release();  o6 K9 v; Z1 `2 D( M
}* y8 }. W' O9 N$ Y$ ^% {: \
//---------------------------------------------------------------------------, `: S) {! S( ^8 H0 N' d5 Y8 y

7 I5 N7 f+ G- P: o9 \// 通过 WIN32_bios 获取 BIOS 信息:
$ H% Z* T, L7 s6 I$ d; A3 }3 u1 W0 {void __fastcall TForm1::Button1Click(TObject *Sender)
- r# K' [# }- E& O! A6 @  v2 v5 v{6 Y* @9 Q: N4 O* w: }, J
   Memo1->Lines->Add("================== [WIN32_bios] =================");
* h9 u+ a4 x+ c- g6 N    GetWmiInfo(Memo1->Lines, "WIN32_bios");5 [7 e5 x# D$ R! r& A! J
   Memo1->Lines->Add("");
3 d; ]. Q- b0 B+ g4 F% w9 P}( n; J' v: N4 ?3 T/ z

8 i& a6 ]9 L- R* k--------------------------------------------------------------------------------) N3 R7 k/ X0 Y6 Q7 |
$ Z: Y) s1 T4 o  J
WMI 可以访问的信息类型有:% }/ L/ n' r& m: H, S/ Y( w' v
  Win32_1394Controller
. ?; x1 k7 H: f/ E5 p% K1 V   Win32_BaseBoard
) W, B8 e! C) ~& K( a3 A   Win32_Battery1 k; n3 u: g$ T) Y, `
  Win32_BIOS" U& c2 q. w) K3 E
  Win32_Bus/ i/ O8 p# \, i8 g; k
  Win32_CacheMemory) p5 |, p( a# E% e
  Win32_CDROMDrive
# `& g" E' c8 `" N! x1 W   Win32_CurrentProbe0 l7 Q, _7 U+ c' w5 W# y0 ]
  Win32_DesktopMonitor6 ^% I, t2 k% X2 r# m7 e
  Win32_DeviceMemoryAddress" _4 u3 ^5 F  f6 R( J- {
  Win32_DiskDrive
0 f5 W7 B  u, ?. N3 U! a   Win32_DisplayConfiguration  T2 C& I2 Y0 z/ F1 U+ s8 J( h
  Win32_DisplayControllerConfiguration0 m8 e; K; B8 g) }
  Win32_DMAChannel
* o* h8 n  w+ {: t& U% k" j# p   Win32_Fan/ o* R  r. j0 m3 p" |: F3 E# F
  Win32_FloppyController1 ~, L" q, p( w4 ^; L
  Win32_FloppyDrive2 Z5 _5 g; p. [; U, ]
  Win32_HeatPipe
' J, C3 J4 Y8 B& ~   Win32_IDEController8 X3 V+ x( h& Q8 y9 t% e' B
  Win32_InfraredDevice
5 B2 U9 h/ V+ h; h   Win32_IRQResource( X: s. u! B+ t; a7 N9 k' V
  Win32_Keyboard2 ~& u# c# v: @0 d: _, w
  Win32_MemoryArray! U" S  W8 Y2 Z) D1 R
  Win32_MemoryDevice' @* d/ G( |2 p, z! x
  Win32_MotherboardDevice" a* k, x4 ^& r# S% x
  Win32_NetworkAdapter
' }/ @5 g4 ^! }9 _   Win32_NetworkAdapterConfiguration
; E+ {$ d! z" Y3 F" o: b* P! I   Win32_OnBoardDevice: c; p3 S4 X. C) i) c+ W
  Win32_ParallelPort& f6 Z& d6 t" c( _1 W8 J  z) d
  Win32_PCMCIAController
  x+ x2 \( X6 ]! ~* [( Y* Q   Win32_PhysicalMemory
- u: e, Z. u! u2 U  z   Win32_PhysicalMemoryArray
2 y4 v( _, O" @   Win32_PnPEntity
/ v$ C0 V5 @! E/ L9 k2 {' k   Win32_PointingDevice
# I( Q" @  q: L' I2 D3 P1 e, D   Win32_PortableBattery2 T* ?. q2 \& V/ {) }$ U
  Win32_PortConnector; _" t9 v5 W) H6 D; }+ C9 B
  Win32_PortResource. l8 o( Y$ W% t1 f$ m
  Win32_POTSModem2 L) r7 E" y+ L; w
  Win32_PowerManagementEvent5 Y. V% F2 y& U2 V/ m
  Win32_Printer
( e+ r0 p# t' H- A& ?3 T; T+ M5 M   Win32_PrinterConfiguration
5 }; }8 u8 @# |; `   Win32_PrintJob
$ W+ J% O8 E. }   Win32_Processor
8 L4 a3 z9 i% X3 R5 a4 I% S0 z' p   Win32_Refrigeration$ L8 s; n9 G) K7 G9 g
  Win32_SerialPort6 R: J' T9 g2 R& k# M& [6 S/ ?9 Y
  Win32_SerialPortConfiguration* J  A9 ^' D. O2 F4 n
  Win32_SMBIOSMemory
6 U/ {) ?9 C' Y, g+ [   Win32_SoundDevice8 X  T( x/ B. S6 ^
  Win32_SystemEnclosure
# N7 d4 \/ }! H: X   Win32_SystemMemoryResource
* {' H6 f( O& k: a; \$ e4 E   Win32_SystemSlot- n( P& }8 b% W  D# e
  Win32_TapeDrive
5 [7 h( W. X7 q1 g% Y   Win32_TemperatureProbe6 y- |! F; v  i" q/ P5 }1 ^# n) N
  Win32_UninterruptiblePowerSupply
. t* r+ G7 D0 O/ k   Win32_USBController
" X+ M0 h6 _1 U  ^   Win32_VideoConfiguration& G# Y( y1 d" R; Y$ W+ v# u
  Win32_VideoController$ S. J. v/ r% J9 V
  Win32_VoltageProbe$ I% I& L6 B+ r8 X

3 K1 F* V! z4 S/ p以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-9 15:01 , Processed in 0.019436 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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