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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
: o% R; z8 w* Z; t$ V
: t" g  Z8 y" Q: F$ ], Z
& ^5 ?2 p* z8 b, V--------------------------------------------------------------------------------
& J9 C0 x( h( m/ l+ e) iWMI: Windows Management Instrumentation (Windows 管理工具)
# r- }7 J5 \9 h0 `" B8 A$ f) Y   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 " H; `) |: t$ E* j# [" r
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
5 I# z; z& t" X! @: d' G* @   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
' j. S! P& b+ r5 y2 A
& W# V7 {3 n# ^" Q( T3 `--------------------------------------------------------------------------------
, y3 ]  u( d2 a& TBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
9 x/ {( Q2 P5 |7 S: k
, ~! N8 j3 B* J. e--------------------------------------------------------------------------------
8 \" }6 i$ D2 k1 D1 k6 \$ L3 r① 初始化 COM 接口:4 f; c* l+ T4 ~& e/ k: {; g1 O' y
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
3 c. W1 F% x: g/ y& ?& F- u   这两个函数在 #include <comdef.h> 里面定义。
. c$ V6 V' }* o) f0 r$ b0 O  Z1 g6 ~, A
② 获取访问 WMI 权限:% f$ G2 Y; a8 s. l, d7 s7 o. N. m
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);& F1 Y. p$ z2 E7 h. V$ k
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
! L3 P: h6 e" }% m3 j7 E! Z8 }6 ~8 }1 I4 w
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:/ M- ^9 U: [/ b3 t
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
( @# A$ @  L7 M3 `1 k- k9 B: Z* e' B, s7 V! C" b: v
void GetWmiInfo(TStrings *lpList, WideString wsClass)
/ \- u4 _7 y3 P{2 }8 f  X1 d' l- w
  IWbemLocator *pWbemLocator = NULL;
' j9 S6 @0 T2 x0 @  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
1 I7 Z$ L, T% O% i   {; N, z# X' K- N" k
    IWbemServices *pWbemServices = NULL;
3 h+ o& M; |. {( d3 q1 a, N     WideString wsNamespace = (L"root\\cimv2");8 \! G# ~" ]2 e6 v# K: W
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)9 o9 ~+ Z2 e9 V& \( T8 X
     {
7 m3 Q: \3 _/ r        IEnumWbemClassObject *pEnumClassObject = NULL;6 J5 K/ e* N" f; r( P/ @( e$ v
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;2 e' ?6 ^0 T2 L
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
, J) l) G% T' u* D7 l" g( w# v$ n7 O         {2 e6 `% w# d) D7 {. d
          IWbemClassObject *pClassObject = NULL;, U% g" D1 W5 C: o) ?
          ULONG uCount = 1, uReturned;2 y' b6 F; o1 g' y8 F# Q
          if(pEnumClassObject->Reset() == S_OK)
+ v1 Y" a+ e, `1 n0 O! V" z            {% G6 [. W5 F$ `& t" j$ p
             int iEnumIdx = 0;
6 C% Z9 _4 L- I  w              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)0 |. `- m1 m5 S# P
              {( z7 Y" o' t1 M4 ^5 C4 X
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");% _2 J& f% Q# }5 L9 f% u& }2 k- T- P

" p8 H, @4 J% M% C6 Q7 u2 \                 SAFEARRAY *pvNames = NULL;
* O9 `! e+ Y' B+ u) r                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
/ I* `7 Y5 O) O& ^( M; i                  {) v3 y9 f& p& P$ [8 s
                   long vbl, vbu;; E5 Z4 I0 k( j+ m7 \/ j3 h
                   SafeArrayGetLBound(pvNames, 1, &vbl);
. _0 t; J3 }5 Z6 m                    SafeArrayGetUBound(pvNames, 1, &vbu);- t, p+ C7 G3 G/ W5 S) P  ?
                   for(long idx=vbl; idx<=vbu; idx++)8 e0 _- k8 ?2 E
                    {1 H: A5 z. o2 c) O! _* Z# f7 {
                      long aidx = idx;8 G  x1 _$ R! J8 e* F
                      wchar_t *wsName = 0;
6 i7 z. v. C; w, M6 r! g. I                       VARIANT vValue;7 _, Y- x, D& Y( ^
                      VariantInit(&vValue);
/ b6 d1 o; I$ B, z$ `" G                       SafeArrayGetElement(pvNames, &aidx, &wsName);7 U3 Z2 y' K& Q

7 p# l* T+ a6 C5 G- h                       BSTR bs = SysAllocString(wsName);/ L# {# \' J. q8 U* s
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
$ X2 V; P) y% b" z% ~" l                       SysFreeString(bs);
# U8 G! X  _' L6 x
: d' E( h: C% w3 [  X+ s5 c! p5 ~                       if(hRes == S_OK)  a9 x( t, z1 K. k" B  v/ Q; q! \, e
                       {( g# b# }* D9 G. T- Z( n/ K4 \
                         AnsiString s;
5 Z% t: L+ T' o3 U3 d% \+ @9 H" T                          Variant v = *(Variant*)&vValue;
; S8 r$ A) b2 t% T                          if(v.IsArray())
! G0 X( \" a( L& O) f                           {6 q" S) {6 J- b, j9 j! p
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
0 a4 r& `1 H& t& h                              {
  f+ W7 R; m" ]8 L' }! f                                Variant a = v.GetElement(i);' p# y9 J6 [( W5 y* E( J1 f! N8 ]
                               if(!s.IsEmpty())
7 Q( S0 S" M* X/ b3 S9 l                                  s+=", ";2 f/ |6 n; O& Z+ Y! J5 j6 O& c6 b& \
                               s+=VarToStr(a);/ j/ ?: M5 U7 v( I$ Z
                             }
! k9 n" E; {& P! W                           }  g0 G6 K5 o  X) d0 B
                         else
- V; S; s0 [: F- t3 X6 j                           {; W* t! h8 e; |4 i4 H/ l
                            s = VarToStr(v);6 X$ E9 a  \) U; P3 T/ o
                          }
: U7 s! [7 J9 l) d9 z                          lpList->Add(AnsiString(wsName)+"="+s);
  r( a/ ?' O, O5 E) }, E                        }6 z; S# x' @# j3 f% D" ?

8 J6 p% w5 R% a                       VariantClear(&vValue);: q0 x& q9 ^: ?. ]; }7 t# G8 j
                      SysFreeString(wsName);
/ G) M" O+ }/ k% \3 l; D                     }
* `1 G# y0 Y' U0 @                  }5 O  y# w+ d9 V( {
                if(pvNames)SafeArrayDestroy(pvNames);  x2 t% s0 ]6 g" ]+ k6 }
                iEnumIdx++;5 j, x' ^$ A( h/ t) O
              }( y  C# z, b* q6 C8 j7 d
           }9 [& d1 g! p6 v2 P( l" k5 K4 w9 _
          if(pClassObject)pClassObject->Release();
3 @% b) c8 a+ a4 b         }
$ R3 {0 P0 A" I0 j9 J        if(pEnumClassObject)pEnumClassObject->Release();6 t; e' g+ B/ Y8 `. q1 _
     }4 M# `+ E2 ^" o7 Z& h/ @0 N
    if(pWbemServices)pWbemServices->Release();2 q0 I/ T/ X3 O/ p9 M9 d- m
  }
( U. W$ W" T( X  if(pWbemLocator)pWbemLocator->Release();
+ ^4 \4 q1 F( _* M) z* H7 F) k* d8 ]}
# o( q# }( n* k. F# n//---------------------------------------------------------------------------5 Q0 O5 ]9 T+ X5 m
$ a. q- Z# [/ A' B- h) N
// 通过 WIN32_bios 获取 BIOS 信息:8 B; }: r; C1 o7 A+ m
void __fastcall TForm1::Button1Click(TObject *Sender)
( D( j5 N/ ?) w{: G( V. B4 e4 s* h% P! T( N" t7 n5 W
   Memo1->Lines->Add("================== [WIN32_bios] =================");; Q' |6 ^. h; l- ]/ z
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
4 C$ Y' L' v: i* _1 g    Memo1->Lines->Add("");
$ p& d" u4 g, M' [}& J! T/ m; r$ n9 V% I% ]7 ]/ N
+ V' i% \( i# V8 |
--------------------------------------------------------------------------------
4 q: X' E2 D# n+ s) V# g$ O
4 e: A( S7 m1 v- K5 s$ {  t* @WMI 可以访问的信息类型有:4 [9 h" `( \/ E' g% T" r5 K
  Win32_1394Controller8 A* f/ ]% ]& a" k' K
  Win32_BaseBoard% ^5 s! l/ X1 n& f
  Win32_Battery0 H5 @" m0 [8 \8 V# j( W: c6 L
  Win32_BIOS
, G& j- @( [  E6 p. K   Win32_Bus( U) c* H4 ^; Y+ d& l
  Win32_CacheMemory8 L  i9 ~  [  \+ |) x1 l. W
  Win32_CDROMDrive, L* z4 L$ B! b
  Win32_CurrentProbe
; t4 h2 r; M8 K6 }2 x8 `$ _$ y   Win32_DesktopMonitor" L7 _0 Y  E# D/ F6 g& C$ m' c( Q5 W" Z
  Win32_DeviceMemoryAddress
# A- w) D4 Y1 ?   Win32_DiskDrive  ]  o) l8 `  o! i( R$ }8 j8 X
  Win32_DisplayConfiguration5 F8 u- p5 T+ U
  Win32_DisplayControllerConfiguration' h. Z6 H( B, T. {8 X
  Win32_DMAChannel
0 S6 D4 Y! m5 p+ ^6 {$ g2 m   Win32_Fan
1 y8 |- @; v7 @5 h   Win32_FloppyController
. p, e- g/ Q1 t4 r& q# {3 [   Win32_FloppyDrive6 y% q; R& |3 Y- ]0 I3 }
  Win32_HeatPipe
/ Z& Y# O( a! Y) b2 q. x   Win32_IDEController
; W5 J! i) I0 z% l' g1 S% d   Win32_InfraredDevice
" z; [& A. ^; O7 q0 C7 V! Y' t   Win32_IRQResource
, |- c' b$ S6 s3 z& b+ l3 ^   Win32_Keyboard
$ p) Q" v0 D0 a5 R6 O9 T% a   Win32_MemoryArray
+ Q( w( q/ n& _" B7 S: w   Win32_MemoryDevice# T/ l% Q! b6 D6 L! o  C
  Win32_MotherboardDevice
8 [5 L0 A0 d+ x& A4 ?! |   Win32_NetworkAdapter
1 Z; J0 E. ], Z   Win32_NetworkAdapterConfiguration( Q! o8 {% k" C9 V1 H& J
  Win32_OnBoardDevice
5 p6 M4 s7 v0 f3 N" M   Win32_ParallelPort" N# r" `. L* X! w7 V
  Win32_PCMCIAController/ r* s- Z" o0 v8 l
  Win32_PhysicalMemory$ D% ]5 z$ ?/ E" `: v0 e
  Win32_PhysicalMemoryArray
. G& v+ U3 Y1 k) V7 ?   Win32_PnPEntity
1 y& \; r# B. Z6 H( {" w) Q) y   Win32_PointingDevice
% A/ X$ d: u3 ?2 N; N   Win32_PortableBattery8 V. k) c) {4 t* F; t
  Win32_PortConnector
: |2 q  n7 i  z2 W( q   Win32_PortResource$ U0 R( G! D( Q* l* x5 ~
  Win32_POTSModem
! q' J5 Y2 g& @% h1 M& N   Win32_PowerManagementEvent) G+ V9 X3 P; o3 y' |: Q2 J
  Win32_Printer
7 R- c/ N% e  O7 `   Win32_PrinterConfiguration( E: g: M9 O$ o5 ~! p! M/ E# b
  Win32_PrintJob+ h' g3 S0 @% H' v9 [/ Y$ `
  Win32_Processor+ _4 ]/ n. J# T2 s8 m- S, z  ~
  Win32_Refrigeration
" }+ L& |0 @1 f$ j8 E' \   Win32_SerialPort
7 m# J: T; H, W; W& y! d   Win32_SerialPortConfiguration
: U9 R4 `! j, `& P' ^   Win32_SMBIOSMemory
$ a- _4 x0 c8 O2 W   Win32_SoundDevice2 X7 f) S, @/ @1 [
  Win32_SystemEnclosure
6 `; s& _7 Y9 m, S# Z  D   Win32_SystemMemoryResource
' @9 ~! X; E% k+ T0 V- F7 e# U   Win32_SystemSlot
. T, m3 L. f, g" W4 s2 E8 H# |3 B   Win32_TapeDrive2 n& O1 D. h9 E! u7 h
  Win32_TemperatureProbe
# G! L2 R8 u; o  J; w& ^0 M   Win32_UninterruptiblePowerSupply* X% _! d  G  B5 N# P, N
  Win32_USBController
5 U5 i+ k; q3 C" O   Win32_VideoConfiguration% C+ m/ v- h3 g$ P
  Win32_VideoController; g( {$ @- q* ]7 R( b
  Win32_VoltageProbe# b1 N! }# {! U8 f$ V! p" Z
$ l, ]! O  {1 @/ j  o' |8 W2 ?
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-7 06:35 , Processed in 0.019941 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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