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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
9 G% l8 ]$ B4 [
" s8 f# ^, }' Y3 @6 l% Q- _/ O5 b& |
--------------------------------------------------------------------------------, C  F; X; B+ T" k" Y
WMI: Windows Management Instrumentation (Windows 管理工具)
4 [4 p/ [7 p) F   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
8 v& ]- m% v& `* `. Y2 _5 B4 K   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
2 z% r6 t# g2 R' ^   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
9 t& t& V/ c$ N- R
: t1 A+ e# l, V) @( Z2 e; f+ U: A--------------------------------------------------------------------------------& o5 s: d6 a( T+ k4 G# q0 K
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
8 J4 _& H. E0 [/ _/ T7 E' R: X& b' ]: }0 [! V# q9 a5 ]% c  ]  u+ |
--------------------------------------------------------------------------------
8 y- @2 t# h# T# J8 r9 f& b① 初始化 COM 接口:
: p& P6 ~2 _% B5 t. h/ q   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。' S3 g0 Y( c0 C- b
  这两个函数在 #include <comdef.h> 里面定义。
3 d; Q0 q2 `8 Z9 J8 Q7 U# M
5 R: r! E7 `- A0 n0 G② 获取访问 WMI 权限:
% ~% e6 o- M: w' o& o. v( g9 s, p( x   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);7 [! a. B! }, {8 g5 x# x
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
, w, R5 x$ H8 x! G8 s4 g9 F* S1 v% {
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:' e$ {% i4 s+ ]8 ]" Q
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。8 R# M& ^& l7 M# H
7 L9 c. R  l5 M5 v; z
void GetWmiInfo(TStrings *lpList, WideString wsClass)$ z6 t- a& o  ~. }( v# J" m
{, z  b9 d& N( d5 v
  IWbemLocator *pWbemLocator = NULL;: V+ C4 }' L2 Z. T! z8 o% g* z) F6 Z
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
& k2 V* W0 F3 q   {6 {5 R1 u! a+ q; W( H% G$ {
    IWbemServices *pWbemServices = NULL;
1 q6 Q6 `7 ~9 [- E; O: K  ~' f     WideString wsNamespace = (L"root\\cimv2");
* C" {! X. E( `. q: u" y; N5 v     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
, H- y" Z5 A& D      {
) {- j$ L) x. I' q        IEnumWbemClassObject *pEnumClassObject = NULL;
$ [  b, E- ?( G        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;2 P% _  r' B# ]: l1 P$ h
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)' F. i. [* g. x7 \  I
        {
# s! F/ C* E9 y% x" p4 u           IWbemClassObject *pClassObject = NULL;7 |2 U2 ^1 j" Y
          ULONG uCount = 1, uReturned;
) |! K& Z6 o# z, z5 e- v           if(pEnumClassObject->Reset() == S_OK)
# |7 a% R( ^$ D            {( R; c, Y! E8 @( r  |* w: X" E
             int iEnumIdx = 0;
' ]1 r/ c: H5 H7 J6 ?. {4 ?* P+ j- T              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
* A  Q1 p; {! L) X# {               {
+ \/ I* F7 @( _$ ?0 _! ?                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");/ n6 |5 c* X/ z0 F
# j# P$ c4 q3 Z; U) ]
                SAFEARRAY *pvNames = NULL;
1 O, `4 ~9 `% p5 M) v( F                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)" G& D, U3 q9 D4 i/ Z: E- ~" [
                 {. s6 m3 ?" _( s/ \1 ]
                   long vbl, vbu;
# }" @) }/ L, s- M                    SafeArrayGetLBound(pvNames, 1, &vbl);
0 N% a2 T6 [4 G% d! ^" w& K                    SafeArrayGetUBound(pvNames, 1, &vbu);2 t' i; O. w1 w1 n5 K
                   for(long idx=vbl; idx<=vbu; idx++)- ]1 w9 z2 r$ V& w
                    {
6 N" {; o' y6 {* D                       long aidx = idx;
) o  H" R! q' V6 `4 `+ f                       wchar_t *wsName = 0;+ _% j/ L! n3 ?& {4 L7 Y9 r
                      VARIANT vValue;3 a! j, A. k/ z; i
                      VariantInit(&vValue);
2 V8 N1 L( O" I' u, O                       SafeArrayGetElement(pvNames, &aidx, &wsName);
3 V0 o( C0 E. w
# o$ m- f) h) b. \* y9 U1 z4 R                       BSTR bs = SysAllocString(wsName);% N! `/ L2 i% i! B
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);! L6 y/ `% i* G
                      SysFreeString(bs);
1 ^+ a6 g& I& h9 k* q( ^- M- H) h/ r# w. i) G9 Y( ~
                      if(hRes == S_OK)
9 u. S# |' k" H# k% j1 x; Z                        {: B8 `9 _& c4 e3 B
                         AnsiString s;0 k5 f& H7 t9 e( f) `* o- O
                         Variant v = *(Variant*)&vValue;, l$ A4 H8 w3 }+ v) R4 ]
                         if(v.IsArray())
# L( j1 |6 v4 G& C                           {
) A( ?, Z" S- g9 X: K$ X3 {4 W; O                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)+ x! C! W% |& r8 n8 U
                             {
6 q2 ?. `/ \. K0 N                                Variant a = v.GetElement(i);" U8 q2 D1 B) J( Z6 q. @  ^
                               if(!s.IsEmpty())& O, s$ V# _3 ~
                                 s+=", ";
- M( D" W: ^! I" Z/ X/ }. W                                s+=VarToStr(a);
  U% J8 E/ ?3 P$ [3 X3 |3 n                              }
; ?% o) A/ F% y+ t7 F+ K4 z5 v                           }% N/ U6 l) l- Z( R- C: c
                         else, \" a) d* I6 {1 Q7 D: l, ~
                          {
. Q! ~$ A1 [3 T7 x7 X& |/ E                             s = VarToStr(v);
4 C- }/ Z3 g: [& |# f" |! F6 e                           }) @( ]+ d; X" H9 A$ v5 T7 I0 j1 G
                         lpList->Add(AnsiString(wsName)+"="+s);
# K5 ]& y4 k" \( N- W: T                        }6 c2 _$ y$ ^( z* r1 ^! I% F

  }  I: ^" j( f* {' }' j  q                       VariantClear(&vValue);
8 l" R% m3 _  g* e4 W                       SysFreeString(wsName);3 l/ O8 k3 d, T3 Z  v* `
                    }
# J2 i0 z# {% M2 |- a                  }  L+ ~4 s6 s( x" o6 g7 o
                if(pvNames)SafeArrayDestroy(pvNames);5 Z# f5 r  Q" \0 c2 m$ }3 H# ~
                iEnumIdx++;  b+ l4 H( j- d( X) e6 l9 d
              }7 {; U" T- I+ O6 T
           }. S3 c$ e9 X9 S8 |
          if(pClassObject)pClassObject->Release();
; y1 w1 Z9 h: F; x1 T         }
& Q) j: D5 h! s+ W0 Y+ x; a        if(pEnumClassObject)pEnumClassObject->Release();
! d" q" \, m  ?2 ?- Y      }, g0 b3 H( c; l9 J% N* |
    if(pWbemServices)pWbemServices->Release();
. @0 o5 F7 i& A   }
+ a1 o4 b& I3 O/ k/ D  if(pWbemLocator)pWbemLocator->Release();+ ~2 }5 M8 `5 n4 i7 c/ P) c* _
}
$ ]& s$ Y2 n! |7 l9 N9 v/ D( t//---------------------------------------------------------------------------
2 f& z2 u/ d/ |& }  v' L) H0 W1 K$ D, q0 r& M# k) S
// 通过 WIN32_bios 获取 BIOS 信息:4 f$ F; O( f; Y8 w( R
void __fastcall TForm1::Button1Click(TObject *Sender)  |+ o% M4 F& r$ ]' |
{/ b7 {9 k8 B6 @/ T  s' v  v
   Memo1->Lines->Add("================== [WIN32_bios] =================");
$ D( {4 k1 ]" @    GetWmiInfo(Memo1->Lines, "WIN32_bios");5 w2 U/ B4 B2 ~0 E4 F! J
   Memo1->Lines->Add("");- _1 j" B; a5 r9 J3 h% q* w' i
}
% v" M7 e0 e6 c. p3 `; L3 d
; q* L- Y9 G1 I/ u6 I--------------------------------------------------------------------------------
# i: y2 B" f2 ?+ z# d$ G  X& h/ x% r( j
WMI 可以访问的信息类型有:
% m  q5 c# W* [% C* T' N8 l   Win32_1394Controller' Y$ K! z$ O% }/ x5 Z' ]. m
  Win32_BaseBoard) f( a* j7 I9 \9 V+ J
  Win32_Battery
) j- i. n$ P, o$ T* r& \0 Q   Win32_BIOS
2 d/ W) C5 D) ^) n   Win32_Bus
' U  V# X& ?- A1 r( A5 C5 R/ r# Q9 u   Win32_CacheMemory
: M1 A: B6 q3 r0 d+ _1 }6 L   Win32_CDROMDrive
$ l8 z- s& z6 T6 @7 d. c9 A   Win32_CurrentProbe
; V1 Y) Q8 W9 O5 E# y   Win32_DesktopMonitor3 u. M5 P. f2 Y9 K5 l, Z
  Win32_DeviceMemoryAddress
