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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
- u: c) D. d* G% v( q
$ n: Y( ]. d2 G
1 r3 d& D1 L: H# c, j) B--------------------------------------------------------------------------------
# C9 }, @, ^1 V+ n: {4 {WMI: Windows Management Instrumentation (Windows 管理工具)5 V/ y! y" p9 O
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
; T; w; z. q2 R% E& w: M8 ^  Y" w9 R   利用这个工具可以管理本地或客户端系统中几乎所有的信息。9 N! m; s1 r0 a; v- S
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ) G" i" Y8 W3 p9 q; w+ s
* P, K+ j0 |+ [' H7 I
--------------------------------------------------------------------------------# y- F2 D& B, L/ S4 f5 R) w
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
; L5 D7 Y3 X& x; L3 I
2 i% d+ M6 ]9 w+ }--------------------------------------------------------------------------------
- u& y" H: c* s6 D& ^① 初始化 COM 接口:2 G, [! ?2 R: K5 t' T
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
3 L& F* }1 u* e/ t   这两个函数在 #include <comdef.h> 里面定义。
! l/ o1 k2 q  k! o0 D5 y. |! @# b; Y3 X5 |* ^& |) @9 v
② 获取访问 WMI 权限:
' g1 d9 o9 ^' u5 X: B   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
: K" q: o! w7 o( z$ o& B4 b/ ~   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
( U7 G& u' z" ?1 g3 v& [* z0 t5 L# p
. b: L7 E* q  Y$ s: I1 {" N) F# l③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:; T' t5 x& [5 Y/ d/ ?' j9 z
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
. M9 P  j# I$ B% c: s. p) C/ N% h* ]
  r) T4 i% J( m9 ]& I- {5 vvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
$ C$ L) Z" D7 O9 q{
* T9 D( `" ~" ~" O  e* I  IWbemLocator *pWbemLocator = NULL;# ]5 B8 h/ B9 j" b7 j, I
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
& t7 q2 m2 u0 w* T: C" Q, f   {
  _9 k, j8 s& x) B( }( V     IWbemServices *pWbemServices = NULL;( M, j9 X5 o+ p2 q  `7 @4 q
    WideString wsNamespace = (L"root\\cimv2");
& J/ o; `: W7 K) Z3 P     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)8 `5 g! B. W' D- |8 |
     {# E" _1 X6 j/ G; l6 F! r/ s5 q
       IEnumWbemClassObject *pEnumClassObject = NULL;) A* I$ x% _" C& q3 O5 N- Y
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;, k. F% T6 u* s$ w( U7 X, S  a
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
. ]( l. g% ?# K2 _9 Q         {& J4 O  @' `, ]. B+ i0 f+ _  \/ A
          IWbemClassObject *pClassObject = NULL;4 K; \. J7 b' f5 y% G
          ULONG uCount = 1, uReturned;; v- p8 l6 `; C% O. H7 W9 M) s
          if(pEnumClassObject->Reset() == S_OK)
* y/ p% D% o6 d3 B* F8 X2 B& a3 z            {, f& ]+ A; T( }. A7 b( {
             int iEnumIdx = 0;
3 \/ f  W! C! l# d5 @& u              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
: _9 a4 ~! @) T- R/ o3 a: k- F) q               {
3 _1 V' K, z  W: b# \3 g                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");; Q  O. l0 ?; A% w. Z- i
( b, @$ E, X5 h2 _
                SAFEARRAY *pvNames = NULL;
# ^  U; |3 x# |! o3 [                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)9 N( s, m3 t7 D. u# d4 s9 k* N6 P
                 {
3 z0 K! C' r9 `6 x# e                    long vbl, vbu;
6 {$ l) X9 q+ J- O& g) U8 M/ H                    SafeArrayGetLBound(pvNames, 1, &vbl);
+ \* c/ X2 ?. F( M( K- m+ k: [                    SafeArrayGetUBound(pvNames, 1, &vbu);
# K& j' ^/ q8 q+ c                    for(long idx=vbl; idx<=vbu; idx++)
( R/ }$ E  C! A6 m                     {
& W4 A( [5 A9 q% s                       long aidx = idx;
1 \* J; C. C3 F6 G                       wchar_t *wsName = 0;
2 z+ Z1 V* n  O; w* d2 L                       VARIANT vValue;- D' U% k; J. A& q3 A! [6 q
                      VariantInit(&vValue);
0 m3 d" m& z9 d- r                       SafeArrayGetElement(pvNames, &aidx, &wsName);
" S; i2 t0 e/ L5 e9 h
8 p, F7 }8 n7 B. _                       BSTR bs = SysAllocString(wsName);4 b% G5 w% h0 G! S. p1 W& p# q6 B( @2 K
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);" C" |6 J/ c  b) }' W
                      SysFreeString(bs);' _/ D; D4 H4 N- @
: `3 F% ~! g, G, w1 S# l% E1 n
                      if(hRes == S_OK)
2 `" \  j" J, n* r: d# C                        {$ I* E1 B8 V! E6 w3 E* Q# m
                         AnsiString s;
6 V3 h1 K" i* B' x                          Variant v = *(Variant*)&vValue;$ q, g$ Q  g/ a) d9 J
                         if(v.IsArray())
4 t+ e# d5 S: X3 h) W( z                           {
, t+ M5 K2 s7 n$ Q( V9 O2 J                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
! Q; H; s3 V$ ~5 ?) N                              {
1 ^" Z8 ?+ H8 f' _8 C3 k" t                                Variant a = v.GetElement(i);
- v2 I% h) e8 h                                if(!s.IsEmpty())
2 Z" t5 {  G$ o; ]- A7 |3 F                                  s+=", ";/ \8 |9 n6 R9 D6 C5 ~% k0 |
                               s+=VarToStr(a);; |' q6 f! `+ t! A! N7 Q
                             }! M! `/ c; O; [. k% h4 d- u  z
                          }4 n9 ?, B, ^- q% c" ?" q. D% H
                         else4 r4 C) y; J/ l4 t' D
                          {, p: B# h+ o1 L5 \- `
                            s = VarToStr(v);
* {; }$ u5 d* h# C$ g                           }
* p7 t- F  |, Q+ k  P+ v                          lpList->Add(AnsiString(wsName)+"="+s);
4 J* J2 q$ Y, o                        }
/ A% Q2 r+ w( }8 g) q: m& y- x3 _# R6 \8 d6 w  ~8 ^
                      VariantClear(&vValue);+ H" M2 g. y9 L
                      SysFreeString(wsName);
! s) O$ M3 g) ~2 q9 M5 c: H                     }$ y; Q5 ]% J+ Y2 V
                 }
