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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
5 {2 n; }. ~- ~# r6 w5 I$ z4 z
  S' _5 z% l8 ]7 Y) o5 `, M( d/ F+ y5 p/ d3 S# U5 I/ g
--------------------------------------------------------------------------------
9 B* e( ?% N6 W& |0 RWMI: Windows Management Instrumentation (Windows 管理工具)) m$ v" u$ J* [& i9 I
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
) Y# g' C: j2 K& L8 {  z   利用这个工具可以管理本地或客户端系统中几乎所有的信息。5 A7 t+ O) y1 E2 D- A3 m
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ( S, n- X) g3 r( t

* O9 k% p% V. N! K& U2 r) F--------------------------------------------------------------------------------
. a9 C/ x/ ~; r7 Y9 m; l& T5 t% fBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
1 F* }# v1 T4 J  P5 z; P, M4 Z9 O. `0 y7 i8 X
--------------------------------------------------------------------------------- G* F- b: {* e' m# m
① 初始化 COM 接口:% ?2 C$ s4 E# m0 q& B. H
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
; D' ~5 H9 F( I1 N3 E* N  F! N8 J   这两个函数在 #include <comdef.h> 里面定义。. F$ ^7 G2 J! K* ~/ m9 j. G' M2 ~( \

5 q- e+ O( Q2 A) `② 获取访问 WMI 权限:
- K8 l0 C% l* x: ]. F   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);( p2 [, x, _6 I
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
7 D& f! R% G% Y0 q  x! W$ c& o7 d" \
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
0 Y. v1 ?  J2 V1 \   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
' {1 V8 W1 a( `3 J$ n9 [; M- F7 [6 z' ]. d7 _
void GetWmiInfo(TStrings *lpList, WideString wsClass)% E$ g2 p; G/ c+ [, L& P  s
{6 F% h  ~( e+ s# P/ H2 h" y
  IWbemLocator *pWbemLocator = NULL;
& J0 {+ }+ f4 a) q% @  E  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)" l  v) `! V5 x/ M+ E
  {
9 h$ K* j; }$ K& A/ H! O- p: C     IWbemServices *pWbemServices = NULL;! q9 s2 N" H* ]' V
    WideString wsNamespace = (L"root\\cimv2");6 |8 x% o6 t* X3 k+ ?, S
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)2 p2 E# E# }. u7 W. ~$ F
     {
/ o  N. c; O* l) v+ l1 y        IEnumWbemClassObject *pEnumClassObject = NULL;
9 [, H) @# d$ W" |3 q        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
) L% ~( Y9 G: [! q, T! S% L        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
" ]2 h. K  i  Q" p7 J% X         {7 f5 \1 D' \4 n) Z5 ~5 N
          IWbemClassObject *pClassObject = NULL;9 V9 R: C  L4 [
          ULONG uCount = 1, uReturned;$ w' W0 U/ r) \- {: z& A
          if(pEnumClassObject->Reset() == S_OK)
  _& Y! ?8 X: b3 _" W3 V            {
" p1 g2 r. f5 W: X* }              int iEnumIdx = 0;
4 k/ \5 N; u! N- K$ B) I% m9 C              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
# ]$ \! G" C# q+ @) J# c6 m               {
" R- e" U* A2 j  s                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
" Q* C4 b% ?' k2 M
8 @2 D& F7 ~" h5 m) c6 K                 SAFEARRAY *pvNames = NULL;! |* o# x$ T! k. R8 p- }
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)$ }4 Q% F  m& g- e
                 {
5 R% \6 z' v% `  W- X                    long vbl, vbu;3 j6 B) f2 p/ C$ j9 g
                   SafeArrayGetLBound(pvNames, 1, &vbl);: T  ?' M# g! m" o% q% l* J7 K5 U
                   SafeArrayGetUBound(pvNames, 1, &vbu);
) x- Q. b  _! j% c+ {- t                    for(long idx=vbl; idx<=vbu; idx++)+ c2 p, a$ P3 |1 K  c* y" }* U1 \
                    {& B- v# O* M; m" c1 ^
                      long aidx = idx;" C1 [( _5 R/ q! I
                      wchar_t *wsName = 0;& Y" u/ b6 K6 z, n6 ]# j
                      VARIANT vValue;
/ A! j) r- z6 M1 F& f, V+ x' i                       VariantInit(&vValue);
1 O3 R  y5 ]- w- o7 F0 T, P, ^% R8 _                       SafeArrayGetElement(pvNames, &aidx, &wsName);7 Q2 B7 B  P* P( \9 U

& z' }4 n* |! h                       BSTR bs = SysAllocString(wsName);
" d, @; i# ]+ Z. m5 |3 F                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);7 J- p1 m# Z$ q7 u- `
                      SysFreeString(bs);- s) i2 c! C$ z! ?
+ Y/ C- L. Z# z# x: C5 L
                      if(hRes == S_OK)8 N! P- n7 n$ H$ U' p+ ]: c' `) O8 l
                       {
6 I3 \. ?  a- [4 L; p                          AnsiString s;
0 u5 V; s/ F5 Q7 ^% q' a/ _$ c                          Variant v = *(Variant*)&vValue;) {7 n7 A+ H9 z# Q
                         if(v.IsArray())
0 f# a5 T7 |$ p( H9 [                           {
7 x& S9 [& p/ W                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
+ y7 {) F& }: K7 v) i1 @! `                              {# x- C# r5 f: X: \( Z8 Z; q; W
                               Variant a = v.GetElement(i);' K3 ^6 g/ q3 N" A
                               if(!s.IsEmpty())
( q+ D; ]0 K( l9 [                                  s+=", ";1 V, V  _( H- D' t9 [  ~* r
                               s+=VarToStr(a);
+ [5 i; ~0 z2 F6 |/ c                              }) d& W: {; ^' N6 A0 A
                          }
9 F1 ?0 h+ N7 H4 D' ]; {- d                          else1 Y& X9 _* Q' j0 B; e. V
                          {5 e0 I: u0 g$ o- P
                            s = VarToStr(v);6 ?! E. }$ u6 f& M) Y$ m
                          }9 F8 ^5 x* t9 n: P  h- h. J) h
                         lpList->Add(AnsiString(wsName)+"="+s);
5 O' G9 X. h# k- a- @                        }
1 Q8 B2 Q+ G+ B
0 `: k0 y# w5 C* ^4 l4 f                       VariantClear(&vValue);
( A5 X1 A/ }9 P! x                       SysFreeString(wsName);
; n2 @2 m+ \: R                     }) A! I( L. k# e& T  |! v( c
                 }, D+ J/ m) N- ^8 g1 e) o2 V: E
                if(pvNames)SafeArrayDestroy(pvNames);* f! C9 A/ U; J, T# ~9 O
                iEnumIdx++;3 e; w' i5 ?, U
              }4 p9 D; F+ b$ J6 h' W: G# F2 l, W8 ?
           }' m/ ^. i; c, v! W
          if(pClassObject)pClassObject->Release();  `, U, {/ N! S: [0 `6 A! H
        }
6 p% A! f, s1 E+ I$ A        if(pEnumClassObject)pEnumClassObject->Release();7 @' v3 G( w; p6 r1 I0 |! \
     }
  o- ~! n) I2 ~& }. B. z, Q     if(pWbemServices)pWbemServices->Release();! G9 J; X/ E( I3 ]
  }
; z. j1 k3 \9 m3 E" \  if(pWbemLocator)pWbemLocator->Release();/ g7 A; {1 i; o" t
}
; R2 r  q3 N& L9 p8 V/ Q//---------------------------------------------------------------------------# v- r( J/ z# X  L8 D, M

, d! R3 K( `' H# [' i// 通过 WIN32_bios 获取 BIOS 信息:0 y, c5 v' ^9 K, m
void __fastcall TForm1::Button1Click(TObject *Sender)
, |0 F& ^7 l- h{
( t# K# \# E5 G) c    Memo1->Lines->Add("================== [WIN32_bios] =================");
2 c) d1 S- {1 z' F2 `' J    GetWmiInfo(Memo1->Lines, "WIN32_bios");" m& O8 I! t; z9 O' `
   Memo1->Lines->Add("");/ N- B: |' ~7 M) p
}
  _2 d0 z! h( z( O
5 N  i9 `# A: Q4 s- E0 X1 o--------------------------------------------------------------------------------" O! J6 j; I8 h! u0 V5 k3 N  f+ P0 z
& o2 t  K+ ]' t) K& l
WMI 可以访问的信息类型有:* L" O2 B: N0 _2 t
  Win32_1394Controller" R3 s+ B( E1 e; V7 W2 T& c8 s
  Win32_BaseBoard. e: @( V4 _6 K- I: p6 O. g
  Win32_Battery
5 n1 q. i; h% R   Win32_BIOS$ H# h' G& @+ G- k. L
  Win32_Bus
' C9 Z4 ]$ U0 K( o( C; K' t   Win32_CacheMemory4 A( C( {9 a3 ^) s5 j# Q
  Win32_CDROMDrive4 {6 V9 @: M! h' @! F/ n) K
  Win32_CurrentProbe1 C% }' ?* S4 W% U2 ?0 L' H
  Win32_DesktopMonitor
4 r1 q- r  r# |   Win32_DeviceMemoryAddress! y! V2 P7 M- L
  Win32_DiskDrive7 n$ M" R7 W$ a* o. B
  Win32_DisplayConfiguration2 \. o  ^# y' R- ]5 n
  Win32_DisplayControllerConfiguration
0 d. `4 J/ L% T( e; R   Win32_DMAChannel' e; V+ e6 P# h/ O  c! Z8 A  a2 F
  Win32_Fan
3 K1 n4 x8 a9 i! l  i( I   Win32_FloppyController/ C+ u( d: k2 p& G
  Win32_FloppyDrive$ P, N% k# a8 N
  Win32_HeatPipe
8 n- q' {$ H  E+ t9 \   Win32_IDEController
0 v9 h$ ]6 c! i# F2 D   Win32_InfraredDevice2 g* b6 g. l2 x& u/ G7 k2 u
  Win32_IRQResource
$ w( q: [  K6 N5 d9 Q   Win32_Keyboard
2 ~# d8 Z; I% a# R" h   Win32_MemoryArray4 d" {% P# X$ X6 x: H1 o" \3 ~
  Win32_MemoryDevice
$ y, ?9 N- A! h) T   Win32_MotherboardDevice
  _) a5 e5 Q- y& s: e+ {   Win32_NetworkAdapter
% v5 u6 p/ I3 K5 X' f% @   Win32_NetworkAdapterConfiguration
6 H! H: b1 L6 {- f   Win32_OnBoardDevice
% c+ e& `& v3 i6 l   Win32_ParallelPort
/ R  C" X' y9 _- s) g  a8 E   Win32_PCMCIAController  ~; X; R& T$ s6 G
  Win32_PhysicalMemory& A. a' Y9 D8 A+ _! [
  Win32_PhysicalMemoryArray3 L! \; H% R! x% ~% i+ B/ K3 t5 M
  Win32_PnPEntity
; ~7 [% ]. p& l  q+ O! ]( T   Win32_PointingDevice
1 F- ?0 P, ^- }, L   Win32_PortableBattery
- T- C! P$ T+ ~0 Q6 Q0 \% u+ s   Win32_PortConnector
! t% _% e: Y  }/ h4 J. B4 R   Win32_PortResource0 ~2 S3 r2 a/ M/ z6 [3 P# b- t- S
  Win32_POTSModem( J" z5 G1 f/ a  }* V8 p) \1 }7 i% A
  Win32_PowerManagementEvent
* K8 h1 a9 Y+ U  ^) q   Win32_Printer
4 I6 h/ @  U. G   Win32_PrinterConfiguration- F% b4 y0 h' D" @3 v2 x9 u
  Win32_PrintJob
, g& \  E% h/ U' m- F) e6 t* J   Win32_Processor
/ M2 `% [& z- S0 Y; V5 ~) K   Win32_Refrigeration
/ h8 ?5 A! Y6 l. A- Q   Win32_SerialPort
4 V0 J# s5 w% t* a/ m. O# e   Win32_SerialPortConfiguration
, |# S+ ~  X4 t- k: ]   Win32_SMBIOSMemory
: S9 S) V# B8 ?" {0 a- [& E   Win32_SoundDevice2 e/ k- Y0 G4 h. N
  Win32_SystemEnclosure
, p& b/ P8 B# e! v. R" O   Win32_SystemMemoryResource  u; q& }) V$ _  m0 Y
  Win32_SystemSlot( \8 F7 j# y, Q. l
  Win32_TapeDrive* R* U* j9 @8 Q& F  x
  Win32_TemperatureProbe
2 n2 x/ ?* S2 I) k2 x0 z9 l, k   Win32_UninterruptiblePowerSupply
/ D7 W$ u! \7 p5 K   Win32_USBController: }+ Z+ N0 j3 e: C* \# P: S
  Win32_VideoConfiguration
; g* R$ K( q. Q! j: A   Win32_VideoController9 t% J6 o, X2 l
  Win32_VoltageProbe8 D  e' p3 P& T2 q! s; o9 C" e
/ Y) h) c. Z3 J% J# a
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-27 10:12 , Processed in 0.024573 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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