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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
* e: K7 A4 l, e) A" ]# o
% K! T9 W; D# W1 F/ j$ [( D& w4 Y5 Q4 Q' U
--------------------------------------------------------------------------------: {, t, ?, x; k4 M3 |8 |
WMI: Windows Management Instrumentation (Windows 管理工具)
8 a; x& @  g, s7 o0 h   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
4 x% I$ }; y$ s/ y. |7 }   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
1 b9 d9 k! k, l+ W& x   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
+ ^# r6 o0 z1 b% r/ d( M7 L( B6 v6 O$ y' r# V' m
--------------------------------------------------------------------------------1 t/ a& n" ~% p1 ?# N
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面( r& }; X" S9 @2 @+ z

  E0 R, U8 g) y. v+ E% l" j8 U--------------------------------------------------------------------------------
' B+ o, s" K& v' l- C① 初始化 COM 接口:
! w3 R7 C; X) W' w' a   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
# p+ S; Q: Y0 i% c$ B   这两个函数在 #include <comdef.h> 里面定义。' J; G; J4 t$ }6 ~

! ^  v+ V; Q" r# ?- x  X2 k+ |② 获取访问 WMI 权限:) n* S6 K) T* a6 ^" o6 m
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
6 q5 Q+ @9 r. a. i6 o7 D   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
1 W2 M( `& R/ e/ g! C9 `0 Z* T0 a+ ?% y' }! o
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:# d2 g8 v  K# k( [% z6 ~
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。" M# _& U8 a, N" N$ r1 d7 n1 p3 K

$ a( Q, f8 x2 t- m7 F5 cvoid GetWmiInfo(TStrings *lpList, WideString wsClass)6 N; @/ ]1 W9 m
{
. f) q# \' P) \, \  IWbemLocator *pWbemLocator = NULL;: @8 R0 @3 g, j7 w- ?0 b& T# }; n8 p, }4 V
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
0 x8 L& s7 U/ |3 e4 l( }   {0 A) |) A0 G# T2 }/ E; x; e6 |" v
    IWbemServices *pWbemServices = NULL;" F1 {, M* H3 r7 m0 ]; H0 A
    WideString wsNamespace = (L"root\\cimv2");. J5 v" L2 K; H' v
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)  m1 Y+ R& B: e0 s  }/ V9 Y5 z4 h- g
     {, g0 x4 T8 s+ f$ f" o$ I6 Z* y
       IEnumWbemClassObject *pEnumClassObject = NULL;
% x; e" O1 t4 d; [) J6 w, Q+ `* h        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;! Q+ F+ z" h1 Q# k
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)& ^! {5 A2 b) z/ I
        {) l! }0 m  M! k8 a4 T8 [
          IWbemClassObject *pClassObject = NULL;
( A8 o4 f8 }3 Z% N3 P           ULONG uCount = 1, uReturned;6 f4 t! u9 m' ?
          if(pEnumClassObject->Reset() == S_OK)
; o0 i/ ~2 l+ E* A+ L: k            {$ x: w. z! x# o: t% ?3 C# S" t
             int iEnumIdx = 0;
  @, W7 t3 E2 ~2 [              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
. u" A4 `* }* S7 @, m; `               {
$ {! d5 u, n& a* h1 j& U2 ]9 \- B                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");# h6 Q0 @1 o8 N9 j

1 K  U- |7 j8 ~( H1 h, W5 w                 SAFEARRAY *pvNames = NULL;
/ W% h+ O" l/ n6 R$ I/ V                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
! B& K) R/ i4 }! X# ~                  {/ U+ e2 }9 R5 i& o. @. ?1 Z2 x
                   long vbl, vbu;" `  u" w  f# o# I+ F
                   SafeArrayGetLBound(pvNames, 1, &vbl);" t4 R: s4 {4 @" Z, d
                   SafeArrayGetUBound(pvNames, 1, &vbu);
+ q4 D, u7 C/ F4 U7 J                    for(long idx=vbl; idx<=vbu; idx++)
( X, T) B" t. x$ `) c+ L3 e: M                     {
0 J3 j. D: \& F: `: u1 m1 }                       long aidx = idx;
! @- j2 u& M: X/ V2 C6 {                       wchar_t *wsName = 0;
! I( o8 ?  d8 K- `8 r) ?                       VARIANT vValue;
& ^) q4 o% R9 h' V! J                       VariantInit(&vValue);' l! _* C1 M; L3 P5 h. ]5 W
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
, I1 k8 Q- ^9 e- j( x  r  K3 r0 J& |5 _5 Q
                      BSTR bs = SysAllocString(wsName);! X4 R0 L5 m( G8 ?6 y6 Y
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
  x* f' K- L- _' \                       SysFreeString(bs);
' ?+ ^' d" e: j# b, H$ ^) B6 c$ P6 p# R$ [$ c( D1 }
                      if(hRes == S_OK)
8 k4 d# o4 ^* `+ _, g3 D                        {9 q9 M4 ]) c/ C1 J8 ]8 n; I
                         AnsiString s;. r) c2 E+ g) {5 T+ F
                         Variant v = *(Variant*)&vValue;% q/ I! t1 r- T! G
                         if(v.IsArray())
- ]6 \, a' Z3 W7 |: Y6 S6 V9 y                           {; }, A4 n% b1 B: D
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)- W, K; [7 Z" S" z- w
                             {
5 ~3 q  I7 a  J                                Variant a = v.GetElement(i);# T: W; G8 f- d: n5 D  J
                               if(!s.IsEmpty())
# G5 x, `1 B4 k1 r9 e                                  s+=", ";
+ X- k* @" H4 C* X& B# U                                s+=VarToStr(a);7 |+ A# f% ^: H0 K
                             }/ ?1 A3 g+ u* _$ R" ?
                          }& ^! S' n# @  U, |, J- _) q) y0 d
                         else
