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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
% a* q' g" u5 G9 K6 M3 G
1 r0 ]! @. v' q. f) c4 p
" D. `5 m$ L( l/ b0 J# d; x) y$ ]* h--------------------------------------------------------------------------------
, K& o: P4 ^/ hWMI: Windows Management Instrumentation (Windows 管理工具)0 N/ z; k7 ~) F, N# \8 O
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
3 N- @# C  w: o4 x1 k+ U/ V   利用这个工具可以管理本地或客户端系统中几乎所有的信息。* Z) C& \+ [9 C  @1 c$ Y3 P
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 * h/ z, q, Q/ `7 l* T

+ `/ j- \/ Q& Q1 K--------------------------------------------------------------------------------" N; ]1 ]3 i, h4 ~1 }% p
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
8 x4 O7 |$ p  g9 z* R- ?3 T1 [7 f; m$ t% r* e" g5 d" V
--------------------------------------------------------------------------------! Q: R. _% d* o% V
① 初始化 COM 接口:& e9 X- Z( C* ?- v, p4 g
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。6 V0 @# x) L3 Q0 B( j8 Y* r* L
  这两个函数在 #include <comdef.h> 里面定义。
' G' Q2 U- p/ m( s9 h3 T; i" L* }; t1 S, Z" D
② 获取访问 WMI 权限:
* j4 k" c, u6 {$ m/ ^3 r( k, E$ w! W   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
3 q& s2 h: {- i  F   如果这个函数返回 S_OK 获取权限成功, 否则为失败。9 c7 n# m. f! y* \- `! @7 M* ]+ d

% D4 J" v5 u3 k③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:& K; ~8 `6 \! h' j  u: d
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。& T4 Z" h. ^! w  `+ W

' p* y: L8 i& F- U" Dvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
* {0 e5 H. G; P/ ?( ?, J! b{
* O1 ]  U, Q4 _4 j2 S. T  IWbemLocator *pWbemLocator = NULL;6 W: E7 @/ s' w- J, z
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
1 D3 b* z! k8 K8 p& S   {# D. v! f( f* f  ~4 v. d
    IWbemServices *pWbemServices = NULL;* J% E) E4 [! B
    WideString wsNamespace = (L"root\\cimv2");* B8 g. H% Q! I. Y* W1 o
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK), l  N* [- T+ B. J+ l
     {
9 S" v) E! f5 u: P) P  a) N        IEnumWbemClassObject *pEnumClassObject = NULL;
1 Z3 n3 P/ {9 {        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
3 A! P/ r, Y/ S; N+ k4 s        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
0 I) o) ~) w3 Y         {
' a, S4 M5 B2 |- [% D$ X           IWbemClassObject *pClassObject = NULL;
4 s* {4 S! y: M0 L( K5 _           ULONG uCount = 1, uReturned;& r; Y; y% Q. I  g7 r5 m, }. `: x
          if(pEnumClassObject->Reset() == S_OK)  U- V* Q; e( C. e2 {" k
           {5 H0 r& T7 g& S8 R! D3 x
             int iEnumIdx = 0;! F( I! M2 P+ G& m/ ^/ I" |: c
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
! F7 C, j. V7 K, t% _: U               {7 `  A  X* x: K+ }4 Y, ~
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");3 Y. v$ d7 K' N# C' T

) z( R  O; U& T: z6 v0 e  |                 SAFEARRAY *pvNames = NULL;
$ a$ Z" i2 H9 E$ y# ]/ w                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)" Q' n/ }( `6 b5 i* X* h& d  h
                 {* o( F" Y- L# E- j$ M4 v* ~6 V% s; z
                   long vbl, vbu;
- u% h3 K$ t4 _: R# G                    SafeArrayGetLBound(pvNames, 1, &vbl);! G* M7 [' Q) x& b# [
                   SafeArrayGetUBound(pvNames, 1, &vbu);1 m/ \* W) ^, y) @  o
                   for(long idx=vbl; idx<=vbu; idx++)
5 m6 S  P$ A3 Q                     {; s7 ~' I3 N- I5 N' @. N) @
                      long aidx = idx;
: t! N2 J% A3 g                       wchar_t *wsName = 0;* p4 X% g2 C' _( j* d& n2 K
                      VARIANT vValue;0 f9 [$ u& f4 Z4 w/ C+ {0 G, N: `
                      VariantInit(&vValue);
7 [% M- ]2 w) ]; V% ]. b6 e8 e# F# F                       SafeArrayGetElement(pvNames, &aidx, &wsName);
, {" V" e) ^4 Y8 v% Z9 q4 e, e, t6 ~* o
                      BSTR bs = SysAllocString(wsName);, ^7 T; I' m# \# o9 r# {2 ^+ r% M
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
, q0 y! J4 M" ]$ f0 ~' L; z                       SysFreeString(bs);' X- P0 M8 @7 G- p2 n

5 G- d& ~  \) B) O- J& C* R' O                       if(hRes == S_OK)
6 G1 A3 O7 f+ V" `* y                        {
/ L0 `# Y  Z$ A. I1 h# e3 `. T                          AnsiString s;9 s/ C9 F1 X, V
                         Variant v = *(Variant*)&vValue;" z. u1 K( O) r# t% m1 s4 O
                         if(v.IsArray())
9 {( H3 S7 k& I                           {1 o/ O, {. H5 t) t1 B" G$ J
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
- M; `3 U) p% p5 N! J8 j, S9 Q                              {
! ^3 q6 k/ A6 I, {, ^                                Variant a = v.GetElement(i);
) A7 J5 z. `+ p% W) C4 s3 }& D                                if(!s.IsEmpty())
$ c, ^9 l* l' F4 I                                  s+=", ";/ P) w/ K  Q9 s- K, O3 Q0 C
                               s+=VarToStr(a);# A' q7 x  X  p( [5 g$ E  X
                             }
5 i% p2 q& J! L# E& y: [                           }
7 b& {8 z, a# E7 r1 W+ f                          else
0 v  ^* [- c1 i' U: }. }8 E. x                           {8 Z9 B4 Y+ I$ A6 ]2 [
                            s = VarToStr(v);. X5 ^3 c; s2 [
                          }
3 N/ }% w! c5 k; R- D                          lpList->Add(AnsiString(wsName)+"="+s);% o  U9 H( E( r& I0 l! Q
                       }
0 u: B. }3 l) \' m  y2 [$ ~3 N) h# E
                      VariantClear(&vValue);" \" u) U# r( ]# F5 ]
                      SysFreeString(wsName);
/ K$ B* Y* S6 @$ E                     }2 e; s8 y& s2 s. r
                 }
1 w8 w7 L. V' \, \: _4 p                 if(pvNames)SafeArrayDestroy(pvNames);) d! X: u% R' u* @8 @" _9 Q
                iEnumIdx++;5 y7 r+ i6 z" d: }0 {
              }
  {! D/ v5 i: }" `" t8 m( O            }
3 c+ _, A+ F8 b$ s6 Z7 T+ Z/ Y           if(pClassObject)pClassObject->Release();
3 {3 S5 n$ W# \         }3 r9 k* L# S. R5 G& F  N4 c
       if(pEnumClassObject)pEnumClassObject->Release();
; S3 H( r! f! b, I* _8 b. C2 ?      }+ q$ {- {; ^/ q5 Y& X9 d. B
    if(pWbemServices)pWbemServices->Release();
1 X  M+ k( V5 \, c! F3 C) |   }- H: k* \& J7 n- e. M3 c( S7 m
  if(pWbemLocator)pWbemLocator->Release();
' n8 J. u: \9 ?}
9 L  a8 }( H0 u( {0 z8 ?3 C7 K//---------------------------------------------------------------------------
* l5 Z9 X) M6 N5 H) f$ _  |5 q, k; _; H
// 通过 WIN32_bios 获取 BIOS 信息:
6 C8 L! y2 w6 _1 j7 Dvoid __fastcall TForm1::Button1Click(TObject *Sender)
) G, E$ g/ u7 {8 P{
8 Z5 }9 k$ k% g9 q' ^% C, `  [# b! |    Memo1->Lines->Add("================== [WIN32_bios] =================");* E+ w6 M/ A# g; I9 p3 B
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
# z$ m% G5 I1 p: c    Memo1->Lines->Add("");6 R2 t2 X" R& ?3 n
}
0 L6 C- ?7 c" [. @+ O0 r2 d8 ~# [9 e7 K2 L7 R. b
--------------------------------------------------------------------------------. h8 A# {9 i$ H) p8 m' Z7 y* z

, l+ c- i" _: p) I; K! U; t# B! p- YWMI 可以访问的信息类型有:) o+ E' Y5 T1 y$ F+ H* O7 ^  \
  Win32_1394Controller
4 H) z9 o9 ]3 H) \; `! d   Win32_BaseBoard
% R& ^: s' r0 }- F" X+ Q+ K0 f0 F% V6 h0 r   Win32_Battery
4 n! v# l; o4 t# y6 B8 J   Win32_BIOS0 q8 a- u5 e' j8 N7 n& D- d1 M
  Win32_Bus7 u# C0 a  l. ^' L$ Q& E, }5 @
  Win32_CacheMemory
  `! a) f' r9 U) {   Win32_CDROMDrive. {7 W2 J6 d# `1 n0 ^
  Win32_CurrentProbe8 Y" n' o  l% y4 P- [( |
  Win32_DesktopMonitor! i$ |4 s6 z; J; D' m# F9 G, H
  Win32_DeviceMemoryAddress
/ \, |1 j7 d/ X   Win32_DiskDrive) ^( m! Y3 h) J* R
  Win32_DisplayConfiguration
+ ]) U  P' L' E9 A2 H. e   Win32_DisplayControllerConfiguration
. B+ P/ }" k  U  P  g   Win32_DMAChannel8 q  @* Q& Q0 R! _9 Y& v8 [
  Win32_Fan
5 j0 T+ m0 K" ~- p   Win32_FloppyController
) c1 `9 u# r: h   Win32_FloppyDrive
. O  Q; t, Q! R& t# d3 M' i. P0 t0 q   Win32_HeatPipe
0 m0 `4 K1 a: y4 G8 b7 d   Win32_IDEController4 P  b/ ]7 b# p5 B8 y' Q
  Win32_InfraredDevice1 H" p3 O# ~+ h& l: X9 j
  Win32_IRQResource
