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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
% S+ Q1 W3 d" G  L) Z
% Z8 y. ~* m/ K, z
) s' u& s3 d+ O' U6 [--------------------------------------------------------------------------------
$ a4 W* W, Q9 N' c- t5 a; z$ x: _WMI: Windows Management Instrumentation (Windows 管理工具)
5 y3 _& u1 s7 ^( Z3 @, q( N1 n   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 : S" j% [; N0 S& T9 ]! |- }. ?
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。- c& A3 T; O6 K1 h  a
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
1 V9 E* h! t. v
1 G9 |1 {! U+ H) Y--------------------------------------------------------------------------------, _! I. c7 U) U8 X
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
( ~9 V8 J* `" P, A
2 f6 y$ A) _7 r% j) L--------------------------------------------------------------------------------
" I- {8 O/ R9 v3 \& Z! m① 初始化 COM 接口:$ C! N. \4 y/ P* `1 Z; ]4 b
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
: L: a$ }2 c( y; p' w   这两个函数在 #include <comdef.h> 里面定义。1 t; i1 Y- K/ O) @( h$ w

) p3 b' N+ W( R  p9 M% b. b( F② 获取访问 WMI 权限:
5 \1 v2 h. }5 ]7 J$ {   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);. E, k; L7 n6 C6 N' ?$ e
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。( q  {% ^, K9 d- W3 j

5 H+ [# Y- S; J! ~1 ^: x" R- n! T③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
2 R. d1 x  R7 t3 H/ V   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
$ }! \! m9 m7 l  L0 ~* ?( a# C1 e- K/ e/ V5 D% X0 a
void GetWmiInfo(TStrings *lpList, WideString wsClass)
2 C+ P- {; I; S" x{
9 x. z; w" m1 ?5 z- S  IWbemLocator *pWbemLocator = NULL;
6 W- }+ u, a. b  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
  {' Q. u9 @8 R/ {" c   {$ F9 t: m# s3 J2 _; l# L2 _
    IWbemServices *pWbemServices = NULL;0 T# X* X: u- [' Z
    WideString wsNamespace = (L"root\\cimv2");
4 C9 D, _% d8 p* f     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)1 s4 J+ Z5 S& I3 A3 s" n+ x
     {
, Y) {) }8 R0 c$ o) [        IEnumWbemClassObject *pEnumClassObject = NULL;6 _: m& s. e$ N/ i1 s. F% G
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;" O1 a5 n7 h) c: }  J7 c
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)0 f$ W9 z% p8 K
        {
3 u# Q2 z8 J2 L* v           IWbemClassObject *pClassObject = NULL;
3 X% K+ q" Z- J2 g. I7 l1 }5 P& a           ULONG uCount = 1, uReturned;* x4 o7 C$ P7 b" h# ?( h  `! _
          if(pEnumClassObject->Reset() == S_OK)9 F, g* o" H; L$ A6 J
           {
  M( Q: |! {) k1 [              int iEnumIdx = 0;
$ A; f: m& d9 Z7 r" u% {! W              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)% }/ f7 L1 d! n6 p
              {
0 {' `9 K8 e1 t) s& n/ ~. L                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
2 H. D+ e% x+ Y% q, U1 v4 X
& J1 }6 U, f2 N/ m                 SAFEARRAY *pvNames = NULL;
) O9 C1 b8 O, a7 @- K- h* l: I                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
0 U, m0 v2 z4 H$ D                  {9 Q; a8 }( c; w- a$ s$ e
                   long vbl, vbu;
' k7 P* F, t9 b                    SafeArrayGetLBound(pvNames, 1, &vbl);
5 X* e& Y2 o) ^; B( h* g0 U! `. s                    SafeArrayGetUBound(pvNames, 1, &vbu);
/ k- S, M8 o5 }* H$ n3 q                    for(long idx=vbl; idx<=vbu; idx++)
. V  o$ F2 E9 N4 O1 e( B( Y% b                     {5 Q. z- Q# N& o* S9 M
                      long aidx = idx;
8 H; l' D5 J& z* y8 c                       wchar_t *wsName = 0;
3 x! {4 M4 c& S                       VARIANT vValue;8 K- ]9 W5 d1 J4 q$ Y4 T5 [
                      VariantInit(&vValue);
8 P) u. x5 g: b) h                       SafeArrayGetElement(pvNames, &aidx, &wsName);1 Z- W% [- K/ P% a# p
' H- u" e) @, d3 V. _
                      BSTR bs = SysAllocString(wsName);
- j+ s4 G0 j; }7 @                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
: T+ t9 O+ a5 X                       SysFreeString(bs);
& T; o6 q! f9 O% p$ u, w: G1 s; a1 z
+ ]1 [# [9 H$ n- o( Q                       if(hRes == S_OK)
8 F2 ]1 H( d* c# s, {- o                        {  O0 n' q& j6 o9 ]( Z
                         AnsiString s;% W5 {1 D. K* j% u  s; g
                         Variant v = *(Variant*)&vValue;2 w! A, K% Z; \: I4 Y5 e6 i
                         if(v.IsArray())
3 A; G) C# W$ f* G9 v/ v                           {
  J4 c* [0 s7 J# s                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)* e- W2 }# E3 L
                             {
  t# r. @$ V- [. s# B7 [) l                                Variant a = v.GetElement(i);0 ~- b% C% v+ E) }; ^; B
                               if(!s.IsEmpty())" y4 J9 ?: \! r! T
                                 s+=", ";
9 @9 d2 v$ H6 A3 @1 E' z; n: x3 c) [                                s+=VarToStr(a);
8 p  F- {+ s+ [" s  {                              }
8 n, M# |* P  o& ?; F                           }
% p' h% G! q+ J                          else
$ a. h/ K- M; G6 F6 m4 b* H1 R                           {$ O9 A! t4 ^, I3 p7 |; V
                            s = VarToStr(v);$ d1 ~% `/ x# N* ?
                          }
/ y2 _( k  H9 ?. X0 M                          lpList->Add(AnsiString(wsName)+"="+s);4 @6 b5 b. B' x3 a2 i
                       }0 t, C+ L9 n0 v, a3 L+ ~" Y

% t  T, n* R9 H3 ]. Q                       VariantClear(&vValue);3 @- F' l9 W( X, m" \( W2 ?
                      SysFreeString(wsName);
6 L3 q0 R, Q) E* T3 }' f2 F                     }9 W- k4 |* u5 U  k  b$ t2 y' T- H
                 }0 Z. Q( G3 c1 O* c1 \$ {! `
                if(pvNames)SafeArrayDestroy(pvNames);
. C, w. U* \5 l* o# s( _7 {- k% L4 d                 iEnumIdx++;6 |  e  y; P( D4 Z+ q
              }  ~; L" o8 q* J0 g, |
           }
& ^9 @# y+ G0 K3 y           if(pClassObject)pClassObject->Release();
! u! F, n8 e- {  m3 u1 }2 c/ F5 H         }
% ~9 }% V4 f3 W# A        if(pEnumClassObject)pEnumClassObject->Release();
4 v' k4 K  M) [: i9 ?2 v1 Y      }. {" y7 b3 Z% k) D7 {
    if(pWbemServices)pWbemServices->Release();
6 @' w+ y+ j3 g; ?/ }   }
% r. {' @/ |+ \0 o9 E- q) Z  if(pWbemLocator)pWbemLocator->Release();
6 h: G- q. |/ v* R- B}- f. x: p2 h7 H1 r+ K! J$ h
//---------------------------------------------------------------------------7 L: ]: a8 t7 a  w  a
9 N5 R& s5 o, n/ m6 G4 p/ _
// 通过 WIN32_bios 获取 BIOS 信息:$ S0 y8 a; `2 N+ S' K
void __fastcall TForm1::Button1Click(TObject *Sender)
; w3 m: b. J+ D0 i) e/ j; g* N( }{
- i: I  M& l6 H& t    Memo1->Lines->Add("================== [WIN32_bios] =================");3 J) V7 g2 O- ~5 d1 a) x
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
' W0 Y( ^$ I6 u7 q+ u& u7 p    Memo1->Lines->Add("");% W# g  T: S) f' e) s
}
) K: j8 x2 K* K. k. H$ R1 |+ T. x* w' \
--------------------------------------------------------------------------------' A! ?% U# |$ d" A4 ^. K+ F

