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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)1 D. p' ?, K5 s: W/ Y2 p
" y! @8 l' j6 |

- I: t  W0 h" W7 s1 }1 ~% I& ~, F--------------------------------------------------------------------------------
* v) U" u1 o3 _, M1 P4 P, N0 pWMI: Windows Management Instrumentation (Windows 管理工具)
  c* J9 I6 |3 F) D1 l   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
/ O+ a+ C( W/ H* ?* D   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
9 i" }+ |  B, J' O   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
3 B5 r# {5 U" m
- J- y( o+ T% m--------------------------------------------------------------------------------  l) s+ t' f# t' @' U
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
; V5 U0 r" f) K4 p
7 {3 e% R! ?7 j* ~--------------------------------------------------------------------------------5 J" x" J& ]0 Y- a; d8 T# D
① 初始化 COM 接口:  u4 f) m; g% n0 V! g( F
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
5 V/ e4 r6 N# M  E5 i( \: @   这两个函数在 #include <comdef.h> 里面定义。0 [( q% M) R2 e  e# \# `6 V1 h

& `9 {, a6 Y5 ~$ u② 获取访问 WMI 权限:# Z$ b$ r2 b2 l$ A- @! A
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);- }3 z( K. @* K- Y8 R: q5 x- Q
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
$ b& j$ k& N8 J2 W4 P. O: o' {3 b. r( v' Q/ v4 m3 H( n# \
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
4 }$ k9 R0 H/ I+ E9 T   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
; K* ^' B, D+ s0 O* r
) H9 f5 G% N* d( K7 m6 ivoid GetWmiInfo(TStrings *lpList, WideString wsClass)$ f+ `) r* `: T+ j  N7 E
{7 t+ j" F5 v. ~9 `2 F3 D. s
  IWbemLocator *pWbemLocator = NULL;, o; ^' r: m8 P7 f# S3 p3 p
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)7 [! R9 e7 ~; ~6 ^
  {
0 Z; ^: _/ d6 p: K# S' G     IWbemServices *pWbemServices = NULL;
+ G) ^8 Z. B3 i6 R/ ?     WideString wsNamespace = (L"root\\cimv2");/ m3 [" u; s/ A6 O% X# _; @  n- C
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)9 D9 t6 S, i! z2 A9 N7 V
     {! [) a9 `% b& l; [
       IEnumWbemClassObject *pEnumClassObject = NULL;, ?0 o7 |1 A2 U; i5 e2 L
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;8 t/ H6 U9 |' b4 n# b* @
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
6 ^" n! Q, Q5 R) k$ [! G( x) {         {3 O% i. z! \5 i; u
          IWbemClassObject *pClassObject = NULL;
* L; q4 d7 y* x. x8 Q9 l8 g. F           ULONG uCount = 1, uReturned;% u2 ~9 w/ W$ u+ n# v) o
          if(pEnumClassObject->Reset() == S_OK)
3 o. G" F3 l' @0 J5 s# F            {- \' I1 g( C  O# O% H1 K
             int iEnumIdx = 0;
6 u4 U2 O- U$ Z, d! `( ~              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
: q4 D0 ?( P" \7 G6 N               {
/ F- s+ b/ T4 N' I' u* w                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
6 ?1 N8 D! g' R, y$ k" `$ m6 D: x0 V7 b  n
                SAFEARRAY *pvNames = NULL;8 q$ h: d/ u0 A' L5 ]) C2 u
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
$ Q7 q& Q: }( Z: b# h& U5 r                  {
. d  n# e" S5 v                    long vbl, vbu;
! B/ h3 ?3 A# ^1 i, c                    SafeArrayGetLBound(pvNames, 1, &vbl);
. `* ^/ [, W0 \3 s                    SafeArrayGetUBound(pvNames, 1, &vbu);) x4 `( U; }+ K  N5 W
                   for(long idx=vbl; idx<=vbu; idx++)
: Z3 }& f& d' W) I                     {" `" O1 X+ s2 d- K: Y
                      long aidx = idx;) s6 x- l; ^. @
                      wchar_t *wsName = 0;0 ~" `& Y! r- b, T$ W8 o
                      VARIANT vValue;0 ^$ X* N9 a; h( o- f7 m* \# x( w
                      VariantInit(&vValue);0 |; [4 [" K: s% q( y' y
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
( I0 {* j4 I. u- e8 M( y& I: I/ _5 x6 l+ L8 y1 p
                      BSTR bs = SysAllocString(wsName);
5 T/ O  U: s4 _- R$ C                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);$ a8 {6 ]1 T) R
                      SysFreeString(bs);# P* F& I& {, z2 J

$ o4 Z; [6 P% k% @: M: L; ^" n& _7 H                       if(hRes == S_OK)
; t" Z& s! S% p$ z6 F, \3 o) v* Z                        {
1 c2 L! S5 g' ^7 b                          AnsiString s;
: p: {  Z1 }. W  H                          Variant v = *(Variant*)&vValue;: e3 u- Z+ l. f8 `" m
                         if(v.IsArray())4 G5 ^1 Z8 k! u% }
                          {3 z8 y9 P8 ?- [- a( E
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)5 A% T% D6 ^. m  m& h9 ]8 `* S
                             {
. d2 c  d- t% |5 _                                Variant a = v.GetElement(i);
4 ?: a' J- p2 ]- c" [* G% r                                if(!s.IsEmpty())! W) X' q& G# w# u
                                 s+=", ";
) }! b" d. ~0 d                                s+=VarToStr(a);$ `0 f$ F2 B9 |0 j" k  f# t' `
                             }
; b  }2 {! ^" V/ B/ [$ v- H4 L                           }) H& w2 W- ?9 Z
                         else
) _* _! t& `5 x' O" F# ^* h8 r                           {" m; ]; o  m/ O; ~, m
                            s = VarToStr(v);/ o  K# g- F- N- ~% w6 [* |
                          }* R; T. \, g$ i* a
                         lpList->Add(AnsiString(wsName)+"="+s);
+ ~  @9 n- ~$ l$ S& p3 X- S                        }
3 c- p5 i$ j  m0 V6 u
7 G, u1 S! J! G( M* ?, h                       VariantClear(&vValue);* F( A! S9 F2 Y
                      SysFreeString(wsName);
3 F* G# w( B* m' ~3 n( v6 [                     }
& A! `# ^' G  E6 X1 Y4 O; \3 ?                  }
) Z# Q* ~" C7 m$ G' d3 ~                 if(pvNames)SafeArrayDestroy(pvNames);
. F# f2 ~- U4 n3 L6 q9 ^                 iEnumIdx++;$ B3 z" a/ o) M1 S# ]8 b
              }
7 a& Q: X4 H/ h, h5 r; I4 A5 @6 s            }
" [3 {0 r9 ~- }0 X, @0 y  H           if(pClassObject)pClassObject->Release();1 L, Y, V( p8 s5 }6 l! z
        }
