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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
$ H- K5 h: m0 Q3 L) o( a& C/ {& I6 m. l5 Y2 _0 W" d

" g/ u0 a8 }7 E" Q+ q5 ~--------------------------------------------------------------------------------4 {# `6 |  _1 v2 ]3 M; Z
WMI: Windows Management Instrumentation (Windows 管理工具)) L0 l4 m+ q) A& U9 c
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 : E9 F% D& P# {$ Q9 _- ~
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
% G, @  X) R+ Y+ @+ G   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 % h# x$ v! U* Z: n! M' y
4 M' P& p7 V9 e" s
--------------------------------------------------------------------------------
! ^2 b' ?2 D* |0 N' @+ J, i" BBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
7 }) s- j. l$ x8 q* B( ?) I( J8 F7 l) X' l" C* V7 M. N+ w
--------------------------------------------------------------------------------
5 T  V" {' k( s, N3 b① 初始化 COM 接口:9 [& I2 \6 }4 |! Q) k: Z
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
# q. {+ e! s/ G0 h0 }   这两个函数在 #include <comdef.h> 里面定义。2 k7 _% J- z5 X4 c& h! Y

% `" E) X: e+ \; x" r② 获取访问 WMI 权限:
! ~1 p' ?5 k7 A! D( c% N! b   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);- e1 q2 A7 d1 W7 H
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。# p9 c) q; ]1 g( L9 f

, ~! K4 c& h. p! f, c③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
* u  h( `% R# V+ s# H   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
( P' _! s1 m# N7 \4 ~' f' X$ x, W- T
& g& j% K& a* r& \: Lvoid GetWmiInfo(TStrings *lpList, WideString wsClass)( E6 E& Z2 R* V, x" ~& ?/ I: F
{
1 g' P' p7 q4 e% q" V# _  IWbemLocator *pWbemLocator = NULL;
" U4 t/ l. ~# O' q/ C  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
6 E( a8 ?) t+ B4 s8 h) W" d   {
+ A+ [! `* v3 X9 _9 I     IWbemServices *pWbemServices = NULL;" u: e9 k4 _- B5 Y0 w) m" N/ R
    WideString wsNamespace = (L"root\\cimv2");+ v3 {3 I! v9 i+ a7 ?3 I# m- [) C$ a3 j1 F
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
' U" q( o! }$ q' ?5 E( L2 P2 U% g& Y2 u      {
( s, m; M! ]' @7 a0 G' G8 B        IEnumWbemClassObject *pEnumClassObject = NULL;7 v) {. j+ K8 _
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
7 y5 A* h" K  g: W        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)+ c+ g( G; D: {. I2 Z1 |
        {
5 U, m2 A, [9 M           IWbemClassObject *pClassObject = NULL;
) `6 z! t  h! s3 i* ?. r  O           ULONG uCount = 1, uReturned;
  g3 A7 K: E/ }           if(pEnumClassObject->Reset() == S_OK)
$ u% R, l8 }9 Q% i            {
7 j- {, Q& @% ]( V5 z! x& U              int iEnumIdx = 0;
2 n% @' u! A9 @' _& j0 e7 d              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
1 @8 D; @! M- y; d; D$ a6 I/ S               {
9 v. Y" \2 z0 U' E; _' R. H; P  a* X0 ~                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");& I# S  d# H! c% S  d' \

9 ~0 [7 \5 ^: U* B# L8 Y/ N                 SAFEARRAY *pvNames = NULL;( Y2 i, a* H5 H% K
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)9 g2 ]0 b, U% O8 C5 v. w
                 {' L  K6 @6 _9 B) z' V
                   long vbl, vbu;# Q8 v# ~# w4 X9 u3 t9 e1 ~
                   SafeArrayGetLBound(pvNames, 1, &vbl);( x; l+ G5 o* }4 Y' K4 G
                   SafeArrayGetUBound(pvNames, 1, &vbu);
- H: O4 [4 i7 X                    for(long idx=vbl; idx<=vbu; idx++)
. g$ j4 {6 z8 O! \2 q$ X                     {
  m! F+ b' C  @5 U3 }7 W                       long aidx = idx;2 c1 C6 p5 b3 t9 s( |" V
                      wchar_t *wsName = 0;
3 [# G# I2 l# G* T                       VARIANT vValue;: \( C! [9 r% [' z9 S
                      VariantInit(&vValue);* @5 q  }* R2 o5 @
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
* R$ M0 {3 T4 T  @) Q# ^0 z) [6 n7 I! t* p3 u4 Z
                      BSTR bs = SysAllocString(wsName);
- |7 N  V( |$ P$ U- H; Z9 n7 @                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);; G, Y8 u' [' p1 A7 U" p- L; k6 _) O
                      SysFreeString(bs);
3 f% s  m. s; t. l( a4 f7 V
4 Z3 }6 m% v5 G0 y1 }5 f6 P. J; _7 F                       if(hRes == S_OK)+ `* S# @0 n0 x: Z1 m
                       {2 G1 w$ G8 q! [' t
                         AnsiString s;
& I/ B- e( h/ v& h: G' d; O                          Variant v = *(Variant*)&vValue;
7 f- k! P7 L$ `- ^                          if(v.IsArray())4 P0 X3 n7 ?2 k# j9 q% n4 I* c9 J4 q
                          {
7 {6 H( S' `1 v" m. ^+ Q                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)& L8 O4 j: V8 _) r6 r
                             {( L9 C( ?$ z" `, _" j
                               Variant a = v.GetElement(i);
# p" a# W% n. I# x& ^8 }                                if(!s.IsEmpty()). r# ~8 W7 Q& \7 w# N
                                 s+=", ";( E1 u. P5 L3 _6 z
                               s+=VarToStr(a);
5 F( H" Z+ z# l; n6 @                              }" O9 I7 ^- N! r. j  e2 M7 M1 q' s; i
                          }
; l+ f1 N: u5 R6 |                          else- ]  v$ z& M, W3 H
                          {
7 ?8 Y4 Q* M. s( S# e2 O2 y1 N                             s = VarToStr(v);
! S$ ^* ~8 U2 P7 o9 X" x                           }' m6 q% ]( l9 ^' l8 {2 h
                         lpList->Add(AnsiString(wsName)+"="+s);
; r  \, f4 X$ P; j) K/ h                        }3 D9 w; |" l4 f- k$ u$ w
9 r7 ]: x& C0 J
                      VariantClear(&vValue);
. m& W0 d( L, o( Y* x" g                       SysFreeString(wsName);
* l6 F7 N! S/ K0 `                     }
! u  J/ I' h# i" b                  }! f, U; S5 s; h( P" _
                if(pvNames)SafeArrayDestroy(pvNames);% D) ~! [$ E# h6 W6 u3 c8 Q+ k
                iEnumIdx++;7 E- z0 z3 I% v
              }. l+ v+ g3 u  P0 F
           }
' C$ Q9 j5 k+ I4 Q  h           if(pClassObject)pClassObject->Release();
3 S! @) L) w1 f' y+ w; |         }, g: j" s, n! G" z5 _5 v
       if(pEnumClassObject)pEnumClassObject->Release();
! n; z& q' v( D% E  w' z/ Z9 u      }
, `3 h0 T' k% a2 o3 N; `# n6 h     if(pWbemServices)pWbemServices->Release();7 X  E9 ~' o1 l9 u
  }
" r- d+ e% Y; }8 h/ T- h  if(pWbemLocator)pWbemLocator->Release();
, I0 ]: U# K$ T}# A! `0 m+ e( B
//---------------------------------------------------------------------------: w  E* ~% D# }5 S% D# d0 Y
; q' k" h1 H1 G" H+ v! a9 h
// 通过 WIN32_bios 获取 BIOS 信息:
8 U, h& Y: ?. qvoid __fastcall TForm1::Button1Click(TObject *Sender)- a0 x% R8 N2 ]6 O% ?% M7 |
{
& D1 ^0 u0 s8 m) u+ j    Memo1->Lines->Add("================== [WIN32_bios] =================");
! ~6 Y' g8 O- ~    GetWmiInfo(Memo1->Lines, "WIN32_bios");/ Y& d& S( }& l2 K' e/ J' M" ?! y+ f
   Memo1->Lines->Add("");5 ?0 z" T# ?! n# B$ Z  x' _0 [* Q! |
}
8 I- [) A1 j4 Z; r4 r* l
% e; ~+ T0 h8 J: U) w5 f7 h--------------------------------------------------------------------------------
- N1 E: D5 i6 q  V2 P% h# K7 K) `2 A
WMI 可以访问的信息类型有:5 u# G0 [# ?7 @' t6 g& T* `
  Win32_1394Controller
6 v: S' Z) I& H! m1 C6 E   Win32_BaseBoard
6 C6 [& x- T3 H, q: l8 t$ i   Win32_Battery& j3 |+ d3 |1 g: q/ d4 H  p/ q+ O  k9 `
  Win32_BIOS
6 a. p: \- H9 W# [+ r1 F   Win32_Bus
  D( S9 g0 S: V5 l8 Y   Win32_CacheMemory
- u  E  G" O9 S& x7 h   Win32_CDROMDrive( j/ o  V4 ]: v* r. b- W' u( b
  Win32_CurrentProbe1 _4 D# u% ^% {6 g# D/ E2 I
  Win32_DesktopMonitor
% f$ r) K% Z" V5 q& y2 d   Win32_DeviceMemoryAddress/ g. B- N7 q: j( L3 S1 b
  Win32_DiskDrive
! }; c7 Y" T1 p# x7 f' F   Win32_DisplayConfiguration
" k& x1 H9 R; h* s, @5 F5 Q   Win32_DisplayControllerConfiguration
+ e4 y3 D3 o8 h2 y5 @   Win32_DMAChannel
" }5 j) x  e+ Z+ u+ {: E8 @& s   Win32_Fan
7 W. }5 s# D; h' I! m   Win32_FloppyController
* G, \- }8 v, T* d+ J4 a/ @. }   Win32_FloppyDrive
! {6 D+ f! A) w/ r7 q: J+ f1 X   Win32_HeatPipe
  T, @- X7 Q( n# b8 @" i   Win32_IDEController
. J- a& l9 w8 V% D   Win32_InfraredDevice
; p0 K; I8 T, C) d& j" H$ V+ H   Win32_IRQResource5 v" D6 d9 Y6 J9 B: D
  Win32_Keyboard
  n; G- x9 H) }  ?% P   Win32_MemoryArray
5 G% P6 K: d6 e   Win32_MemoryDevice: g  F  |+ y# A3 @
  Win32_MotherboardDevice
1 E3 c5 Q1 u, R8 o   Win32_NetworkAdapter  C' ~, \$ N6 y; y0 b8 I
  Win32_NetworkAdapterConfiguration0 Q  X0 _$ Y6 S* o/ {0 b* y! H
  Win32_OnBoardDevice
/ Q3 w2 ?, @: {( c; g   Win32_ParallelPort
4 V& p4 `! J* s% @3 w   Win32_PCMCIAController
, {3 X6 z9 H' M! p& D9 Y7 w$ D  F   Win32_PhysicalMemory$ h! P% k8 o  Y
  Win32_PhysicalMemoryArray
( I" V  M6 O7 G0 d   Win32_PnPEntity
; t8 ?6 u1 w! x% k0 M$ \# j: J4 V9 ^   Win32_PointingDevice! s2 ~& C2 Q0 v0 n/ L& _5 }1 D
  Win32_PortableBattery" p7 X# ~% [) ], W  C, T- ]" J
  Win32_PortConnector5 O6 Y0 n( r6 b0 r- M% a
  Win32_PortResource
0 {( S, L" r6 s9 a1 J- I   Win32_POTSModem2 J3 L& N: F8 Y# a: y6 B( `
  Win32_PowerManagementEvent
1 H) g! N% y1 O8 p  u   Win32_Printer
& H. H2 _; R: I7 ~6 W1 J' q   Win32_PrinterConfiguration
/ J/ t2 @2 H" M& F: [   Win32_PrintJob
5 N- c  ^* h8 ~% k9 h% J   Win32_Processor
% B( |+ M/ L4 o  x2 R   Win32_Refrigeration
# l3 g5 o' d1 r# T3 E! o4 l   Win32_SerialPort, V( e8 u5 s4 N' X+ P  V' N
  Win32_SerialPortConfiguration' S& ^, z4 J4 P! f* t  r3 @; l
  Win32_SMBIOSMemory% U' G! j* c3 Q; ^& I8 S
  Win32_SoundDevice
# o% Q) T4 O1 ]/ a( a2 F6 z+ H, M( o   Win32_SystemEnclosure
# Q5 H" s! W- z8 C   Win32_SystemMemoryResource* S& `( L$ S( O" B  V1 k
  Win32_SystemSlot
  K7 L# ^% ]+ g8 G' q3 \: |& r   Win32_TapeDrive" S( h0 L" ?3 v+ g6 I: P6 j7 y
  Win32_TemperatureProbe5 c/ Q1 |# f/ j4 I" w1 \- {
  Win32_UninterruptiblePowerSupply
+ L  v$ H- o1 \1 i- J8 F" f   Win32_USBController' l5 Q$ y; @% D
  Win32_VideoConfiguration7 w* d& I" X1 z% \* W6 d
  Win32_VideoController6 d+ W2 z- B7 H/ y* m( I  o$ A6 k
  Win32_VoltageProbe) p% a$ O2 f, G* T& e0 t
! y% t& f  g" d, i+ O3 b/ w
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 05:14 , Processed in 0.021846 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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