6 s. k' \  q  t+ X$ Y) W9 }6 OWMI 可以访问的信息类型有:2 I. [, b# O5 \+ X) n  x) ^
  Win32_1394Controller. J6 n8 H3 k& |
  Win32_BaseBoard
6 F9 h9 C  A; Q: M. f   Win32_Battery' I2 x1 X8 ~: H2 H
  Win32_BIOS
2 C6 ~& {( ]( G# ~   Win32_Bus8 E9 {8 ?9 }' b3 u
  Win32_CacheMemory% [/ l- t3 }1 D* B" z
  Win32_CDROMDrive
/ N" h" Y2 `0 y2 a+ n   Win32_CurrentProbe
7 }6 A0 m! i: b. L( J: U; q4 g! B   Win32_DesktopMonitor& u& Y) c3 e6 v* \% ^
  Win32_DeviceMemoryAddress
: {3 W  z2 T) B, I   Win32_DiskDrive5 Y* S( H, l$ s7 X. t9 w
  Win32_DisplayConfiguration
) ]; p) K+ l! Q5 G   Win32_DisplayControllerConfiguration, h! ?, X9 ~9 g5 h
  Win32_DMAChannel8 K5 x9 T; |) g% U' L7 I0 d4 w, L
  Win32_Fan
0 N6 R) h  `  ]5 H   Win32_FloppyController
; ]0 S( O3 c. T0 [, i$ [   Win32_FloppyDrive
* S4 B# T9 v. S4 k& z* U   Win32_HeatPipe& F$ _% B5 W, D$ z: `0 S- @: w
  Win32_IDEController
) W" |5 @' ?$ ]" Z  V) b  W   Win32_InfraredDevice7 X% N. I# Q" R3 G7 d9 F
  Win32_IRQResource
% Z/ A: K. N1 W. Z5 q- i( o7 k   Win32_Keyboard/ d& R5 d" c7 Y9 K$ U% b& l
  Win32_MemoryArray7 ]- V2 I, n3 W6 T
  Win32_MemoryDevice
: Q  s1 E, H7 j* z; D0 n& h   Win32_MotherboardDevice, [4 X3 {% d, d2 u& w
  Win32_NetworkAdapter
7 P* M3 ?! v/ m  y* E# I  w7 v* e* v( B   Win32_NetworkAdapterConfiguration' f/ X$ U/ f. n
  Win32_OnBoardDevice
# S: J) H- u; j" N# Q   Win32_ParallelPort
0 C+ u; a5 f1 g# _& p   Win32_PCMCIAController
* g; |# l' \4 e% c+ z   Win32_PhysicalMemory
$ z$ r/ V& E7 K   Win32_PhysicalMemoryArray: A# x' r, ^  F8 i8 c7 n9 H
  Win32_PnPEntity- I; |) d9 d$ g/ a( V
  Win32_PointingDevice
8 P' T" u# T$ ~9 p6 i' z( n6 G   Win32_PortableBattery) X- Y; O, _; u0 @2 `
  Win32_PortConnector
, ^; O, P& F6 ]7 |+ M( O$ K   Win32_PortResource
/ i8 k$ i0 X1 p1 g   Win32_POTSModem# r  B. F! r" I& i' G
  Win32_PowerManagementEvent
" d$ v8 p+ q9 G' u  T- j   Win32_Printer( T7 K4 E$ Q5 K% F
  Win32_PrinterConfiguration
2 d) V- A  S1 s- ?/ f* P   Win32_PrintJob
# B7 @8 m( E* V% m0 q% Y% P   Win32_Processor4 C8 Z5 \! |3 o/ y( B  s
  Win32_Refrigeration
) P! }  z& L1 Z7 ?   Win32_SerialPort- F+ C0 u. m9 H4 g+ t
  Win32_SerialPortConfiguration1 h8 g8 l  X; G( Q9 ^5 K. |
  Win32_SMBIOSMemory6 R3 l" B  _3 A, |% ~+ V
  Win32_SoundDevice
2 `; Y1 D' \3 P9 E+ i! X) [& n$ q   Win32_SystemEnclosure0 |: }$ [+ m3 b* \5 B5 U$ R7 f
  Win32_SystemMemoryResource
0 F9 V0 i& J/ e& |& g   Win32_SystemSlot6 \, m+ N& G: E
  Win32_TapeDrive) {/ `5 Y# \' t# o8 M  S! A4 O# T
  Win32_TemperatureProbe
; c5 O0 v. L) {  Z2 d( ~4 e   Win32_UninterruptiblePowerSupply
$ r0 c" a# o  V7 T3 V$ r1 F   Win32_USBController
# [4 a/ D# E6 I; {& a) P- _9 k; f: Z   Win32_VideoConfiguration
6 B7 h8 x! h* \, ?* C   Win32_VideoController- F7 r2 S7 H! t$ D/ _
  Win32_VoltageProbe
) D- @" j. }" [4 y
( j5 d& m. ]: \! ]0 s: H5 l/ f+ {以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-9 00:12 , Processed in 0.017389 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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