3 c: A- ]$ _/ Q/ u9 H2 e* z# K   Win32_Keyboard
  ]2 t/ p* Y9 m' c% [8 P   Win32_MemoryArray
- u* X9 y5 R% h  [/ y" H9 W, U   Win32_MemoryDevice
' t% `6 I. ^* U   Win32_MotherboardDevice0 t* M: }7 @  l
  Win32_NetworkAdapter3 h8 Y+ r& W! f4 \6 V
  Win32_NetworkAdapterConfiguration6 h3 C1 `; |  J) K" |$ T
  Win32_OnBoardDevice
' ?8 i$ w5 q0 B7 i/ X, c2 C   Win32_ParallelPort. ]* F! s; J% {, ^
  Win32_PCMCIAController: y( B& A; U+ j. K
  Win32_PhysicalMemory, a- ]$ B" s5 _0 P+ F# Q. s
  Win32_PhysicalMemoryArray
2 }- t& C) m" O: s   Win32_PnPEntity- j: Z; D" a5 `0 m/ f. v$ E
  Win32_PointingDevice
# t( l  q8 e% b5 ]8 }   Win32_PortableBattery
  v1 j4 A9 O1 i: X) i   Win32_PortConnector
7 @4 I- p+ M5 N5 C9 U( W! O   Win32_PortResource! o1 l/ \2 I" q4 J9 r$ _9 L; l
  Win32_POTSModem
) L1 N. F9 _4 E$ @, I, N7 E+ c  H! }   Win32_PowerManagementEvent
# I, t; _* Z4 E3 [( s) @( _8 D  |   Win32_Printer/ `" c% i6 Z& X8 `; s# V, |8 x
  Win32_PrinterConfiguration
