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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)5 b; C- U6 ^6 k* G: K/ a5 d

# i7 d, d1 t2 H. o0 {
0 B& |) ]- |: U7 @) ]' ^1 W- S--------------------------------------------------------------------------------
! C6 [$ @& c! Z' T6 z& `WMI: Windows Management Instrumentation (Windows 管理工具)
# G  ~( E( v" ~4 E9 d, [   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
# n5 w/ A6 W/ z9 w/ c" b   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
! H% |! s: [  ^: }   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。   m& t' L" ?& J' C( d  K' B3 m
/ |8 d" v9 k4 H7 e& K- f# i
--------------------------------------------------------------------------------" W6 E: o) ?+ z6 @2 ]. |& j
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
* t% o' F$ }! k! ?% H3 b: p. J1 @- ?3 x9 h9 J& i
--------------------------------------------------------------------------------- I4 d. J9 C' _
① 初始化 COM 接口:+ z/ m1 S- L; J7 p4 S( U/ v' `
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。8 f: D& X; n" S& G0 l
  这两个函数在 #include <comdef.h> 里面定义。
  V% p4 T0 I! i7 L- |% K2 P6 ~* k5 `# t( @
② 获取访问 WMI 权限:/ a- q4 D6 ?9 f: k
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
) u! ]8 S! e! K+ r# P   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
! E' o. y9 O& u; E4 S( X8 R+ L
# T9 B; ~6 E9 n- G③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
+ R: _: e( D5 y. D   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。5 M4 }4 z' I  ]9 G. o6 {5 y1 R

' Z( n! s$ a) i+ ivoid GetWmiInfo(TStrings *lpList, WideString wsClass)
! S  @. z. j* B! X0 P1 A. n{6 X2 e& L2 c5 _8 u- z% Y, e
  IWbemLocator *pWbemLocator = NULL;! Z$ I% ~3 N* F% C
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)5 U8 H7 d% M. ?
  {
. w" X* j, F+ E& p1 E& Q0 |     IWbemServices *pWbemServices = NULL;% k" X+ V' H- K/ m8 l
    WideString wsNamespace = (L"root\\cimv2");' \; t. r. x1 o0 D
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)' E  ?- ^' {  j  \
     {9 f0 n; q$ r8 w/ e5 L, N
       IEnumWbemClassObject *pEnumClassObject = NULL;0 @! s: w/ w, O; k
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
, r) G: w# M, e  U- a0 D, O# k        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)" r, s, d2 X  E) G
        {
* J  K7 t: V1 t: l           IWbemClassObject *pClassObject = NULL;0 \  p% t/ H6 R; B6 U- Y
          ULONG uCount = 1, uReturned;
) {+ {- s5 W) {* w3 p0 O           if(pEnumClassObject->Reset() == S_OK)4 G$ K* ]. V# z
           {
  U( Z) q' j: q              int iEnumIdx = 0;: ?' R: n* T3 X& x% \
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
" k' c+ s: H" E$ T$ B, W8 p- T               {
4 V( u6 R7 v% }" t- n3 V# j                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
$ c' n! O; ~7 j0 ]# `4 D5 R3 |0 i3 T5 B2 |; f  R
                SAFEARRAY *pvNames = NULL;. L3 A" c) q( n. _' N, |+ h
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)- C5 A& J5 `2 g* }5 c
                 {
; }" I3 Z( A* W) S7 A                    long vbl, vbu;
3 L0 s' I0 z% R0 g8 S                    SafeArrayGetLBound(pvNames, 1, &vbl);8 w# t9 d3 D) j: M7 S! T
                   SafeArrayGetUBound(pvNames, 1, &vbu);; a; k2 n$ L8 x
                   for(long idx=vbl; idx<=vbu; idx++), e. W5 x* Z8 ]6 n3 v. m
                    {
2 S! T' ~9 h6 x9 }0 [% k* D                       long aidx = idx;# }" u. c8 G0 g7 }
                      wchar_t *wsName = 0;
* |" w5 i- C' e2 K3 M+ C( `                       VARIANT vValue;7 A  k! O! A" Q6 I
                      VariantInit(&vValue);
: k; U% d- L  h5 H( v; r9 X                       SafeArrayGetElement(pvNames, &aidx, &wsName);# u$ |: p; y4 |+ r* T& |3 P

0 ?2 [, h* d4 w! V% h+ p" k" c                       BSTR bs = SysAllocString(wsName);
& H5 ~) k/ \% C* v' ?( @( }3 J                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
( V. z! u2 u+ o5 E7 e" K                       SysFreeString(bs);
0 d2 V4 ~7 P: H- Z( S; p5 ~
# Q1 S9 s1 \( p2 s                       if(hRes == S_OK)0 Y! V1 _/ W5 Q. y8 R
                       {
2 a9 c& h& s' I; ^% n: j: R                          AnsiString s;, X  p- c( b$ t0 f. i/ O
                         Variant v = *(Variant*)&vValue;
) v( l2 {8 w3 K8 G                          if(v.IsArray())
  P# s3 P# ^- K5 W7 w" C/ B7 |                           {
7 U( U% D; N) ]& O" N% F3 F7 q+ }! z/ u                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)" \  Q7 z2 q8 V7 Y: X
                             {* ~" e0 z1 Y4 n
                               Variant a = v.GetElement(i);; H* {2 {& O6 Q, B$ V; t2 G
                               if(!s.IsEmpty())
7 y; ?3 Z- S& Y: H                                  s+=", ";
* r6 P- ~( \( _  ^                                s+=VarToStr(a);
& [1 m$ \: e6 g4 z& e                              }
# \2 h: z9 ~9 @0 _- \: q" W                           }# z" x0 z/ {( N; m' t+ b$ W1 j
                         else# H  V; H6 }! l8 [+ D
                          {- v& Q) Z9 G; s$ Y
                            s = VarToStr(v);
! U1 j1 l5 B8 r: r                           }, a! ]+ f, ?6 W6 a/ A
                         lpList->Add(AnsiString(wsName)+"="+s);
9 p1 @! h" G7 b" d7 ?                        }
. }+ Q/ X9 V! M: W8 h; m
2 u9 U8 D6 Z7 x# O/ V7 m3 K2 z% G                       VariantClear(&vValue);' G, R1 L  R' b5 R. I* X1 g  U
                      SysFreeString(wsName);$ q  t/ E& ~4 |  h& w7 T+ r# J  B
                    }8 M) t8 z* K, B- `" f  t! `
                 }! c4 s; e% }) b& m, Y' Z9 c6 J
                if(pvNames)SafeArrayDestroy(pvNames);3 i! ~1 t( c$ I6 u! q0 v, y7 B! x3 M, f
                iEnumIdx++;0 n& X5 M/ U. ~7 `
              }5 ~4 q/ m9 Y" x. V. K
           }
# t8 Q2 n, e& z  ^/ f. N. \& q           if(pClassObject)pClassObject->Release();
6 s- j2 o/ D- q7 @; `% x: V         }
/ a  ~4 {3 \  s3 S- \4 p$ N" |        if(pEnumClassObject)pEnumClassObject->Release();" B0 M4 S1 f* d" |! y, B. N$ {
     }
4 A) U$ R( x+ P1 p/ h) ~1 k     if(pWbemServices)pWbemServices->Release();
% m# B! }- i  ?  a+ r% L   }
) |- C; p6 O' M. c4 \# W  if(pWbemLocator)pWbemLocator->Release();- n0 c3 g" }: m/ e2 h0 M9 D
}3 p' I& H% W. s# \, |9 w2 R: _, z* _
//---------------------------------------------------------------------------
/ l% O$ u) X; Q# a# U/ P9 P
- Q% _+ W8 D' v# _// 通过 WIN32_bios 获取 BIOS 信息:
: k( M, Q7 h& y7 C* Z$ bvoid __fastcall TForm1::Button1Click(TObject *Sender)* e: p* v. t  d! H9 u% k
{
0 F, u- ?7 p7 T9 `, q/ N0 ^9 A    Memo1->Lines->Add("================== [WIN32_bios] =================");
( {; D: B+ I  Z: B9 }" ?3 ?/ R    GetWmiInfo(Memo1->Lines, "WIN32_bios");
& Q+ }! D: N. }3 m! i    Memo1->Lines->Add("");, [; g. z! I5 E- K3 B. b
}3 i/ H5 N" q( |% P" h

( H7 A' S: C9 [" d. @, O4 N--------------------------------------------------------------------------------
4 e8 f4 Y) g  l1 R/ r3 W! E- M" N9 j
WMI 可以访问的信息类型有:
! o9 h, S% T" M$ B   Win32_1394Controller9 @1 T# b9 u+ x# [# v% \9 j5 ]4 Q
  Win32_BaseBoard4 R& v8 \' l3 M( ~* u- X3 O
  Win32_Battery
; R+ E4 Y  U/ O& \- x+ k   Win32_BIOS
$ W  w/ K: x7 i' R! T' K   Win32_Bus
4 `" h% `$ T' ?* c   Win32_CacheMemory
0 H: e" }3 ?, C; b   Win32_CDROMDrive1 Y. q0 r. x2 X5 U  _
  Win32_CurrentProbe. ?0 J5 }$ L' `; Q7 r9 H" h
  Win32_DesktopMonitor3 T! T4 F! C" T1 w# Z4 ?4 h
  Win32_DeviceMemoryAddress
( h* e. f$ U2 i: u: U# B. m   Win32_DiskDrive3 w) P* u' s' K6 G  U" o# E9 D
  Win32_DisplayConfiguration
+ _; }1 c! N+ x) p. c5 f) ^" x. S   Win32_DisplayControllerConfiguration
0 M8 Q+ y7 h4 {( l   Win32_DMAChannel5 ?* H% R! i* G/ r3 R
  Win32_Fan4 c' R! {: l6 z7 D2 w
  Win32_FloppyController" P8 p& O0 l! O0 c  d7 ~; s
  Win32_FloppyDrive9 k8 C, L* t  I
  Win32_HeatPipe
7 [) k. E; @; w& |' a  p. ^   Win32_IDEController
+ B  E9 K  L7 |8 _1 _   Win32_InfraredDevice
6 h5 r1 U" _; |   Win32_IRQResource. v  G+ N* F) q2 G4 E7 j
  Win32_Keyboard* ?" f0 k; \9 Q5 ?) r
  Win32_MemoryArray+ @- s. u9 p" F& K: T
  Win32_MemoryDevice
( o% \8 T3 \% I9 a4 g1 m, U' Y1 |   Win32_MotherboardDevice
- Z9 w. ]1 b& R9 s   Win32_NetworkAdapter
' F  j0 C9 r& Z' }6 {9 T   Win32_NetworkAdapterConfiguration
" E1 `5 h; g2 U' v   Win32_OnBoardDevice) u* }% V% h: R1 U7 l( c& `
  Win32_ParallelPort0 v: n3 s7 M* i$ e& O
  Win32_PCMCIAController2 p; E3 \( y  j2 U
  Win32_PhysicalMemory) `( @. i- S) W
  Win32_PhysicalMemoryArray6 T2 X% k- O) j1 |4 t5 T! P9 P
  Win32_PnPEntity  r4 O# L3 E; k! R& K4 t
  Win32_PointingDevice8 |. O) {1 [. s: x9 y) s% B
  Win32_PortableBattery+ H3 K- P3 X0 `& m5 q
  Win32_PortConnector
  I4 P( h- S; I. Z   Win32_PortResource( N6 x- s7 U9 B  C
  Win32_POTSModem: N( ?; N$ s3 ~; L: o; ^
  Win32_PowerManagementEvent6 `% b1 ]! [/ A7 o) E" X% k
  Win32_Printer
, O0 B1 Y% Z- |   Win32_PrinterConfiguration
& Y9 ^6 ?1 r" g  p# r8 W   Win32_PrintJob
* g* k% N" [. T) p/ Z' }2 p   Win32_Processor
9 [* E" ]/ v. f   Win32_Refrigeration/ w- \% a5 b. k% H& U
  Win32_SerialPort# o$ h( @  ~! T, x8 H: z
  Win32_SerialPortConfiguration3 t3 W$ N& R  t6 ?3 x8 g3 ?  k+ m
  Win32_SMBIOSMemory& G% R3 N  ]3 j8 U! X, {
  Win32_SoundDevice3 b2 B: l- ?6 i) A5 Z; B% `
  Win32_SystemEnclosure
6 v$ q' q) U: F4 F2 R) d8 R   Win32_SystemMemoryResource
5 a7 e* ^6 F6 B/ z   Win32_SystemSlot
. @9 }/ L3 N% l. G& j; E, g8 v   Win32_TapeDrive1 s; s1 y" _2 T* `& s4 M1 v% Y# E% I  a
  Win32_TemperatureProbe7 L. q0 l' @' A
  Win32_UninterruptiblePowerSupply
! N( c9 W7 p5 i% M6 T   Win32_USBController
+ B& k9 g/ _% o1 l   Win32_VideoConfiguration
, g0 c+ }  H$ S9 T, S! P   Win32_VideoController& b+ F( |$ w  T$ ?- N- o
  Win32_VoltageProbe
" P( X: ~0 W. V. ~6 W3 m
, J2 ?; `" _- e7 R; A+ o以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-3 16:59 , Processed in 0.015992 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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