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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)% V) U  ?5 F- [7 h/ v
9 ]" G0 m5 ?- Z6 \* ~- s0 n
) A- e2 h* ^% U2 v
--------------------------------------------------------------------------------+ x" o  D& D4 |: V$ N" G. U# a
WMI: Windows Management Instrumentation (Windows 管理工具)' T) }4 O9 l2 y7 a. u
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。   B' u$ V9 R; _6 O8 I
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。! Q* _9 d" W* |. e% Y; q) O, {
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 4 H) N' Q& T7 w+ v+ j; T% q

! [' g5 v4 ?+ q9 d& ?$ t--------------------------------------------------------------------------------
: A: {0 l6 l5 S  |BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面: p2 C$ L; g4 n! X3 X
2 h3 r: t  y; Z9 M3 R
--------------------------------------------------------------------------------- R9 r3 ~& o4 V& N6 _2 E" F
① 初始化 COM 接口:3 f2 h; _" {0 _! J9 Y8 y
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。  q, ^6 y7 [# \
  这两个函数在 #include <comdef.h> 里面定义。' q( U1 O9 m* Q8 Z3 w

; g8 t2 N: l# L4 {; _. n② 获取访问 WMI 权限:6 `  p4 z) M6 f& X: J/ s2 O
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
; Q4 a# O7 i; ?0 z% I' \( Q: j! j   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
) |/ k$ H# B3 L
, i, k9 |; @0 z- O6 h3 n  o③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:; o: A& E' t& E$ V9 v$ B! z  K9 z
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。; `( f& Q- h7 O/ g6 e5 K

. B: T$ k$ X6 D* X. y- |: e& ^' Z2 ]void GetWmiInfo(TStrings *lpList, WideString wsClass)
/ {. l5 n6 k$ u0 |; z{
" n9 L7 J/ T* O% b9 |  IWbemLocator *pWbemLocator = NULL;3 k7 W) a  T# f% c
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
' ]  @8 j8 Z" A/ e+ M' q   {
8 M& J* |* {/ Y6 |7 a: `2 a     IWbemServices *pWbemServices = NULL;
# N) c6 |: ]0 j, C! i' l2 ]     WideString wsNamespace = (L"root\\cimv2");! ^8 `- V  h& u+ B- U' J  Q6 q* I
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
0 m5 C& z8 U4 M" C      {
3 Z6 K$ N% w- {4 ~! {4 w        IEnumWbemClassObject *pEnumClassObject = NULL;* ^# F" G2 i( y; [$ S  b$ f
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
  \0 V2 X0 A& m2 @2 E( u% t        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)8 |: N9 G; n3 E6 C0 s
        {
3 L- Q+ A: x: E4 P% C           IWbemClassObject *pClassObject = NULL;
) x+ N# a; |6 {7 I2 A5 E           ULONG uCount = 1, uReturned;7 P. v" K# i+ \8 M- g7 ~% a
          if(pEnumClassObject->Reset() == S_OK)
# a1 _. h& O6 R( ?            {/ G" G2 o1 P" z1 q" @
             int iEnumIdx = 0;) z; e8 a+ Q8 ~2 Q, d3 }& H3 n
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)# c' f8 _) c; B" }
              {
; y8 v8 p. y2 C1 b6 _2 [, z4 ~' ~                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");, K2 l8 Z/ i4 \5 g6 n) K" w8 C

. A5 w8 M& w& G+ Z- _                 SAFEARRAY *pvNames = NULL;, S  B2 |3 T( ?+ ~. n3 @. H& f  Y
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)/ H, n. u) U7 f
                 {# ^  a  ]3 I* [7 ~0 @+ g% d/ h
                   long vbl, vbu;' Q9 K' c& a2 M( ]' }2 ~" j$ b
                   SafeArrayGetLBound(pvNames, 1, &vbl);% ~2 X8 |! i' c' a- o2 B8 ^4 n* O
                   SafeArrayGetUBound(pvNames, 1, &vbu);
0 p3 ?& \+ g6 _3 M; U, c                    for(long idx=vbl; idx<=vbu; idx++)
: x# T  j( D: B                     {
2 _9 Y- @9 _' _# g8 ]$ D                       long aidx = idx;' g! w* i+ L0 S5 f1 y6 _
                      wchar_t *wsName = 0;) r( c; f0 A' I. D% i8 `
                      VARIANT vValue;: ]. N  ]% v4 S! M9 S
                      VariantInit(&vValue);3 A- [) M  r* l7 W0 p
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
2 l  W1 [" b  a; ?4 D
4 Y7 {3 J( Y5 Q                       BSTR bs = SysAllocString(wsName);
5 k. }* Z! |  M* L" |1 [                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);! \! f+ @# k8 ^% A/ t
                      SysFreeString(bs);1 e2 o, C- {( w. p

0 U) ~7 E1 B$ _6 T0 x                       if(hRes == S_OK)
7 L6 E: Y; n5 k/ d6 R3 p3 Q                        {
- \+ f, ]% [( H5 V! h: O# u                          AnsiString s;
  g( Q, J, h# J: _                          Variant v = *(Variant*)&vValue;2 Y! B6 a! a2 h( l3 h
                         if(v.IsArray())( Y" \4 J5 W3 X) H5 [
                          {
2 x% E8 t- z, _  }) w  I& V                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
9 K# t* L2 i- T1 P+ x2 u8 p. X2 n3 v                              {
' m2 [4 p( E( ^% C6 n, ~                                Variant a = v.GetElement(i);, \% p" j/ L5 c' \
                               if(!s.IsEmpty())+ g% U7 y' p  c. ?  w
                                 s+=", ";4 w3 J8 R( V: z' P. L" \0 ~
                               s+=VarToStr(a);- K6 n' ~( z* m& H
                             }
2 e& |! O) h& C$ Z4 x9 \                           }
& i/ g* s0 S9 W                          else
" H5 D, G- W6 G- H# }2 r/ E                           {
% s) @# [# G+ h7 H3 {                             s = VarToStr(v);' w# `* W# U8 ~/ ~0 ~
                          }7 N, m" _% ?% {
                         lpList->Add(AnsiString(wsName)+"="+s);
8 S; B1 l/ q3 j5 }* K                        }
0 o$ t3 y) A, G/ Q% g
& D3 G) S: j; ~$ D* A; U                       VariantClear(&vValue);
3 N, `. b& q  J8 Y6 k) m                       SysFreeString(wsName);- x$ \/ E- B5 @- l
                    }& ]+ L- T; b$ m; g
                 }
2 ~9 X7 _+ ?7 d4 s1 y) V                 if(pvNames)SafeArrayDestroy(pvNames);+ A! o- q2 R  V, I* D" i. }
                iEnumIdx++;0 _% w2 r# i- E0 a' z
              }3 Y; Q9 W! u. c
           }
2 X7 I$ w% i' N) }           if(pClassObject)pClassObject->Release();
- x& [4 \6 I) G9 k1 Y         }- @: z1 E% W' \- d0 v: g
       if(pEnumClassObject)pEnumClassObject->Release();
6 g# `7 ?& n2 h0 d      }7 R4 ?# K# u! }  ]
    if(pWbemServices)pWbemServices->Release();. d4 F5 b  x: K' `, U% C
  }
