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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)7 {. J% R! U4 c1 O; z

& Q3 y) b) E9 g2 J* Y$ T
) i( N2 v) l6 h, Y7 {: K--------------------------------------------------------------------------------
1 l0 o  t4 T  G3 IWMI: Windows Management Instrumentation (Windows 管理工具)8 z. a# P; u& V6 [9 V2 x
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
- d: c( o+ `% s9 W7 b   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
$ ?) i4 W: \! @6 n" _) e" W   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ! r7 s" ?* {) ?( e
& G+ T1 f8 B. `  V
--------------------------------------------------------------------------------6 {$ w% z: C8 D9 P- F) b" H' M' `. s
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面( O) f! i2 m, V3 Q# N

& g/ f% z& x7 k' ~--------------------------------------------------------------------------------5 ?3 u/ T2 h" s4 a$ c
① 初始化 COM 接口:( ?/ m, P3 ^/ |( M6 f
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
5 O' ?2 N% Y3 N   这两个函数在 #include <comdef.h> 里面定义。" k' A0 @8 x/ o! [+ [4 _

$ s6 ^6 y6 U3 H% }1 L! o* K② 获取访问 WMI 权限:8 v" O* f7 F9 P" w$ `
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);  c; c1 Z" F0 ~# D# Q; K
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。* z" Z% N+ a0 I, N
5 v; V# y0 |" U5 P  Y
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:, g5 K' o9 D3 y
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
3 V6 z2 c7 S2 y: y+ d8 B1 \4 C2 r  P4 q/ K5 E, `
void GetWmiInfo(TStrings *lpList, WideString wsClass)
7 L& O0 `; F# z+ k4 ~{7 \4 K$ A3 J( S# }: b( u* ~- R
  IWbemLocator *pWbemLocator = NULL;
8 u. y: C2 \  y0 t8 ~+ ?  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
# Y  s) B% S$ N3 l6 V6 U$ c- l   {
1 U. b( }4 }7 ~+ X! v/ d     IWbemServices *pWbemServices = NULL;: P+ n7 Q' @  x% K% W
    WideString wsNamespace = (L"root\\cimv2");
& ~: a' k) i' Z# Z- U     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
* L- ?4 U/ J5 |4 Y) V; ^2 r- d7 Y      {% q3 x: x% Z2 G& ^( D- \
       IEnumWbemClassObject *pEnumClassObject = NULL;
- ?) D1 D. x" w1 ~- I- v6 M        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
5 Q, q3 {2 U1 v7 x: }        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
  M1 [5 C  @, N$ o         {1 r( V2 B0 E) Z; t
          IWbemClassObject *pClassObject = NULL;
/ z6 R) n$ u$ B1 V# r           ULONG uCount = 1, uReturned;! z1 J8 [% i6 C3 b2 ~
          if(pEnumClassObject->Reset() == S_OK)
9 \' f5 x3 J7 E) _3 d4 q* R. b0 D            {
5 Y' b7 H1 R& }# [5 W( r, v              int iEnumIdx = 0;9 Q& {. z7 B+ o( ]& C
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
# ^/ V5 l9 ^8 u/ c+ o' B0 ?               {$ V: r$ k  m" o. u
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
6 f: b6 b5 V, r$ v; W: M# z( Y- S. D, X. n" |( f3 N2 Z5 M5 i0 h
                SAFEARRAY *pvNames = NULL;9 W3 f7 ]3 a1 ?8 u
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)9 f  m3 U/ H( h9 J) y( N
                 {
7 e/ s6 g: P  b% x7 r' m& G                    long vbl, vbu;! Y8 r8 c" Z5 R8 t8 w+ V, G9 o
                   SafeArrayGetLBound(pvNames, 1, &vbl);
; S) x8 d5 P3 ?* Q+ Z5 B                    SafeArrayGetUBound(pvNames, 1, &vbu);& H% p$ k$ a8 O; ]
                   for(long idx=vbl; idx<=vbu; idx++)0 D. s! y; m9 X
                    {3 ~7 s3 A' I: x1 R
                      long aidx = idx;
( c! u- N0 N* D# F                       wchar_t *wsName = 0;
) l& E+ e4 k3 s! h' Z/ b! {. L* l                       VARIANT vValue;
9 `5 [% g5 q' I2 e6 K% }+ e                       VariantInit(&vValue);
. y- Q" c* ?& P9 M8 L+ C                       SafeArrayGetElement(pvNames, &aidx, &wsName);
$ c: J& i1 f8 Q  h% c; A
; c+ Q. ^3 V4 M. b                       BSTR bs = SysAllocString(wsName);
1 U4 j/ t9 Q* D  i; V+ o                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
8 d  m( t1 j+ A6 Z6 v4 p                       SysFreeString(bs);
* H8 l$ ^2 n+ @0 {) |) e: d" ]0 Z3 O; i& I. @- ]* @: q
                      if(hRes == S_OK)
8 `5 H. ~+ s4 w/ m                        {
5 `$ u3 T. U* z# [# W4 D                          AnsiString s;6 N; F3 i% P# E% T
                         Variant v = *(Variant*)&vValue;2 e  F& [( @9 s7 {. U3 E
                         if(v.IsArray())% r( a) |/ R: ^& G
                          {+ U, K& w6 V4 o7 \) o( Q( G
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
4 e  R* |& y, r7 ?- o                              {: b+ M* i! U9 {5 d: a+ G
                               Variant a = v.GetElement(i);
$ p& @* x5 h( F7 A$ p                                if(!s.IsEmpty())
& D7 X3 F, Y+ G% A                                  s+=", ";) O7 y! ?; n1 M3 p4 Z
                               s+=VarToStr(a);
" k9 A$ t6 E/ r" {! X                              }9 O4 Y& O+ X, a! Q$ A: ?. K3 w
                          }  T+ W/ Z: y1 Y+ Q2 j1 N' J) _
                         else
$ C; K1 B6 S) d/ {- M                           {% p& C, t% E2 b  g6 N* _5 y8 F4 s
                            s = VarToStr(v);1 ^& {% Y% T$ v8 n) n6 K
                          }
0 U! N6 j) w) u5 V                          lpList->Add(AnsiString(wsName)+"="+s);
. X9 X7 E$ R3 G/ d7 W! Q                        }
7 c1 }/ B5 P3 _8 {  \
/ f5 R1 ]- G9 O# i! I$ x) s                       VariantClear(&vValue);
+ c% L# [, n, g. U# l! Z                       SysFreeString(wsName);
( e4 R. N* u. Q6 t& Z                     }( K, I7 I1 y  K. l6 \
                 }5 u/ }; a1 F/ U3 P1 t" M
                if(pvNames)SafeArrayDestroy(pvNames);
  Y/ P/ w" \2 }0 a. O                 iEnumIdx++;1 F9 v3 f: [- S8 M/ `8 _; f% A
              }
+ v* |# v' L% T6 u+ O            }
! b1 o( e. E& |           if(pClassObject)pClassObject->Release();' A4 H; Z6 K/ r3 W, N- m
        }; t- l8 y. C! l. p
       if(pEnumClassObject)pEnumClassObject->Release();7 V5 d5 b; R" |* o7 N3 m) K
     }
6 n' R3 E: r& {$ _% m  Z4 m     if(pWbemServices)pWbemServices->Release();
) q# `2 a5 n: u   }
0 D9 f0 x- H: @5 H' A- ]  if(pWbemLocator)pWbemLocator->Release();
- Z3 `0 F# o" e5 i3 C) z' g}" N2 d) v3 l* _
//---------------------------------------------------------------------------
, C. H" x- E& R5 a
. M& ~% {) P# \// 通过 WIN32_bios 获取 BIOS 信息:
4 |# C0 b2 b9 m, ~, u' f0 tvoid __fastcall TForm1::Button1Click(TObject *Sender)$ S/ ]& {9 A7 }( f2 X
{0 x. m7 y  e; b7 e- h3 W
   Memo1->Lines->Add("================== [WIN32_bios] =================");
, \8 ]- T; v- x6 Q' D    GetWmiInfo(Memo1->Lines, "WIN32_bios");' T  y) z" u: U7 N3 x9 }' q
   Memo1->Lines->Add("");
' u" i. p4 `, S: ?! H}
; {, ?% v* W; E8 j7 a! N8 g* ?' n* e
& q7 g; {/ [/ F( o, m; R5 O2 g. c--------------------------------------------------------------------------------
1 c) H5 S1 W4 R7 z. F8 p+ E! M+ E9 F
WMI 可以访问的信息类型有:8 A0 e* Q5 \- }. ~" A3 z2 G
  Win32_1394Controller
( r4 i% w5 q- ^  M/ y   Win32_BaseBoard
1 T7 [* U. C+ j6 \' _   Win32_Battery
) h9 G2 z2 C( v! G   Win32_BIOS6 s& I% w' o+ _5 A; e; E
  Win32_Bus
2 t9 `  A* A: \) z- X   Win32_CacheMemory
3 x+ j; F# H; `* i, h/ j4 t   Win32_CDROMDrive
! e' c' s$ ~$ A0 ?4 R0 W   Win32_CurrentProbe
8 O+ L7 L2 b3 \, c7 g( m7 G8 u   Win32_DesktopMonitor
$ S# i! J2 {7 {0 V   Win32_DeviceMemoryAddress6 ?0 W4 q. z- I. C
  Win32_DiskDrive
5 e4 G9 B/ c) C   Win32_DisplayConfiguration5 G7 a8 H) Z! K7 x
  Win32_DisplayControllerConfiguration
8 ]9 s4 J; g6 o2 O   Win32_DMAChannel
7 b; p' [7 C3 V8 u0 v: r* ~   Win32_Fan
& x: k% S' E: a! i* B# m   Win32_FloppyController
( {  q1 B' _2 [- a$ l2 j   Win32_FloppyDrive: E# K$ w" w% x; M9 M- Z" S
  Win32_HeatPipe
1 A' B4 t. K; ]- `$ ]   Win32_IDEController6 B  D2 S& T' g& u$ A% w
  Win32_InfraredDevice6 l" k& W( y7 A  E6 [
  Win32_IRQResource
. A( S" d9 e1 t6 Q! ?; I   Win32_Keyboard
/ z6 V2 w( e9 x/ r' p0 v   Win32_MemoryArray
& q, j$ L8 R* |* J' @   Win32_MemoryDevice
+ o1 r& g& h% y4 d8 k- B2 q* m   Win32_MotherboardDevice$ R% L) X& t5 T, @$ h/ u! `
  Win32_NetworkAdapter
1 Z3 M% G. O9 X: S; R. y4 a   Win32_NetworkAdapterConfiguration
, V" R; k+ c4 c+ Y% L5 d4 g   Win32_OnBoardDevice
; d2 t0 p. ?+ k% a$ b3 [# C   Win32_ParallelPort2 f8 i  S* X" g! S! K
  Win32_PCMCIAController* Q& T9 S" u3 c  R
  Win32_PhysicalMemory5 l5 f. l: B, G" n% x3 `+ b
  Win32_PhysicalMemoryArray: G6 ~- g- q; Z+ q7 e; n
  Win32_PnPEntity) E# S6 E  x* \* K) m2 Y: ^/ S
  Win32_PointingDevice
7 ?- ^6 S. ~  u% ]2 j   Win32_PortableBattery
6 ^8 @8 P1 ]# E! |% a+ P, a   Win32_PortConnector7 \- U- q# ]) V7 X3 S. g4 y) s% m
  Win32_PortResource
' u4 `9 ^9 A% N4 c4 E   Win32_POTSModem$ L6 ]) R  X' ?. f1 `1 g) d  a
  Win32_PowerManagementEvent
+ y! f8 l- F% [" H; [/ [- q; }   Win32_Printer
3 j( U( c/ X: I) F6 V4 T   Win32_PrinterConfiguration: N& j5 S2 D! a, U1 S# Q* Y
  Win32_PrintJob
' G; ?  ?' k4 V   Win32_Processor6 `, E  T+ S  n
  Win32_Refrigeration
/ R( u& x' P' g( _5 J0 q   Win32_SerialPort
# {$ h4 ]. ~  Z   Win32_SerialPortConfiguration
- M2 S! j: ?2 \& J* U  N* ~1 ?   Win32_SMBIOSMemory3 g6 v+ T; D/ X+ q* J
  Win32_SoundDevice
' s6 {  |; O. a   Win32_SystemEnclosure
6 D# l6 R; y2 ]" Q' m$ K3 B   Win32_SystemMemoryResource( k  H- X! E4 m  h( z/ T  d% M- G
  Win32_SystemSlot: g2 S8 j: w8 F& E1 J+ |5 O5 X
  Win32_TapeDrive9 S- R- T5 O0 n
  Win32_TemperatureProbe
9 l$ I, X$ N9 x  d   Win32_UninterruptiblePowerSupply% ]( ^# @3 V& Q! X" C( {. s" f
  Win32_USBController
8 w8 m9 l4 ?7 l4 [3 p- w  y   Win32_VideoConfiguration
9 n4 o" ]5 z! Q   Win32_VideoController( ]8 A3 V- L# Y* d1 f0 F5 \
  Win32_VoltageProbe
' F$ I- Z! v9 F4 x8 @- T/ U1 Z
$ g$ y( J6 m9 I& G7 c* D以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-31 22:54 , Processed in 0.018628 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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