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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者): K7 G- y. l6 g  h9 j$ {- B! D

' w3 ?& v3 R% f% @2 v9 Z, B
7 h, x1 {2 H/ z" J--------------------------------------------------------------------------------5 z+ a" O/ i# [1 F) q
WMI: Windows Management Instrumentation (Windows 管理工具)
. N' {0 P2 b. c! a   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 5 X7 u/ t6 V/ Y! S
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。: k; k4 {  b  A  i4 k
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
, X* h1 j7 n9 x# v: `" k+ c. {" P! f: b. P
--------------------------------------------------------------------------------
( ~( {5 g- W3 j. x" y4 R9 T" zBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面) i, `$ [. Y$ b$ m) M6 b& R

7 m' |# q* U- L--------------------------------------------------------------------------------
6 K: u8 b5 ~* v① 初始化 COM 接口:( B$ J) G+ K- }# I# D
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。0 r: _* \0 j/ Z
  这两个函数在 #include <comdef.h> 里面定义。
8 y) m: `& w0 T: D" K
3 }# k/ D) C+ J( P7 T3 Q② 获取访问 WMI 权限:
+ ~8 [* E* ?# T8 E) a, J: V   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
6 w5 t( j9 H& B4 j; _7 I3 Z9 f   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
9 v9 s" M* a2 u7 S8 {0 W: E
5 F$ P& m1 ?4 R) R+ _③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
: \# Q" d4 w/ W8 u# l  e9 r9 p+ B   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
1 P% {: ~4 Z7 n: l7 i
9 {, ~9 s  H6 `2 J% K+ c8 Wvoid GetWmiInfo(TStrings *lpList, WideString wsClass)+ b7 g+ p: M# C" \5 j4 d" m, U/ X
{
, C. S' C7 b7 E. s+ Z8 H  IWbemLocator *pWbemLocator = NULL;
# {( Y2 _& p. {; m% w1 }6 Z  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)/ _" D2 Z5 k0 m
  {
" d+ b, y" o  [. I7 }( S+ B+ k     IWbemServices *pWbemServices = NULL;: C' D( n; r2 `6 g! H
    WideString wsNamespace = (L"root\\cimv2");
4 ?6 o; Y6 r1 R# l     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
; i, {& _% Q% `/ c      {# Z& O' [6 C( c. \
       IEnumWbemClassObject *pEnumClassObject = NULL;
5 \! w: f( _$ d2 e* @        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;! U+ M7 E# y& e: w: I5 L
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)* P3 `# b: P6 o7 ]0 E1 `9 ]
        {
! w6 U' |# o0 M9 ~& e  q           IWbemClassObject *pClassObject = NULL;
( a! w7 w% p9 n/ X& D           ULONG uCount = 1, uReturned;9 k( |& m/ b6 W5 G& H8 g
          if(pEnumClassObject->Reset() == S_OK)
. s; `1 d& y/ O& J9 V2 ]            {
  r$ U9 h( e$ j  U% e. ]              int iEnumIdx = 0;
2 y. |0 j; B: k              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)( x0 x2 b7 V. m" Y0 j( E$ d/ Y
              {/ N# \7 N: x8 a
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
; O4 P) ~9 P2 f- a3 |  i- }" k; H8 F! `( {' A, x+ [
                SAFEARRAY *pvNames = NULL;
4 l" v/ t3 q- L% w0 m                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
1 G7 X5 g  ~2 l2 R+ J" X                  {* T3 h) g2 \8 a* E8 g
                   long vbl, vbu;  H3 {; \. b1 t! ?
                   SafeArrayGetLBound(pvNames, 1, &vbl);' L' p9 v0 ^1 _& v: G
                   SafeArrayGetUBound(pvNames, 1, &vbu);
9 U- ]% a8 n% Q( s                    for(long idx=vbl; idx<=vbu; idx++)* @# }3 p" h( K" w$ l3 R, z
                    {8 s7 h, y8 s7 r- e; T, ^
                      long aidx = idx;
. H' b+ ]( n5 |                       wchar_t *wsName = 0;
5 E; T! ?+ t- i: c6 q! }                       VARIANT vValue;3 A$ ?8 b2 S! {- ~$ P- E
                      VariantInit(&vValue);$ ^3 e% W2 ^3 C" V7 v* n
                      SafeArrayGetElement(pvNames, &aidx, &wsName);5 X# i8 k3 T* |7 m
0 }4 F0 I* G  G: y
                      BSTR bs = SysAllocString(wsName);
3 x' M- ^1 X( ^% z                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
& Q  l9 H/ i, c+ a- m                       SysFreeString(bs);
! \% l8 w% Y/ v; J9 b# D
4 C& b" j/ Y" D                       if(hRes == S_OK)
+ A5 g  B, P: W9 m8 J                        {( p/ ^$ ?$ I! s* I  n, v
                         AnsiString s;
* }# U' U0 R# ~7 g7 _                          Variant v = *(Variant*)&vValue;: m# J1 J9 Z! r5 E8 C: W
                         if(v.IsArray())
; q  O; M  M+ Q* h4 b5 _                           {
& O8 c. t( ~( N9 X, C, l( z2 ?                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)  _  p- x1 y# Z% t. h8 B8 G
                             {
/ @9 U9 V, Z! m8 D! [                                Variant a = v.GetElement(i);
( q$ B- B9 U, g+ w7 Q2 I6 N                                if(!s.IsEmpty())) M3 ~, f4 b; s9 D- q
                                 s+=", ";
3 O* l, [* A& p5 M- {, B                                s+=VarToStr(a);/ ?5 z$ H8 ^" G6 t
                             }4 e' j8 Y. L0 u. _; k9 A% W
                          }8 |' k. j  W  N8 F
                         else  Z- |$ k' g+ ?) g& G( ~( f
                          {- J8 h, {" T. A- T9 n% `7 G
                            s = VarToStr(v);, Q. k4 u  \+ o; M7 B0 \
                          }0 w9 Y9 x" f9 V, T) |1 V
                         lpList->Add(AnsiString(wsName)+"="+s);
& \  I2 f/ H9 @+ Y                        }
  K5 G) o: o  E1 o, U0 l' |8 u+ K$ l2 R/ h
                      VariantClear(&vValue);
% v; G4 Z0 p4 r5 }4 Q2 s# Z                       SysFreeString(wsName);
. [% O" B' E/ t7 g2 `% |                     }* u5 W1 G4 h7 l. |# [/ R
                 }
3 [+ Y7 I0 K& a1 H9 V% a$ v                 if(pvNames)SafeArrayDestroy(pvNames);
3 u7 x$ r6 T7 e. h5 j                 iEnumIdx++;# S' X5 \4 y# U2 ?. Y
              }/ ?. j- ^! {; J3 H6 ^
           }& ?4 _/ U; Z" Y( l& r
          if(pClassObject)pClassObject->Release();1 O. P5 C0 g9 L. ]) I" w' |: m! G
        }
3 P( E. L1 ]  y  Y        if(pEnumClassObject)pEnumClassObject->Release();7 R* e3 Z" K! V. S: Y
     }
% J9 p, `7 b/ f  e) n& T* ^. A     if(pWbemServices)pWbemServices->Release();
/ s' u: R  j6 @3 o& c5 P/ e! }   }* R' R9 Q9 K5 t/ G: p+ s' \3 X; M
  if(pWbemLocator)pWbemLocator->Release();
! S3 V3 p: r1 e, a# R}
0 N% z* k+ [" u//---------------------------------------------------------------------------
0 l2 V) |2 ]7 @5 x6 c, z/ C6 ]: s2 Z% L$ r# g
// 通过 WIN32_bios 获取 BIOS 信息:
: }; @3 C" Z8 C; N- ?void __fastcall TForm1::Button1Click(TObject *Sender)
* O9 g& Q! O4 c8 D% d. w{
1 D/ Z3 f$ n# D* x3 Q" |5 w8 ~    Memo1->Lines->Add("================== [WIN32_bios] =================");
4 `4 `3 K0 j3 V    GetWmiInfo(Memo1->Lines, "WIN32_bios");
$ ?+ j  J5 ~! R4 j; _    Memo1->Lines->Add("");
0 ]! m5 r0 k" x1 `2 ?6 q. }+ x, u}1 p' a' M" d* q7 c" C
7 w$ U4 @$ B! q! c. A' j: v5 ?
--------------------------------------------------------------------------------* L9 N1 n1 p5 _) A3 }1 O$ S
6 t* |; K8 q* S% \+ a
WMI 可以访问的信息类型有:- q& {8 s% [4 O$ c3 M
  Win32_1394Controller& [$ Y) D1 V+ O& V
  Win32_BaseBoard0 [! ?  e3 V, L7 u% q
  Win32_Battery3 b4 b: B( j) Q! O/ O, W- y
  Win32_BIOS
$ A; u0 U* l: [# }. U) p/ b   Win32_Bus
! c. v/ `  V. ~) Z6 ~: a   Win32_CacheMemory
2 z( K* ?. [. U6 }   Win32_CDROMDrive
0 x+ x/ }2 H2 o6 y% A" L   Win32_CurrentProbe+ l4 c4 a0 L1 v1 Y. ]& p
  Win32_DesktopMonitor8 i& w9 l$ ~2 L" r9 C4 O
  Win32_DeviceMemoryAddress
. d9 ^& y/ r. A3 N9 _: G8 X$ |   Win32_DiskDrive# X+ ^! c0 E  {- h8 A
  Win32_DisplayConfiguration) g2 @% u; M, ]: ^, S
  Win32_DisplayControllerConfiguration
6 ]7 Y. Q8 X9 h6 b, }& e$ k   Win32_DMAChannel  K8 R6 W3 V- c1 A( \6 W: g
  Win32_Fan
# R% ^$ j' i) a: _' S0 b* p   Win32_FloppyController8 O8 U2 e+ v- n; [3 {+ J
  Win32_FloppyDrive# U$ k$ S" j6 B
  Win32_HeatPipe
8 R2 a: X  s: m* t4 c+ P   Win32_IDEController
7 h9 m3 w: w) W+ a7 y, s- ?   Win32_InfraredDevice+ I; l; P% H  b
  Win32_IRQResource3 `6 L/ c$ Z; l8 b  J
  Win32_Keyboard, [/ v& x) b- j& ^  y0 e9 r' @
  Win32_MemoryArray, c/ S; Y5 h' f, B
  Win32_MemoryDevice
% W) v& H- o" r1 o" \: Z3 ?   Win32_MotherboardDevice2 d  `% s8 P4 c, ?; n2 i+ @  W! J
  Win32_NetworkAdapter
2 o1 ~4 o' J/ V6 e; M   Win32_NetworkAdapterConfiguration
2 n( w5 U; C, P+ k   Win32_OnBoardDevice* ~: x( q3 g# `+ L7 q4 l1 C
  Win32_ParallelPort
" t6 V# ~% w/ o   Win32_PCMCIAController* ]' w! v% `8 |5 K
  Win32_PhysicalMemory
3 I  Y- I5 T- V# v* S6 N   Win32_PhysicalMemoryArray& J2 z: X7 ~4 Q& g$ X8 A
  Win32_PnPEntity/ Y, H: r, e( U2 H7 n
  Win32_PointingDevice
1 S' l3 O. [; M+ D; a   Win32_PortableBattery+ T* n4 S$ \0 m
  Win32_PortConnector3 x  w) d8 w4 I9 p$ {
  Win32_PortResource
' x' x1 Y2 P! m   Win32_POTSModem. E4 q! Q7 f$ y) U8 [
  Win32_PowerManagementEvent
7 f1 {7 w; w( ~   Win32_Printer8 H" W' R' j! F; \5 \) m" R
  Win32_PrinterConfiguration
3 m( s: _7 |$ ], L: s  m   Win32_PrintJob3 A6 C  I- t/ [6 ?
  Win32_Processor% Q; x4 g) J$ a$ N9 ?7 A2 \1 u4 o+ s
  Win32_Refrigeration" C+ _. X9 Y/ x0 {. p
  Win32_SerialPort0 _) M/ R( p4 |7 |3 E( m
  Win32_SerialPortConfiguration0 ~" K& R  Z" o# Q" F" a3 b6 n
  Win32_SMBIOSMemory
0 L( Q! d' I  b4 X" R   Win32_SoundDevice
: B* f. {0 o2 o! l% l9 o7 p( b   Win32_SystemEnclosure/ d8 H6 N$ \3 M" C& {% [
  Win32_SystemMemoryResource5 c. b; r6 o! d% \3 A( x3 ~) N
  Win32_SystemSlot' ]. l4 ]# ?$ P/ M7 e
  Win32_TapeDrive- M2 S  t+ I# g1 j& N) p  d
  Win32_TemperatureProbe; y" W- z8 j3 W. |+ V
  Win32_UninterruptiblePowerSupply
0 @0 f4 t$ g! F% f4 Z* Y# Q   Win32_USBController
5 T  T( @% K& s, B   Win32_VideoConfiguration
9 \% Z8 {1 q! Y! e. i$ ~* G5 e   Win32_VideoController
- o, B7 o/ A4 T7 X; A! k: }/ Y   Win32_VoltageProbe8 \7 `4 r2 `$ g" g( {8 Q
) D8 X1 z$ `7 a. ~2 Z( a% S6 [
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-26 22:39 , Processed in 0.018629 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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