( {% O' S( r; H4 C" [  if(pWbemLocator)pWbemLocator->Release();
( I9 D1 r/ |* u+ I- e}
4 x( b* a; k: ]0 V, M- R' A& N//---------------------------------------------------------------------------
$ J* T( E- u  ]
  \2 y$ Z: G  R// 通过 WIN32_bios 获取 BIOS 信息:( G0 h2 z8 S0 d2 x* T
void __fastcall TForm1::Button1Click(TObject *Sender)
5 ]) _! a* e& i+ x6 Y$ f{6 i# s/ N- J& d! A: {  m
   Memo1->Lines->Add("================== [WIN32_bios] =================");
/ b2 D& u* M3 ~8 J. O    GetWmiInfo(Memo1->Lines, "WIN32_bios");
# D& y) p8 j" Z7 \    Memo1->Lines->Add("");
2 O, J' ]' b" O* p0 ]& C4 S}4 a5 \% ~' p! o( W6 s

4 i  g" G$ _6 j7 n  O4 p/ q9 ]--------------------------------------------------------------------------------
3 u; I, R/ Z8 X3 F; C: o4 d. `6 p9 Y2 J8 _, f
WMI 可以访问的信息类型有:
' h1 A9 N5 E. V" n7 o   Win32_1394Controller' l3 w( P: P" r( P
  Win32_BaseBoard0 Y9 J6 e! z$ p/ M% A; O
  Win32_Battery( E( b5 R" }: r; i" T( }. i# ?
  Win32_BIOS
5 ~( _4 J* T5 g/ K; O8 {   Win32_Bus5 a2 v: v  A6 n3 H2 S5 ]
  Win32_CacheMemory
! _" j8 f2 q! @   Win32_CDROMDrive' m' S$ K  O  M* b; }+ x" Q0 f% C
  Win32_CurrentProbe0 D: ]" v6 f3 R9 `
  Win32_DesktopMonitor6 P& l6 [$ r. {0 x
  Win32_DeviceMemoryAddress
/ b  C. X9 O0 x/ R   Win32_DiskDrive
" e. V% t$ l# q* W   Win32_DisplayConfiguration
* |. j0 L9 X- t' @' Z   Win32_DisplayControllerConfiguration
2 N1 G! F4 _. V5 K# E   Win32_DMAChannel; w+ Q" t: v  |( ?" C! i: ?+ y
  Win32_Fan
- o  M# U5 X4 m4 ]  |& p   Win32_FloppyController
1 e, w  d$ W4 C  V   Win32_FloppyDrive  s8 ]% A6 Y9 w- C# U2 T8 V
  Win32_HeatPipe* D: q, y# w+ v! r. V
  Win32_IDEController3 n2 ]! B0 b3 O1 ~# `. i) t- Q
  Win32_InfraredDevice$ @( k+ F- J1 o- s6 N
  Win32_IRQResource
* \! W) z1 v4 q   Win32_Keyboard
, I8 F5 I, e* S; M   Win32_MemoryArray: j. e8 L- T5 r2 q: q& M) E
  Win32_MemoryDevice
