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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
3 v& N$ e1 Z0 ?7 [8 y( n  I! f! b6 K. z1 S# c3 `8 ]7 L
) V" I5 m4 D9 a& V
--------------------------------------------------------------------------------& z: u0 H, `6 J* d2 W2 g0 m
WMI: Windows Management Instrumentation (Windows 管理工具)
( T. m9 T( E5 Q" s5 @& D   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ; M' s% @  W# B& a( Z8 ^: X
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
  Z0 S1 q# y! T5 X  `$ r8 s; ^   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ; c5 E, f! T  \- i& K
2 k. @. s5 j1 Z& D# y% Q7 c
--------------------------------------------------------------------------------
% r  Z6 X0 @4 z7 V6 g# {3 a8 XBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
) a- B3 h. s: t6 l+ }: s
7 D; O2 u3 L5 \5 x) f--------------------------------------------------------------------------------
6 }( c3 h) w1 j+ I0 f① 初始化 COM 接口:
" d# Z: m' ?( L2 D+ X1 U7 ~& h6 n   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。: x) D2 L0 t$ N, G8 o. ^
  这两个函数在 #include <comdef.h> 里面定义。
$ Z, K4 \1 N% ^9 t
" O- T/ f: N# I9 f' G$ m: u② 获取访问 WMI 权限:& q; l+ n$ q. W/ V1 P% i
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);4 I: |2 x$ j# i2 C. F4 i
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。$ T! o  ^$ u6 T! V3 u4 }" p3 ^
  m$ D/ Y% n2 ]9 K
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
% K4 p2 s" f" O) r* f" O0 J   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。9 ]0 Q- b% F6 c1 w4 u  u
2 @# a; F% S  @! {+ \( a
void GetWmiInfo(TStrings *lpList, WideString wsClass)
  I) j9 k: G3 S+ E/ Z, @) J{3 f3 p7 b1 w5 d( t
  IWbemLocator *pWbemLocator = NULL;, p% e" [" g5 p* K2 S8 s
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
! g( Y1 C7 y8 C- n   {8 L5 W. r+ l( r# N( Q2 f+ }
    IWbemServices *pWbemServices = NULL;7 v) e4 H) t) S' A
    WideString wsNamespace = (L"root\\cimv2");, M# o# |- [' M0 z6 j. _
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
- W* n! N' m5 t; t# \      {
2 a$ D( _2 j: r1 _! a! f  N9 A        IEnumWbemClassObject *pEnumClassObject = NULL;7 J9 @5 T3 z- _+ g* P. ~
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
( z" B( d8 t0 e  y) Q        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
  h8 H/ _+ F5 O" a6 R2 K1 G. B8 T         {  w7 X' K0 v% {) R, o
          IWbemClassObject *pClassObject = NULL;. \* O3 O" X! t# h: ~# G
          ULONG uCount = 1, uReturned;
# q2 \/ o$ j+ T1 d6 [" g           if(pEnumClassObject->Reset() == S_OK)& N* l- o! Q1 ]  F
           {" P* M" P3 c( s5 Z- C9 ]
             int iEnumIdx = 0;" `  k  m' q* ?( E$ N2 Q% z
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
. a) ^% J2 o3 T+ b' _1 f5 I               {
$ C2 k' _& }) ?5 u                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");6 N- U, {& t6 I: ~
3 Q$ r: [7 U6 n" T% s9 k9 U
                SAFEARRAY *pvNames = NULL;1 i  E+ f# J4 k( R& O2 p3 b* k
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
# G; w/ s4 e0 a( ~                  {
7 W* P6 h( n6 d                    long vbl, vbu;
' ]9 |2 D7 k- l2 I9 T4 x/ E- W                    SafeArrayGetLBound(pvNames, 1, &vbl);
0 {! }3 u' Y+ z7 Z: p9 O$ g- o                    SafeArrayGetUBound(pvNames, 1, &vbu);  }2 e+ {9 O5 ~) i; a3 s, ?
                   for(long idx=vbl; idx<=vbu; idx++)  L) Y+ m* B5 A+ h7 k
                    {4 T5 l' I! E, A, \
                      long aidx = idx;
4 D+ q& R3 w) h7 R2 o3 r( m9 P                       wchar_t *wsName = 0;) V( u" j2 r3 j
                      VARIANT vValue;
6 K2 z2 v. {( l3 A* x8 \                       VariantInit(&vValue);0 b/ ]: }6 R0 n+ P4 l# z" Q& T
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
! C+ ]) e& w9 K# N9 ~# z
! j) e% A6 c- P! H" Q# u6 P' X5 z                       BSTR bs = SysAllocString(wsName);
+ _! e. I5 Z* y4 Y  \1 u                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
- Q- M" v8 H0 z) d* Z                       SysFreeString(bs);
" O, U: N; A! b9 L# I  M
: H. H$ o; [1 `: U3 u7 P+ ]; c' g5 Q                       if(hRes == S_OK)
7 I% n6 y" d' Z# F2 ]                        {. W& i! E0 T. N" p; w% `
                         AnsiString s;
: u  E: f4 u6 k- d                          Variant v = *(Variant*)&vValue;; w6 t. h& e# X" g8 v
                         if(v.IsArray())
& R/ a% T" U5 C5 D) T; }                           {
6 V% k' @$ X. W; c" g$ I                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
9 Z& p7 r# X: b1 [  ]+ v, e                              {
- \! R1 @& K$ @5 J8 g! N- v                                Variant a = v.GetElement(i);* ~& t& W$ x  W+ L
                               if(!s.IsEmpty())8 K( N7 j# X& [/ @# s
                                 s+=", ";4 O) i% T9 p6 Q' j( ?
                               s+=VarToStr(a);
# H2 r; {  N) I$ v                              }! g5 m+ [# D3 I7 d
                          }, B% x4 Z. N2 E) ~; p9 _
                         else$ r! R* {8 s7 P0 [' d
                          {( W) Y  k: U' F$ R4 ^
                            s = VarToStr(v);
3 ~: f3 G9 f2 o                           }: {. m8 p6 Q8 p( R- q8 @
                         lpList->Add(AnsiString(wsName)+"="+s);
. e, T5 f3 @5 ~: X( S/ _                        }8 g* d# q( Y! [8 `9 ^
1 a  R- O6 O; n6 ~7 q
                      VariantClear(&vValue);
4 E& m/ V! j. z! k/ B                       SysFreeString(wsName);0 w6 u( D, @4 e5 P
                    }
4 z- ^. I4 d- |9 a7 w                  }0 A8 I3 ^1 J  ^( w1 @' O1 ^
                if(pvNames)SafeArrayDestroy(pvNames);
9 Z$ Z$ g& M# F" b( a                 iEnumIdx++;
* d& m+ L& x+ Q1 B8 F               }  N/ v9 D4 D! B5 j$ N% U
           }
4 ~; ~6 M! |) v/ @( _           if(pClassObject)pClassObject->Release();
) I9 o, ^/ [/ X( Q         }
, `# ~  u2 v# V. N        if(pEnumClassObject)pEnumClassObject->Release();
* H! I& p$ t' D! s, \8 S      }0 ?! [& L4 {1 u: U( |5 L# ]% P
    if(pWbemServices)pWbemServices->Release();% ^- V( g* |! `9 E# J" l- L
  }* e4 L! S3 E0 [9 y# E" J7 U2 U* l
  if(pWbemLocator)pWbemLocator->Release();
3 Z& `7 f" a& G6 l}( |8 u+ S/ h8 K! f4 p
//---------------------------------------------------------------------------
7 ~( v% G  ?/ D% p
' _- y; ~- C3 w8 R% E& b// 通过 WIN32_bios 获取 BIOS 信息:
$ m% m! Y; B. u& ^( Kvoid __fastcall TForm1::Button1Click(TObject *Sender)* m* n! @6 u. V
{" ?& J* Z2 E+ v4 |% x+ a9 r8 A% C
   Memo1->Lines->Add("================== [WIN32_bios] =================");; L9 N+ W+ K4 @8 U1 m, W% U  g+ S
   GetWmiInfo(Memo1->Lines, "WIN32_bios");3 x5 b/ m7 ]* Z' y& \  z
   Memo1->Lines->Add("");) A6 T* w- j" r: b7 N
}/ a; H6 k# s# U

+ P% N! d' ~+ w  B% n--------------------------------------------------------------------------------) l8 P8 C1 D( C+ s! d

% T4 r1 `; c- R- e6 ^) i& d3 FWMI 可以访问的信息类型有:
5 q* z; m2 E' I: {   Win32_1394Controller
7 S) ]" ]& w( J! Q   Win32_BaseBoard" B) y2 y3 U: ?& x9 }
  Win32_Battery' [! `3 D& x% r/ V: J( e  m, u1 }
  Win32_BIOS