- j# |2 o4 U/ [* w0 g2 z% f   Win32_DiskDrive
9 p" r0 k+ p, b4 B4 A   Win32_DisplayConfiguration) n- d& g& j+ b7 ~6 f) Q
  Win32_DisplayControllerConfiguration
. q* v7 [8 G& R# l6 ?. {   Win32_DMAChannel1 ]) W. h3 ]4 E! k
  Win32_Fan
# J; f0 p& Q5 }$ `" h2 z# Y' i   Win32_FloppyController* q% K) H: ?2 G- Z. |
  Win32_FloppyDrive
1 l' i" d- t2 p   Win32_HeatPipe
. ^8 F5 c/ ^) q. R% C/ W   Win32_IDEController  c7 v) U; K& K  j- v
  Win32_InfraredDevice8 [4 j' M1 Y, m7 U# a
  Win32_IRQResource
% a. B% k' ~" F0 R" f   Win32_Keyboard5 y; S8 ^# J( G4 e
  Win32_MemoryArray
3 w! N. U1 `1 b5 N# c5 c6 F   Win32_MemoryDevice
! G! F9 W: W# ~   Win32_MotherboardDevice
) M! V& N0 [) J5 T   Win32_NetworkAdapter/ e  J. h: `7 I) P5 L- a0 H4 G# a
  Win32_NetworkAdapterConfiguration7 }# F2 w6 h, e" b/ V
  Win32_OnBoardDevice