# c& ~2 M; l2 N9 t9 m                           {$ e/ _5 z: I9 Q
                            s = VarToStr(v);6 s( ~, ~# r( H' K. @  K& U4 o
                          }
3 T  R; w7 x1 [" S/ Q                          lpList->Add(AnsiString(wsName)+"="+s);( Y. z& X$ L, {) w0 m
                       }, o) h1 P5 }8 `6 a" d
2 ?- x9 s( R4 G; n- d% L* }6 T
                      VariantClear(&vValue);+ `; z. P2 o. |
                      SysFreeString(wsName);
' T' {: [& d: ]& K8 O6 }" B                     }
* x% |2 G; f$ w1 X. a" S- k                  }
* u8 z$ L  ?$ n                 if(pvNames)SafeArrayDestroy(pvNames);) M2 L+ w  l  ?* D
                iEnumIdx++;
% y8 d# p/ g( I7 O" Y" s$ ?               }
# x  T, C) [9 M# p            }3 d( m& A+ h+ F" m7 r
          if(pClassObject)pClassObject->Release();
3 n% n1 k3 `1 M. ?# y, Z         }
$ v$ ?3 ~+ [0 c" Y: S        if(pEnumClassObject)pEnumClassObject->Release();! |+ ]  t& w. P0 v- V
     }4 K" V$ Y9 |: O% ~/ y) k
    if(pWbemServices)pWbemServices->Release();; p, m+ E6 b4 \
  }
; k- [; V2 ]& Q  E, k1 e  if(pWbemLocator)pWbemLocator->Release();
* ]7 n1 r0 N9 }( l}
% e, X* v: |( p//---------------------------------------------------------------------------
3 \/ V; d& b$ Q0 Y% M% b+ G" R7 i7 X, A0 ?; x- a8 \
// 通过 WIN32_bios 获取 BIOS 信息:
8 f; F& K8 d3 }# K0 {% T8 n# s: X7 nvoid __fastcall TForm1::Button1Click(TObject *Sender)
3 }1 ?& q! Z* H" d, ?0 J{; A* ~; r+ @- z0 p
   Memo1->Lines->Add("================== [WIN32_bios] =================");0 A& [. e+ l, k( m$ j
   GetWmiInfo(Memo1->Lines, "WIN32_bios");2 @7 T1 B- M4 s& V9 _' f
   Memo1->Lines->Add("");$ z; y( k; a, W' ?8 ?
}$ f8 E5 n3 ^4 a- _# W; ^* _+ H% e9 B

6 `, \6 y! K8 {6 r3 M' b* u7 D--------------------------------------------------------------------------------5 R8 S  O+ {9 }( _

" A$ P8 S6 F2 g" ?  b; u5 VWMI 可以访问的信息类型有:- ]% ^$ j5 g0 y" c) e" F+ `
  Win32_1394Controller4 ~. `! z$ C% \
  Win32_BaseBoard