8 m, n, N& U1 k+ W& O4 i/ z                 if(pvNames)SafeArrayDestroy(pvNames);7 _! j) U. N% n8 e
                iEnumIdx++;# Z) u. m/ u" |
              }
/ ?1 Q3 b. G# ~, ^+ [- w. s            }
" l, t& f/ H; i1 [           if(pClassObject)pClassObject->Release();7 D5 v& B2 Z% Y- ?- ]) ]# W
        }
2 {& z4 N# m' n, `  h% R% s% j        if(pEnumClassObject)pEnumClassObject->Release();8 k  R9 |* B  j1 v3 p# R( s: }
     }
$ o- e( V( g* I2 p     if(pWbemServices)pWbemServices->Release();
- i9 L) |( M: t# c0 G   }2 |6 y6 _1 S' `& e1 J3 {4 k: \
  if(pWbemLocator)pWbemLocator->Release();9 t4 Y  P% H6 `& H- x& v' J9 z
}. M; H; U! o) d0 O" \2 x
//---------------------------------------------------------------------------
; i5 ]3 ]5 e2 W7 D2 u$ [5 ]/ d6 G+ Z9 ]: a/ \* @1 W
// 通过 WIN32_bios 获取 BIOS 信息:
" {# E: R0 s" f6 I& x6 x9 ?9 Pvoid __fastcall TForm1::Button1Click(TObject *Sender)
6 p* J3 l3 f* V  _! A" b7 z! v{
4 r5 F1 c( n: c. ?' ^- w    Memo1->Lines->Add("================== [WIN32_bios] =================");+ i  g0 t3 L' z+ r2 p" K2 _7 m
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
( l7 P4 J2 @  ^3 y, ?) W# A    Memo1->Lines->Add("");( V& ~! v1 K1 j; Z' H- o" w
}, f) J. e( ^' m8 J8 M

( K5 Z; c9 o" S+ s; y--------------------------------------------------------------------------------' h+ ^. T( `: Z+ O- z' z" q

; Q# w) X2 Z. E; C$ ?7 f# SWMI 可以访问的信息类型有:$ K5 x% C2 w7 {4 H6 v5 h8 i
  Win32_1394Controller
, I7 j% u8 ?" r6 X" P   Win32_BaseBoard/ \; T" l5 \. M$ o9 P' ~
  Win32_Battery7 u% o9 Y9 H! `2 S& V
  Win32_BIOS+ u6 }% E8 b* {/ |' r0 m% \8 Q
  Win32_Bus3 K# d# N- H& z" B
  Win32_CacheMemory
4 s! K% }( b* C# s3 B% i   Win32_CDROMDrive( [& G3 W. ]! z9 V3 ^7 K+ R1 r
  Win32_CurrentProbe
) c8 N- M* a- j4 i$ e   Win32_DesktopMonitor
( J9 Y8 d. A% i9 y" s- _; F4 T8 G0 w   Win32_DeviceMemoryAddress
1 \$ ]. T) r7 M% i   Win32_DiskDrive
+ k# t7 X$ K2 }$ D$ ?' D   Win32_DisplayConfiguration
0 H- i4 C' N' w! `   Win32_DisplayControllerConfiguration' m2 L; a! P5 u
  Win32_DMAChannel
5 b' P, `  `, T* y   Win32_Fan
6 K  z, t0 Y5 [6 k9 g2 }& P   Win32_FloppyController
1 E+ C$ e5 C+ d! @# E2 M( Q   Win32_FloppyDrive; J8 n& i# d2 p9 L
  Win32_HeatPipe
. w% A4 s* ]; @; N8 H( X0 @* G   Win32_IDEController
$ Z0 E. E, L8 u/ i, N1 I) d- T   Win32_InfraredDevice
, O! v0 v$ X3 }( w; u( W, U9 L   Win32_IRQResource* }# j/ @% Z: a, Y. D
  Win32_Keyboard
1 Y4 @( I3 L" f) A+ \   Win32_MemoryArray, l4 s) y8 x) h4 V: T
  Win32_MemoryDevice
' c% E# J4 I$ |9 d2 A; @) Y% ^3 o/ k   Win32_MotherboardDevice
( M, H5 k8 v% I( A9 f% b2 _" n- }6 {   Win32_NetworkAdapter
* i; z1 {6 I1 l   Win32_NetworkAdapterConfiguration& u- p$ d0 A7 b3 y8 _" j9 f5 ~  U+ B
  Win32_OnBoardDevice
& F+ ]+ k9 P* t! s$ s   Win32_ParallelPort3 i3 D; o- @3 Y; o  X4 L1 @5 a
  Win32_PCMCIAController# u( q& j+ r8 R+ v5 \
  Win32_PhysicalMemory
! P" F" H7 _2 D) ]   Win32_PhysicalMemoryArray
: m: }# }4 B8 r, Z4 N  f   Win32_PnPEntity
/ J1 @2 |$ }# p# w/ D   Win32_PointingDevice
6 i% J# O6 t$ |! i4 W   Win32_PortableBattery6 c4 s; F, m1 I" e; a
  Win32_PortConnector
