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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
& o* y" P4 o. m, E2 s, ?- i7 x- U! s# @, O" f8 B

! s9 b% w$ S7 Y--------------------------------------------------------------------------------
! `6 R2 P6 c. I+ v" b- BWMI: Windows Management Instrumentation (Windows 管理工具)+ k8 n3 }1 }; b* e
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 # T1 }& g; N+ Q. y2 C4 R
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
/ n* G3 O9 ]6 o" q  v   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 / b6 c9 c7 g# q! X1 c% H5 o

; v) M' ^$ d# X--------------------------------------------------------------------------------# m" J* d7 d. Y3 `6 `
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
0 G$ o" H% g. \, e* W- B9 q4 ?5 f: X+ d; l1 [9 _( P  t$ C% D  o
--------------------------------------------------------------------------------
: M5 T5 a) g$ ^$ l7 Z① 初始化 COM 接口:
; k5 l) g0 \& o6 F9 M$ ?) D9 e   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。& _' N$ Q2 ^4 s7 I: l
  这两个函数在 #include <comdef.h> 里面定义。4 ]0 D2 ?5 z4 ]0 v7 _# v! I
( Y; [& m; N; y+ K
② 获取访问 WMI 权限:
7 t6 O/ q2 j/ {8 `. F! m: g0 Y   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);, n0 ?( d. z/ S/ U& J
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。% z' s1 S& t: h+ X9 |& ]$ Y
! _" `- Y% v* J' B+ x; B
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:/ y. k+ ]7 g) v( x1 i. n- {
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
% B2 G. n: r# Q; n- M7 n( R) k+ F0 n& o3 C
void GetWmiInfo(TStrings *lpList, WideString wsClass)! j: O9 z4 i  C0 n5 t
{8 Z$ M  o0 G  u6 m
  IWbemLocator *pWbemLocator = NULL;
2 e$ L1 s- o5 l! P7 V- k  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)/ U9 W6 q" o0 i) x+ D% A2 f
  {3 J/ y" q* r8 \
    IWbemServices *pWbemServices = NULL;
. k$ Z/ j% {( y' }/ s& @+ n2 p' O; g     WideString wsNamespace = (L"root\\cimv2");
1 Q3 U9 q8 B3 F# a, x: O     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
+ a; P7 j9 p7 B/ f4 ?      {
: t: ]. j  T+ b% t& T        IEnumWbemClassObject *pEnumClassObject = NULL;
9 u3 ?4 D: K+ l" F8 R) R" F        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;7 p; n0 l" N4 g" s
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 p! J2 c1 p6 q. i: l& d& |& C         {
' B( G4 r) u! {; K           IWbemClassObject *pClassObject = NULL;
, J1 q# o1 g8 N. N: v4 a4 Q           ULONG uCount = 1, uReturned;/ w2 z, }( G, y: x  O6 I5 X
          if(pEnumClassObject->Reset() == S_OK)
5 K  q* {$ K2 C2 v            {
; W! H! G3 L9 n. V/ \9 R              int iEnumIdx = 0;
. ?- d& A: X  `  w$ d              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)) O' o* J# K" [9 v" U  v! r
              {! w( f) n0 r0 U8 W1 O* U
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");" z7 m0 j- y7 d% \3 e/ i7 K* e

& }- R. F. J- W3 S2 r1 \                 SAFEARRAY *pvNames = NULL;
: E2 B. x* J5 G+ W" b& _1 g                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)6 D6 i& W0 l" x7 {: t3 M
                 {. c5 H1 R/ w7 e& U; A" l9 r6 |0 c
                   long vbl, vbu;7 ^. G; N3 w  v1 m' c1 s
                   SafeArrayGetLBound(pvNames, 1, &vbl);+ R9 }) B( x8 Y8 y4 M! O
                   SafeArrayGetUBound(pvNames, 1, &vbu);: N( y! D) D: |- @8 f
                   for(long idx=vbl; idx<=vbu; idx++)
7 l% x8 k) H: X1 V+ a( J                     {
4 Z+ |) u/ L' F! _7 i                       long aidx = idx;
' ^5 h" G) J/ h, k& N                       wchar_t *wsName = 0;( k  X* w# ?- C
                      VARIANT vValue;
$ x4 I$ Z3 n3 l                       VariantInit(&vValue);
  Y5 F! m6 p' j8 g4 p) D                       SafeArrayGetElement(pvNames, &aidx, &wsName);' m* Y/ M" E, E0 E
( x. H& @' p# C( Z8 h( ]- `
                      BSTR bs = SysAllocString(wsName);
, {% n$ N; w* B, \# Y& P                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
- a' U, K5 C% @; A, O                       SysFreeString(bs);: a- c8 F7 n, X" `4 l

2 \' f  O, L% }7 H- c                       if(hRes == S_OK)/ b4 C7 q* }/ k3 v1 H, Y
                       {, c! L: Z! ]6 b7 l
                         AnsiString s;2 {' m4 Y8 f4 q  g. B5 ~: B
                         Variant v = *(Variant*)&vValue;/ s& p+ g, c3 t6 Z+ A) a/ {6 B4 q
                         if(v.IsArray())$ ?7 A7 V4 C& o! I7 q
                          {
2 L$ ?  V: _; m5 L2 e3 M                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)! s9 @7 `& `7 J: k( n* }% s' D, J
                             {1 v9 |6 |) |5 t& F+ D1 {
                               Variant a = v.GetElement(i);8 A" q+ _, g8 d. P, r% O
                               if(!s.IsEmpty()); K' U5 l) P& Q' ?) @7 G
                                 s+=", ";
1 V8 G2 T5 q1 |) }4 i. e                                s+=VarToStr(a);9 s2 w5 U/ z# S! h2 X8 a, B
                             }# }  @+ J# j" ~, U+ K( S% I
                          }9 m+ \# M& L) K) ]
                         else: X% `( J( e8 c9 e. e
                          {& U3 A0 `. i% Y* v+ v: |8 @% `
                            s = VarToStr(v);
# O# l% r" {6 N" s& ]  s                           }. _3 w/ [3 V. |. c
                         lpList->Add(AnsiString(wsName)+"="+s);
! N, `4 @2 ^' p% N3 o* \& e                        }; f/ w( z3 C1 n. t  M0 |0 u# F
  r' S9 F1 O, F4 z0 f8 z: q. S
                      VariantClear(&vValue);# j+ F7 [4 V' }+ O$ D) ^
                      SysFreeString(wsName);
  T& Q1 ]" o3 d# ~! G+ Z                     }
; E8 Z0 h' e) ^& h- v5 P                  }' {, n) z, R% f1 ]: g# s8 m0 S
                if(pvNames)SafeArrayDestroy(pvNames);
% |% C$ g6 {" P# p                 iEnumIdx++;# V0 Q7 m5 M+ E& w& E5 C
              }6 Z" d( U, f& G0 [' r% k5 [$ l0 o/ w
           }/ v* c; D& H, j: d
          if(pClassObject)pClassObject->Release();  u, C! n8 x6 W+ P/ w
        }$ k# h: ^, q. D: F
       if(pEnumClassObject)pEnumClassObject->Release();# u( i+ @% j# ?7 |& @3 l: F
     }
! ?/ m; l1 ?) v- B5 G$ X) _     if(pWbemServices)pWbemServices->Release();* I$ \' y) i$ W/ T/ k- P8 V  h3 }; |
  }% O1 H3 p7 u* G
  if(pWbemLocator)pWbemLocator->Release();$ q# J! M5 ~8 e- U2 b) Z
}
6 Y+ s$ }( H8 r5 \//---------------------------------------------------------------------------
% W& ~' o* z5 G* ~
- n, H% O* d+ |( @// 通过 WIN32_bios 获取 BIOS 信息:
) O0 ^: d3 Z: J) U  jvoid __fastcall TForm1::Button1Click(TObject *Sender)
  e  Y: H! q; C5 Y7 g{
4 _  H7 H5 h* i3 }  D    Memo1->Lines->Add("================== [WIN32_bios] =================");
' F" V1 R: J8 r- h: T$ a% b4 n  i3 v+ ^% a    GetWmiInfo(Memo1->Lines, "WIN32_bios");& c0 i, E2 [( p- t& V; Y, r. T7 |: X
   Memo1->Lines->Add("");