$ [+ `( o" Z: d, W* B   Win32_Battery$ f+ M3 x, j4 G3 l
  Win32_BIOS
1 H- @8 J1 S* K. E   Win32_Bus/ b4 k; J/ W' B0 q' M
  Win32_CacheMemory( J' }; K4 b/ [* J6 q, J/ s
  Win32_CDROMDrive+ H; K2 i' ~2 z
  Win32_CurrentProbe2 @3 g7 w0 j4 B* i
  Win32_DesktopMonitor3 J5 Q. A. s1 A3 T7 H+ r
  Win32_DeviceMemoryAddress
6 g( _5 G* G; l* \   Win32_DiskDrive
: p; D$ q+ V. T. J   Win32_DisplayConfiguration
. V9 Q2 S  Y# B, w   Win32_DisplayControllerConfiguration
1 t+ N9 A: g  f   Win32_DMAChannel' ?% |6 T5 g4 h+ M) u
  Win32_Fan
3 b4 p5 u# E3 n2 u0 i+ g   Win32_FloppyController
* l- G0 M4 R7 m6 r   Win32_FloppyDrive
) K6 _+ \" r: [0 m3 x2 W0 d   Win32_HeatPipe6 ]' U8 z5 e7 `: r/ F( s
  Win32_IDEController9 S5 o2 n3 v5 A7 b0 V2 Q* s
  Win32_InfraredDevice
2 ?1 v. |+ W5 u- e5 V9 k0 a* C   Win32_IRQResource" N( v. R" x0 p
  Win32_Keyboard
  Y9 K  p- a" |) w3 t$ e& R   Win32_MemoryArray- A! L8 G( ]1 l- h$ Q4 H
  Win32_MemoryDevice
3 ]: V+ L8 c! a/ g- g: h   Win32_MotherboardDevice
0 D  I7 o4 v1 \- m9 Z) m8 x   Win32_NetworkAdapter
( A( v# n" N* n* J8 k! ?6 _( L   Win32_NetworkAdapterConfiguration5 n, e$ H- P4 o1 `& x. G# o
  Win32_OnBoardDevice4 b7 q+ H- E5 N& }5 Z2 Z
  Win32_ParallelPort
. h0 }  X* x; A5 v: B9 N1 W   Win32_PCMCIAController! H* K! F8 C( }
  Win32_PhysicalMemory6 C7 f, J( Y( H$ E! i1 N; u
  Win32_PhysicalMemoryArray
% N2 m; R% E# e* m5 h7 P) I7 I   Win32_PnPEntity3 X* x: M3 k1 c5 G3 H  L/ ~
  Win32_PointingDevice# _5 ?0 J3 l3 g! k1 ^8 x
  Win32_PortableBattery
2 _" V) X* Q1 t  }3 b7 a   Win32_PortConnector
( E7 {  @: b: W( \( e   Win32_PortResource5 T  s# M) e' ^& H' e1 A4 W
  Win32_POTSModem8 z. ?( l; k$ K) p# \
  Win32_PowerManagementEvent' b* R! ]/ ~, o. d9 m
  Win32_Printer. k) W1 Z$ S: J& m+ I# `3 l
  Win32_PrinterConfiguration
% `9 B2 |! u3 X* L   Win32_PrintJob$ M9 Q0 T- v8 g/ j
  Win32_Processor. N* ~7 A* R  K# _" F* t5 p
  Win32_Refrigeration
; N  |- b# i  ~' _& B   Win32_SerialPort
$ ~4 ]9 u' U( x0 a   Win32_SerialPortConfiguration9 c% v+ G! \/ Q. W
  Win32_SMBIOSMemory
$ O8 Y( I, N5 R5 v1 f   Win32_SoundDevice
) |! f, |9 P7 O/ a6 v9 o   Win32_SystemEnclosure
2 b, \( e! K0 V9 L" ~, m   Win32_SystemMemoryResource7 f7 e3 L# S" _5 f5 _" ^  g
  Win32_SystemSlot) \  Q$ `* T7 K' J+ K/ [- I$ K
  Win32_TapeDrive2 z0 z3 ?# M7 W" u/ I
  Win32_TemperatureProbe
* Z# o* b$ }6 o4 J# g   Win32_UninterruptiblePowerSupply8 s9 t) J" j7 @* n+ K
  Win32_USBController, _" g3 P( B. ^2 V& Z% }
  Win32_VideoConfiguration  T* z9 V7 N6 |# ?1 m+ B7 i
  Win32_VideoController
. K. {4 n& ?# [3 \$ t   Win32_VoltageProbe
; `; c3 b" q  p, U8 g- h2 f  `
4 {, X+ L0 U! `; b% p以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-29 13:25 , Processed in 0.020067 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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