, I8 L* C5 J7 P5 c$ R) A   Win32_ParallelPort
9 ?# C9 |8 t7 M* \   Win32_PCMCIAController% d) ~7 b) i" F/ y7 T
  Win32_PhysicalMemory( z/ z, u  n1 _& t( ]
  Win32_PhysicalMemoryArray* r) c3 G6 R# k# a, P& f
  Win32_PnPEntity
# q( e. @! e' @: V& w   Win32_PointingDevice3 x% m5 R% y6 S
  Win32_PortableBattery  G& h" i" K) v: l! J2 T
  Win32_PortConnector
- p+ |  H8 X0 N- q  H   Win32_PortResource
. c& ?8 k" J4 I1 z7 `) K( j( Y6 g   Win32_POTSModem* ]5 s  B* X* H  y0 z8 x3 _0 \
  Win32_PowerManagementEvent. E- u& @( d9 h2 e
  Win32_Printer
$ a- l) l" E* n   Win32_PrinterConfiguration* l, b1 ]5 m. \0 t! W3 K
  Win32_PrintJob9 Y. {7 |1 V" V% h* g9 v
  Win32_Processor
4 J# _  J/ [0 i. v/ h   Win32_Refrigeration
) ^# D+ |: q7 H4 w8 z  v   Win32_SerialPort& }* N5 ^) f3 j! c0 u2 [( D2 Y
  Win32_SerialPortConfiguration$ I5 w/ y) a7 |0 W
  Win32_SMBIOSMemory) w. ~; b! ~+ K
  Win32_SoundDevice' q, @: d& Q4 Z# a( q# m
  Win32_SystemEnclosure6 d4 n3 u3 \; p! G% ^% [; a. [
  Win32_SystemMemoryResource
( e- w% J7 r1 ~1 L* \- `- M   Win32_SystemSlot
0 H8 N& d" V2 ?1 ]+ J   Win32_TapeDrive) r) j1 ]* l; H" T4 R4 Q
  Win32_TemperatureProbe
6 o7 n) x0 J: G, C5 _   Win32_UninterruptiblePowerSupply# [; c6 E' z/ e! x
  Win32_USBController" g3 `* u) T. ~( ^# r0 c
  Win32_VideoConfiguration! \# D. A$ D: K3 R) O7 g
  Win32_VideoController
% i2 M6 y5 _$ g) u: v   Win32_VoltageProbe: K$ Z' H, ^( N7 d3 J& v

9 n1 m4 a8 g9 r' D$ x以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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