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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
3 c/ f2 O  l; D! w( a/ d5 ]0 \) {  o: |& g3 v  J+ M$ Q

  l( ^9 ?7 v: j1 f" H# }--------------------------------------------------------------------------------) Y$ }! e& @; ~% J$ d( p5 `3 F/ U
WMI: Windows Management Instrumentation (Windows 管理工具)7 i# b# [$ e2 l
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
0 I) }, l; d# I+ e- b   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
) _! ]# f1 k" _& C+ w2 e   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ' M% q5 t( Z( N9 j- f- l
' q. }. s) o" _0 i
--------------------------------------------------------------------------------
. v# h) t. k6 p$ C8 B. X4 X& k! g2 rBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面8 e, Z& d( I! I+ M4 ~

8 E* s4 E2 a% |, s3 L--------------------------------------------------------------------------------
: l  |7 m4 M/ l. m; T& U4 [9 b① 初始化 COM 接口:) @: V" G) T# J) S, N1 q
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。: |0 a+ Z9 d4 X0 h/ E, S  B
  这两个函数在 #include <comdef.h> 里面定义。5 H# p1 r0 ?6 N: }* {( S# a

2 m/ E. ~7 h7 E1 ]② 获取访问 WMI 权限:
% r: p% j2 [& [7 ?5 i   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);1 W1 \: t2 C2 P3 f1 `
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。: c' K1 p: T; d# e
' ?. g! y  e& O5 c; r
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:3 O9 X6 ?4 o0 a5 @  T% O
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。1 ~1 u  g0 C! d1 j+ ^
/ p* j2 [/ n! E: }; \
void GetWmiInfo(TStrings *lpList, WideString wsClass)
5 T* i7 N7 Z: K5 i) [* \$ e# }{9 i& ?" H1 s: ^! S+ r3 t9 y
  IWbemLocator *pWbemLocator = NULL;+ M0 H' y1 d% |( J2 F! t2 u
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)7 O% F& c6 q. O# g0 O0 f' ]& Z& K% Y2 }
  {
% Q6 W; o( \& w! N     IWbemServices *pWbemServices = NULL;
" D& q& _, D5 w4 n* i7 E! n     WideString wsNamespace = (L"root\\cimv2");
- q( t5 y4 c# }     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
9 G/ j) y4 K6 i: a! Y      {
6 W) }% H* ?/ k        IEnumWbemClassObject *pEnumClassObject = NULL;
( \/ z# h" l( H: d* @" T4 {( H        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
4 h: {8 n% R2 H7 e) Q        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)% H0 m& k4 @6 z. y- Q- E6 X
        {
5 d4 ]& l" p  [- |           IWbemClassObject *pClassObject = NULL;
, d- S, A8 M8 C" W% g3 V; P4 d           ULONG uCount = 1, uReturned;6 S( f6 P% W' I. g. m' ?
          if(pEnumClassObject->Reset() == S_OK)
- _* F8 @; J( r) K8 L( i            {+ J' p8 w* K4 o
             int iEnumIdx = 0;6 r$ K9 d. I  z/ U( H& F1 N
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)! E( T7 u2 A. {1 E& N
              {
) a  r, T6 w9 x4 g6 j                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
. P  Y3 e. w4 N, T2 d* e; o% r) \- e9 t* x* g. l
                SAFEARRAY *pvNames = NULL;
) N$ p# ]& M$ l                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
9 T( _4 e% |" R& B; H& R                  {
$ q5 Z( e* q9 A! g9 ^( ^  Y                    long vbl, vbu;7 m) J, f4 o8 B# v3 B
                   SafeArrayGetLBound(pvNames, 1, &vbl);/ s9 s  J! M6 y* ^& s
                   SafeArrayGetUBound(pvNames, 1, &vbu);
8 t# ^1 m" G1 L                    for(long idx=vbl; idx<=vbu; idx++)
6 J7 ]3 I0 ]# s6 s2 h$ t9 O                     {0 s, k! Z. O& R- @
                      long aidx = idx;
0 i( h, I& U0 z+ G' n                       wchar_t *wsName = 0;" i% d, n% v: l* |' e( ]
                      VARIANT vValue;0 p$ U6 _) b: d4 s  K
                      VariantInit(&vValue);
+ `# `, W' m9 V# z( L                       SafeArrayGetElement(pvNames, &aidx, &wsName);+ Z) O8 W# _, C
3 _" M- @0 f$ Q/ P! A" `
                      BSTR bs = SysAllocString(wsName);
3 K7 l. `8 f/ B" g0 a- Z                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
) m0 K% h6 y9 L                       SysFreeString(bs);
& w4 G" Z9 E+ N2 q3 P$ _: C' \0 h
) q  k5 [  E$ P: |                       if(hRes == S_OK)
3 D. v" y# Y* V% J# B8 W                        {
  }+ C% y" i5 M5 _# r3 q                          AnsiString s;8 L+ n  w- H! u; |' S, }
                         Variant v = *(Variant*)&vValue;2 G( J$ T' v% }9 g
                         if(v.IsArray())# D/ t" u* j* A* C4 o) C. D
                          {& Z6 c1 I# Y/ N9 D% m: |1 G6 u
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
! M' T% }6 F3 q; D                              {
- p; W3 t) {& V3 M1 |% a                                Variant a = v.GetElement(i);1 m; }, a4 K  ?5 E) h
                               if(!s.IsEmpty())5 |4 _) {! u' p/ s
                                 s+=", ";
  I% h! d9 x1 K% k& C; a                                s+=VarToStr(a);
) `8 v! _, ^5 D% U                              }
7 z' i% Y0 K& F4 O& F, M% f4 I8 ?                           }
* s7 [* h8 i, n, G$ z  f2 n& d                          else' \0 M) u% j3 ]2 h0 O% W( @# c
                          {8 D/ `7 ^: H' V  D
                            s = VarToStr(v);