7 I: m: m9 u1 z2 o" ]}
0 _9 t6 [2 O/ ~. k1 J
& g; z; [8 \. D6 b* a6 J  z--------------------------------------------------------------------------------
4 N$ l- V+ b$ T. K. ~
& `9 H8 a4 _. e/ m6 i! R) DWMI 可以访问的信息类型有:
9 w- Y/ L6 T+ r: C. Q7 m* p   Win32_1394Controller
) G9 @) _. F% J+ M   Win32_BaseBoard
1 j, {/ P: b' B6 {9 v   Win32_Battery6 Q( B4 x% F5 K3 b
  Win32_BIOS
# i5 H4 A6 @* }   Win32_Bus, h9 ]+ H# M" F/ P$ M
  Win32_CacheMemory
( L* q  s# B" ]+ Z7 Y5 b2 {) g   Win32_CDROMDrive
  {5 ]- L1 V6 _' C2 t   Win32_CurrentProbe
* J" _8 D8 q+ V9 L2 @% e1 w   Win32_DesktopMonitor6 G3 a1 K, L: ~! e' F
  Win32_DeviceMemoryAddress/ M9 Q  t4 @& ?" R9 p( I
  Win32_DiskDrive" Y5 l/ X; J. H- M
  Win32_DisplayConfiguration4 L6 N& [+ I' p! @3 c; x
  Win32_DisplayControllerConfiguration
8 v  C) x- i; H; t$ X% j   Win32_DMAChannel6 c7 l, C3 y7 N8 r5 h5 l) y
  Win32_Fan" U+ N* f% j' ^/ G
  Win32_FloppyController
# h$ L1 s, C+ T3 U& r9 p   Win32_FloppyDrive1 w. \# h) D( {  B$ p
  Win32_HeatPipe
: ?% P2 T9 }' Y& n% S   Win32_IDEController  n( Z2 {  d; u. P/ M- F0 x) \
  Win32_InfraredDevice
, P$ [6 {: b1 f  ]4 l* P) j; g, h   Win32_IRQResource3 k+ N2 x2 S2 q  j) t2 r
  Win32_Keyboard& ]1 k' ?+ x, k, A8 n8 Z
  Win32_MemoryArray
: Y* h" q9 u5 u6 X/ v   Win32_MemoryDevice
5 M  F# n6 A+ E4 b8 p9 G   Win32_MotherboardDevice/ d# X, R5 p- F1 q4 \
  Win32_NetworkAdapter) X6 \7 r  P- @# d/ f+ r! g/ T
  Win32_NetworkAdapterConfiguration1 D" W1 c5 v3 l' v  X
  Win32_OnBoardDevice
/ z0 O* I: d9 C& C$ l   Win32_ParallelPort) @! o% ?9 n1 H) p- k1 \& @
  Win32_PCMCIAController+ L1 y8 @. `8 q# F
  Win32_PhysicalMemory
' Z9 G/ Y2 }/ r% _: P   Win32_PhysicalMemoryArray
( g; q. x: l9 o3 O, [   Win32_PnPEntity
' P+ n. S% @. w9 j" m   Win32_PointingDevice
1 \) b# j8 Z3 O   Win32_PortableBattery6 ]: H: }2 X& g- ^7 r% y- Q8 C1 r# }
  Win32_PortConnector7 L0 P2 n% U* ^
  Win32_PortResource
# K8 O6 g! N/ i) G# Q   Win32_POTSModem
+ u% ]- S* I  J8 C! c. G: L   Win32_PowerManagementEvent
# v  O+ \: b$ [/ `) G& G   Win32_Printer
6 D( h0 ]5 z4 e  g8 {$ F3 h   Win32_PrinterConfiguration; |5 @7 [4 r3 w' j) Y  z4 L% z
  Win32_PrintJob; S5 x& G% o! d
  Win32_Processor  q- d$ j/ g; ~* l7 w
  Win32_Refrigeration
: {, I: ]8 p# o1 h; N   Win32_SerialPort: W1 s, y* B) Z; N
  Win32_SerialPortConfiguration3 N, m* p9 C, q3 E, R7 a/ g2 U6 L
  Win32_SMBIOSMemory9 l1 X$ Y' e" V0 J" u6 V
  Win32_SoundDevice1 b3 w4 N1 B7 N1 m: S' d2 J1 n
  Win32_SystemEnclosure
2 I6 p6 r0 s9 S7 w   Win32_SystemMemoryResource
) w" W5 _) }& A0 @, l   Win32_SystemSlot
, p* S/ E1 M; f4 [   Win32_TapeDrive/ [8 c/ C  g$ E9 _- C1 O
  Win32_TemperatureProbe0 @4 R6 a; p6 A
  Win32_UninterruptiblePowerSupply
5 \; e" r9 D: {   Win32_USBController0 B- w0 h, g: k" E
  Win32_VideoConfiguration
6 y" ~: ^' ^1 U+ e   Win32_VideoController% ]2 m$ q' a5 z. ]) K+ u% C
  Win32_VoltageProbe
% k: n4 {& p4 v. n0 Y
. y; Y2 s9 W4 m1 @/ p以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-7 18:31 , Processed in 0.018147 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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