* ^5 ^0 g: ]$ b$ @' Q- x9 k        if(pEnumClassObject)pEnumClassObject->Release();
1 F6 e( |2 ~! b8 K) x* H      }4 X1 Q* O7 i% S6 `- _* u
    if(pWbemServices)pWbemServices->Release();3 v) j9 C% Y8 b& }
  }
7 _$ R2 ?4 C3 @  if(pWbemLocator)pWbemLocator->Release();2 H1 _9 k% A" K, x$ t
}, W' a* P7 U4 |1 F/ c" Q
//---------------------------------------------------------------------------
3 e7 H6 U# K% S" [! C8 K0 s) a! j. _& q' Y) A/ Q0 F3 O/ u
// 通过 WIN32_bios 获取 BIOS 信息:
* j; {4 x; T8 L4 fvoid __fastcall TForm1::Button1Click(TObject *Sender)1 p0 H: L, a  s/ _0 H1 y
{7 d+ E; Q3 s) l4 ~
   Memo1->Lines->Add("================== [WIN32_bios] =================");
( O( x: a1 W+ @' |, U+ {4 Q6 N    GetWmiInfo(Memo1->Lines, "WIN32_bios");
  k. y5 y; U0 l3 B    Memo1->Lines->Add("");/ c( L( B3 Z  n8 V7 O% k
}0 W6 ?- q6 B$ y/ f

% ]2 x. s, ?/ u( K( Q6 ?--------------------------------------------------------------------------------
$ w2 M' {' G4 [2 X
4 h2 W; C$ `; Y/ _( i3 ~' l' b+ ^8 _WMI 可以访问的信息类型有:
2 b& I+ j1 l: Q   Win32_1394Controller
- g4 J* t- D, Q   Win32_BaseBoard  J; H! Y8 I0 X5 c, `5 Q0 G
  Win32_Battery6 x3 U# q& [/ [8 D2 _
  Win32_BIOS) H- V0 T( w5 z6 c: y: [
  Win32_Bus8 P7 j2 G5 }9 N! X% B# M  f* D& F
  Win32_CacheMemory
9 o% B% D( A$ q   Win32_CDROMDrive
* v4 B, R/ o7 K( [# [   Win32_CurrentProbe: w9 a7 }; t7 S0 D
  Win32_DesktopMonitor
7 q5 G8 h6 Z( T   Win32_DeviceMemoryAddress
' P. n' c. x5 }   Win32_DiskDrive
0 M! J2 y3 s  F3 e3 V   Win32_DisplayConfiguration
# d1 G8 v8 t4 U; m( @" t, m) _   Win32_DisplayControllerConfiguration: D) [3 e* k8 C1 J$ m7 X9 s" K
  Win32_DMAChannel
" ~9 y2 `4 }% T0 [# P4 X   Win32_Fan% ^/ v; ~; ~+ |3 U1 T
  Win32_FloppyController
- n' v, g. \9 F+ g# k/ p  g7 g   Win32_FloppyDrive6 f4 F+ \2 [# P' @& q5 O2 p
  Win32_HeatPipe
" ^; H5 ]' M& G* c4 L% w# ]   Win32_IDEController5 w$ @; _; E2 u9 P) v/ C
  Win32_InfraredDevice
2 o) R# a. L4 U/ V3 I% a: J   Win32_IRQResource
4 N9 H* P% }+ a6 D: R9 x" G   Win32_Keyboard8 [  z) r; z* u6 `9 |4 R
  Win32_MemoryArray! r# o$ k: g" D; A3 T5 e$ |
  Win32_MemoryDevice