% E5 T& Y; f- C7 Q2 r+ k5 R   Win32_Bus4 `7 ]) i0 q2 K. K2 F
  Win32_CacheMemory
1 D1 q  z4 S2 m% o2 ?   Win32_CDROMDrive
9 [, L, ~0 P5 E4 N1 Q% G/ n0 l& X   Win32_CurrentProbe: A1 ^' u, \* Y9 N! g
  Win32_DesktopMonitor1 W5 P6 \. e$ f% P% C
  Win32_DeviceMemoryAddress+ U! @. c/ }5 Y3 u) F+ o9 k. R
  Win32_DiskDrive
5 Q8 R; h7 R' H   Win32_DisplayConfiguration2 n. {9 n. g" X! m/ h7 P4 p+ P
  Win32_DisplayControllerConfiguration
. k; }: k# l) `' H8 D. a1 m   Win32_DMAChannel  C4 n! _* b! F( ~1 d; q- h
  Win32_Fan0 ~/ I% L3 G3 `
  Win32_FloppyController! e- d8 g' a( H- U% \/ J; M
  Win32_FloppyDrive
& P- I, H. v9 A, v. \) b   Win32_HeatPipe3 P) W( O. i1 M& [% H3 r# p
  Win32_IDEController
( o8 o8 m0 G: J- t+ [   Win32_InfraredDevice
2 N6 C0 M9 Y: f2 e3 B1 b; ~   Win32_IRQResource, v) w3 }& S+ ]! P1 b+ O
  Win32_Keyboard- c& e" A" z2 N, z4 k
  Win32_MemoryArray
3 [) D$ X3 a  I% M, N: P   Win32_MemoryDevice
; v$ C, M  Z( X. `7 q5 {! Z/ _   Win32_MotherboardDevice
& }1 ]5 B% x: Y6 A* X; V4 U   Win32_NetworkAdapter
! s7 ]5 C& u9 l, x$ D8 ]   Win32_NetworkAdapterConfiguration
/ p- u- Y+ q& W% _" T8 v: U   Win32_OnBoardDevice6 X2 j3 Z+ c# i; s# v- m
  Win32_ParallelPort