3 S- G" X& M& r3 ?, T. E                           }
9 J) [5 w% e" k2 x1 j$ T                          lpList->Add(AnsiString(wsName)+"="+s);
, j3 J2 U% P; r: r! o9 C                        }# S2 D. S- Q  s' a( V( p9 f4 _; c( a

; s/ ~1 F. ^) b( v* t( v                       VariantClear(&vValue);
) ^0 W( _/ p' o; ?7 C  X* R                       SysFreeString(wsName);
; ~1 v' I9 c- h: a" S. ?                     }4 J# n2 x* _3 H7 }* J1 z
                 }' P& `2 k# a0 J: T# m6 s
                if(pvNames)SafeArrayDestroy(pvNames);
5 @* a- \( B$ R6 a* x, m, H6 q                 iEnumIdx++;
( [+ a6 W- k, @- n6 s               }
( I" q8 f/ x, [+ A9 u0 e            }3 `/ x& b+ C4 h+ U1 W0 S# Q" m
          if(pClassObject)pClassObject->Release();
- p* h6 b9 X" T, {5 u' g! ^) F( H         }
$ w: V* y, W/ g/ p. `/ t        if(pEnumClassObject)pEnumClassObject->Release();
* F' Z- r1 _3 I( J      }7 P6 w* ?3 U! U' e
    if(pWbemServices)pWbemServices->Release();
( v8 n* x1 b( q5 O( S5 m% I   }& t5 r, B# j+ t' {7 U6 m
  if(pWbemLocator)pWbemLocator->Release();8 G- D5 K" ^5 n0 U
}
+ E% I2 d4 w+ V9 `/ R3 l//---------------------------------------------------------------------------& V0 R+ {4 _8 Z0 @6 X& r( @

8 v" [. U5 X, h5 ?// 通过 WIN32_bios 获取 BIOS 信息:8 ?1 ?1 K9 p3 i6 Y, p
void __fastcall TForm1::Button1Click(TObject *Sender)6 l' E  g$ X: `+ a7 K& U( J) r
{
: K8 E) N5 [3 \1 N- @$ @, K0 t" Y    Memo1->Lines->Add("================== [WIN32_bios] =================");/ l4 Y) n+ u2 c- a" H, k
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
8 Q" Y6 z* i2 p% c; M9 I    Memo1->Lines->Add("");, Y, [) f! K( `
}
* A& m- o" B1 U7 J, f6 f( e+ j) u: F9 F7 L2 t
--------------------------------------------------------------------------------' E' _9 R( z1 R5 R
6 Z9 p9 W$ N) S! f7 ^9 A" u+ m
WMI 可以访问的信息类型有:( {3 l6 L. l) V) R" i3 ^
  Win32_1394Controller7 S. y, N2 L" ~; A8 Z# M. `: p. x
  Win32_BaseBoard
9 {" }0 y) e' |0 L7 K, u   Win32_Battery
6 Z( y- C* r! A* B! x2 k- E   Win32_BIOS
3 c" \0 L3 M6 B7 I1 M: B   Win32_Bus6 e! {: ]4 h) h& h  ~3 s' s4 f
  Win32_CacheMemory
- O, Y4 O2 M2 `/ C$ h8 Y   Win32_CDROMDrive5 _4 P+ u8 c" a4 c  ^: i
  Win32_CurrentProbe
+ G( ]  ?2 r4 A2 j6 I   Win32_DesktopMonitor
0 s0 T, Q5 f' Z; \   Win32_DeviceMemoryAddress" l# p1 A' o2 L
  Win32_DiskDrive9 X: k- G: T$ @8 T# f
  Win32_DisplayConfiguration" K3 T/ ^& g5 A# [% q6 ]
  Win32_DisplayControllerConfiguration% l0 G) |. @# m
  Win32_DMAChannel
4 a: N/ ?5 @* r' P   Win32_Fan
& O" n* f  L6 i9 ^! L7 H   Win32_FloppyController$ K6 i" Q4 V: U
  Win32_FloppyDrive2 P" `+ S, T/ f/ @' ?! T  A
  Win32_HeatPipe
# J8 `3 z; o% _4 ^6 L   Win32_IDEController
3 W3 k# L% O  F/ f% B   Win32_InfraredDevice# z& _: D1 j; G: l
  Win32_IRQResource. x* k$ s2 C. v- I
  Win32_Keyboard
2 \; y" b/ p* ^7 z4 D) H3 H) Z  {   Win32_MemoryArray( d2 X' K$ {) h) U$ _/ b
  Win32_MemoryDevice9 r- a  \8 a  i$ i" D$ H
  Win32_MotherboardDevice
2 T$ e; |$ x& @/ l   Win32_NetworkAdapter
; r' f6 T; X( \' I6 a: l   Win32_NetworkAdapterConfiguration
$ ?( M! Y$ b8 i+ m" ^  B3 T   Win32_OnBoardDevice. k6 {  V$ A' O# R
  Win32_ParallelPort
& e+ w% Q8 k2 c, |6 l   Win32_PCMCIAController; k9 f& j* F7 q; t( N: S) N1 _
  Win32_PhysicalMemory
8 Q- D/ c! E% j( p. e/ u% m   Win32_PhysicalMemoryArray
- a4 U/ ^" ^$ s6 A. }   Win32_PnPEntity
6 ]2 h& ?: o. B  o4 s/ ]   Win32_PointingDevice( B6 ?% R- b& Z$ G
  Win32_PortableBattery
3 m( a, F" X; F& Y* Y   Win32_PortConnector& O; x* [$ {0 S+ [5 s
  Win32_PortResource
5 H% ?! v9 u! j3 h2 ]3 i   Win32_POTSModem3 r7 ]  h1 ], P0 d( n' W- I% {& Y& F
  Win32_PowerManagementEvent' R1 `+ o; r- _' V. S  s( @
  Win32_Printer
6 M( J" @, K5 A   Win32_PrinterConfiguration* H5 m0 R! f2 V4 ]9 Y
  Win32_PrintJob  X; G, D& y( c/ I  Y
  Win32_Processor
* v3 D! v6 [  J' P   Win32_Refrigeration
' k9 Z4 U- o' P   Win32_SerialPort8 ]( Q6 c# R) C: J( b
  Win32_SerialPortConfiguration
! T" L4 y  P8 _3 _4 o, z   Win32_SMBIOSMemory- y3 _% ^1 O, _
  Win32_SoundDevice. z- C3 r: u4 c5 A
  Win32_SystemEnclosure
  Q/ w( s/ q2 G4 x& \- ?: T9 j   Win32_SystemMemoryResource  [& e: Q. q5 K
  Win32_SystemSlot
) S, u! `9 y& z   Win32_TapeDrive
  t  R$ T9 j9 H: a: k: M$ |   Win32_TemperatureProbe
! ]: h; G2 `6 c) b- K& P   Win32_UninterruptiblePowerSupply
9 F; g! g  @4 y% t   Win32_USBController
* `! F1 q- B, f: O7 y   Win32_VideoConfiguration7 X5 N/ q% c' y" @
  Win32_VideoController' W- U/ k3 ^, G5 U% P( A1 ]
  Win32_VoltageProbe
' o0 H: u5 Y; |: S& a- Y
. C% T8 {& B( ]以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-11 23:32 , Processed in 0.020564 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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