7 p0 ]1 m: L' f   Win32_MotherboardDevice
- D  h! a- p1 p! }   Win32_NetworkAdapter* P; y# i6 ?/ e% L6 L3 V( o0 a5 o' V
  Win32_NetworkAdapterConfiguration
# W' F5 m3 U1 l& |  C8 P" R   Win32_OnBoardDevice
! G( Q( r+ x" y5 }8 `/ C5 n' i1 m5 M   Win32_ParallelPort- f: h/ N( Y" s4 |+ |- W
  Win32_PCMCIAController
/ a% {& v. b6 \9 N$ g   Win32_PhysicalMemory  @/ b  B/ [  }5 z+ T
  Win32_PhysicalMemoryArray2 j/ k% @! M6 u( X; g! t$ |" x
  Win32_PnPEntity/ u5 b. n* x5 M; q9 P
  Win32_PointingDevice* X, W$ V! o3 [( q
  Win32_PortableBattery
. }: d; x, h9 z' y5 H; ?   Win32_PortConnector; _* x3 H7 \4 X& \
  Win32_PortResource; I7 m% r5 f" ]/ x. P
  Win32_POTSModem
0 ^/ F' Y2 m/ G% Q+ L6 _1 @$ d* q   Win32_PowerManagementEvent" p9 K0 C( m+ d
  Win32_Printer4 g% {+ O  L7 g; R; i% X9 [
  Win32_PrinterConfiguration: ]- b3 z/ s% L% e  j8 W4 D
  Win32_PrintJob
' [, l1 F1 ?: K0 W   Win32_Processor
9 j) G3 b7 J! w$ h   Win32_Refrigeration
6 V. z7 F2 Y9 J   Win32_SerialPort- k( R! Z5 Y& q# A6 M! K5 g
  Win32_SerialPortConfiguration
# A6 |/ _; K5 B# D1 w- Z+ T   Win32_SMBIOSMemory
3 Q& Y8 A' Q9 e2 p1 g. j- Q   Win32_SoundDevice
; o0 T- J8 P, d8 ?: G) z+ R2 ^# n  \   Win32_SystemEnclosure% y2 Z$ W/ u& O* x
  Win32_SystemMemoryResource
7 P* r- a0 w$ m- T9 q   Win32_SystemSlot
& M# d: z" e& k   Win32_TapeDrive
  C8 d6 \) w4 L   Win32_TemperatureProbe1 p* }! W% _0 i, d. {
  Win32_UninterruptiblePowerSupply+ p, Y) W3 x2 H3 B- u* Q! \
  Win32_USBController
- U# z3 H6 u) ^. w4 ^" L# ^5 j# W: W   Win32_VideoConfiguration
0 R5 f& e0 f, P' V. h1 X; j& @   Win32_VideoController
. q8 a3 ]+ A5 t4 c+ G! d9 Q   Win32_VoltageProbe" r) n% V3 m- i, J; O
4 v* k' A/ K' H& h0 Q, L5 G$ ?! i$ C
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-25 13:40 , Processed in 0.020828 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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