9 B- V- c% y  N   Win32_MotherboardDevice
) [* [8 {" P" f! B7 D, b) j   Win32_NetworkAdapter! H1 t: m9 W/ X, a$ T
  Win32_NetworkAdapterConfiguration
% f& k6 I8 _8 O9 Q   Win32_OnBoardDevice- k0 l# e: {; `3 H) B6 o1 w- F
  Win32_ParallelPort0 H6 U9 i& o6 d  Y' J5 {
  Win32_PCMCIAController
. {0 ]5 {; w, ^% t2 I' W! x   Win32_PhysicalMemory7 e. o# f4 J1 o$ G) v$ d
  Win32_PhysicalMemoryArray7 b1 G1 b. q) ^: y- U, R- C$ O8 t
  Win32_PnPEntity
$ M1 q& f% E& P9 s   Win32_PointingDevice
2 s) F+ W# x2 P3 j6 `   Win32_PortableBattery
  O. Z8 ?& ]  @2 a   Win32_PortConnector
* x! d! V1 [- j( M1 _   Win32_PortResource
, g/ ?+ b) A( x' x# v, t" |9 h& T; x  D   Win32_POTSModem; P0 I$ y) {) M9 I5 q/ T1 j
  Win32_PowerManagementEvent8 ~3 v) r7 t, j
  Win32_Printer; Q1 O3 e" W. S6 a* a
  Win32_PrinterConfiguration8 y2 U3 q; I' W0 Y& {5 [
  Win32_PrintJob8 S. X2 @8 q2 M
  Win32_Processor! [/ g) V$ X" |6 z7 J
  Win32_Refrigeration
! \0 D8 g0 i' g: q7 P# i: E7 u   Win32_SerialPort# `7 r4 k% f& R
  Win32_SerialPortConfiguration
) A7 H: x6 _7 i. j6 A1 ^) O: q   Win32_SMBIOSMemory
; D5 Q) M# [# k8 e   Win32_SoundDevice
: n! E0 K0 Q# J( Q  G; g   Win32_SystemEnclosure9 M% M3 L* R* ~& h; x
  Win32_SystemMemoryResource
; U6 q% m) m# w- ], {+ }! c   Win32_SystemSlot
, T% _& b5 q) O2 X: k( [' Q; \   Win32_TapeDrive
8 M; p3 o$ u* k- Q+ j% X   Win32_TemperatureProbe
$ |4 Q7 n: n+ D2 d$ H5 G# U   Win32_UninterruptiblePowerSupply
6 V% {& r. p3 o/ q. E) {, ^3 P   Win32_USBController
9 I" \7 T4 ^( y: l) m   Win32_VideoConfiguration3 f/ z* M4 G2 J' j/ m
  Win32_VideoController2 V: Y0 K7 v' H$ M6 ~- z5 ?# Y* v
  Win32_VoltageProbe# t& D7 r7 R5 Z
1 H; f" G4 c) X! T
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-24 11:13 , Processed in 0.018141 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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