0 [, l/ u0 Z  G( [% ^& X0 h; b   Win32_PrintJob
% ?4 _. W* m* L5 I- c- q5 i2 R4 K   Win32_Processor4 r5 D3 \/ T: A5 }9 _
  Win32_Refrigeration
, c; w  K7 H" R3 \- b" J7 o   Win32_SerialPort1 C& j5 p4 `, c% E( E
  Win32_SerialPortConfiguration
  Q. ]+ {1 u5 V* V7 q2 v. B- w/ M   Win32_SMBIOSMemory
7 S, G$ X; ^, I2 N$ X/ V; Y( n   Win32_SoundDevice
+ }; b1 I: O0 G/ ?$ k, K   Win32_SystemEnclosure0 t' _, Z; [9 ]: o
  Win32_SystemMemoryResource
9 ~3 T0 r0 S, U- K: r5 [* C, M2 S   Win32_SystemSlot; A( N9 Y' Y2 A4 w
  Win32_TapeDrive
2 I0 D$ k8 @+ u) w% w8 h5 o3 r( o   Win32_TemperatureProbe* f5 i! x% y6 N0 ~
  Win32_UninterruptiblePowerSupply; @' g' s* `  H* v+ K! e
  Win32_USBController& C! o" a1 Y" q8 ]. N& u' A# Y
  Win32_VideoConfiguration; I, \, Y1 l1 v! V( o. w
  Win32_VideoController2 ?. m7 p( W  j
  Win32_VoltageProbe
) e3 y; L# {2 Z3 D$ e2 }+ ?) D6 E( ?8 D7 `# N/ x5 j0 L- _
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-18 08:47 , Processed in 0.019616 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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