( `! t6 v- Z# H; ~/ d1 d2 f& ~# Y   Win32_PCMCIAController/ [! N) y1 ^9 O+ k3 Z! E0 W# |
  Win32_PhysicalMemory
9 L+ }6 {% c7 |: b1 i# E1 ~# [3 W) v   Win32_PhysicalMemoryArray
  h* D; |* K7 R2 `$ B9 Y   Win32_PnPEntity
, U# F7 [5 v* j" l+ Z4 ~1 O! r3 I0 S7 T   Win32_PointingDevice
& e  F$ D: C( ], _( d) N   Win32_PortableBattery/ c% P/ b7 Z/ }' b
  Win32_PortConnector* a/ I7 m0 F4 V- n
  Win32_PortResource) C1 g8 D' K0 L: u, p9 I
  Win32_POTSModem; j9 l3 y& U% _# ]1 B
  Win32_PowerManagementEvent, F: r9 @" o: b; A
  Win32_Printer) c8 ]$ ?% J9 W- A
  Win32_PrinterConfiguration( [. r2 v" Z. P
  Win32_PrintJob  d) m1 R) `% r
  Win32_Processor
: g7 F5 c: ?9 y# x9 b7 i   Win32_Refrigeration: {+ p) N' t6 @& K
  Win32_SerialPort
2 U: N5 _0 f6 A" I1 @   Win32_SerialPortConfiguration
7 B5 y' e! f  U. X* ?! {' `* j   Win32_SMBIOSMemory0 m' l+ g( [' X; @4 i# x) N7 x; u
  Win32_SoundDevice
6 ?# C7 ?( _4 E* T+ Z1 `   Win32_SystemEnclosure' U8 {- C' s8 v
  Win32_SystemMemoryResource3 N( P: g9 `# P; X% ^/ G& M! V  y
  Win32_SystemSlot
4 Y/ l! w: o7 y4 o  g7 g' H   Win32_TapeDrive
2 u9 u0 _% V' z  p4 F9 B- I   Win32_TemperatureProbe
2 @+ [4 o, g4 S! Y: Y6 G! @   Win32_UninterruptiblePowerSupply3 B3 I# a: |# x) H0 x# J
  Win32_USBController5 x# j6 i6 Z+ E/ {) N  f1 D& Q$ p
  Win32_VideoConfiguration; h  M0 @& @- x( l7 t# A: D
  Win32_VideoController
  g) C9 G; A2 m( H! A5 V2 d5 d   Win32_VoltageProbe, `2 E- C+ V& w4 G. X8 t% I
3 e- v& d) t6 D; f8 l
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-9 16:35 , Processed in 0.018873 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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