; ]2 p& @2 h' z& H! I. \/ z   Win32_PortResource
9 g- e% t6 _+ g; R7 t/ s   Win32_POTSModem
# [& n$ J5 ^) ^   Win32_PowerManagementEvent
, B2 |/ L2 ]) o, _, B& X   Win32_Printer
5 ^4 K1 Z7 @, B# @% r/ p   Win32_PrinterConfiguration4 o! l& Y/ R" d( k9 b
  Win32_PrintJob
) k/ K5 t4 Q: s' d1 D5 G7 r- _   Win32_Processor
, \7 l/ t8 |& G% |, y   Win32_Refrigeration* j7 B5 z1 I( L0 |) G; i! R0 h
  Win32_SerialPort$ K3 X& T% _( t4 H% j5 {
  Win32_SerialPortConfiguration
/ N: M) `3 h/ c, C! O   Win32_SMBIOSMemory
6 [: {, Y6 V8 L4 Q' L$ g   Win32_SoundDevice8 ?: Z. e" F7 x2 C" c" m
  Win32_SystemEnclosure4 l. ]1 I( e# a' Y1 H
  Win32_SystemMemoryResource
) N5 Y$ [% ~0 [" p   Win32_SystemSlot4 J$ {2 B) {* Y7 z. ^9 D
  Win32_TapeDrive
* I7 a% j* A* `/ K" p7 B$ Q   Win32_TemperatureProbe% T  y* g5 Z8 a% ?; L6 H
  Win32_UninterruptiblePowerSupply4 M7 N1 b0 l+ r: ~1 a# L, }
  Win32_USBController
1 M- ^1 ]: f# Q, ~   Win32_VideoConfiguration
* A% @  ?- i, u0 V4 U2 @   Win32_VideoController
" F& U- r, f9 c0 U   Win32_VoltageProbe
# c$ o% G% g( X$ j; t7 z8 |/ b0 `: ~2 E. F8 W4 z% W" V
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 11:06 , Processed in 0.018777 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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