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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
3 b$ _9 R/ g( h# @# {5 q4 ^" I
; w  L3 C1 s7 ^7 U4 A: o' z) X( D& A4 o+ d& V6 ?8 e' l) v3 G5 i; p
--------------------------------------------------------------------------------3 D; R% \$ h, X/ i
WMI: Windows Management Instrumentation (Windows 管理工具)
! W# \) q$ g4 f% A2 O& ~3 L   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
7 _2 W! l7 }3 W  I) ^. O( l   利用这个工具可以管理本地或客户端系统中几乎所有的信息。8 A9 a& D% @- {$ }
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
( G( N8 c0 b/ S
  _6 L$ v1 e; O--------------------------------------------------------------------------------
4 m2 Y- w7 f, @- [! Q. L: q. DBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面* `. ^5 L3 T! M8 L9 B8 c

- a$ w  a" i3 O4 W# t--------------------------------------------------------------------------------
( p/ H2 B9 z) \2 Y* E( _① 初始化 COM 接口:. s8 Q6 L- U# E& B+ D
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。$ A& L5 ^( s$ X0 G# c% w4 D+ l6 P% M
  这两个函数在 #include <comdef.h> 里面定义。. X; e6 a; C/ B" K. e! P1 n
) a% {, q7 V  ~( Y4 O9 |$ K
② 获取访问 WMI 权限:$ P3 F" J% U) R
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
: U, o8 U4 g4 w+ R   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
: l3 O; D8 N$ |' R$ O9 J! A* d; A, @1 {6 X# {( `* t+ S( |3 j8 L5 p
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
- t5 ?# o: z4 m1 s/ g   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
5 |4 W7 D9 p  ?6 j' o( K& j* v! Y) I) g3 y. z2 i$ o
void GetWmiInfo(TStrings *lpList, WideString wsClass)
0 p" |! s/ l5 N{; p; s- ]" l2 Q
  IWbemLocator *pWbemLocator = NULL;% ]7 I8 b- P, i7 y( {/ \- ]; w
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
0 S3 P4 J* v. C4 Q0 K   {
$ A, g2 Y) U$ U. f, B3 P1 D: E     IWbemServices *pWbemServices = NULL;
8 N( e7 M5 _2 g8 n$ D     WideString wsNamespace = (L"root\\cimv2");+ N# M7 _) H& T! g) a( @7 L6 ?
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
, v. K$ e! O  T1 ^6 k8 B. O5 l      {) D* D$ |* i6 G* B! G) J
       IEnumWbemClassObject *pEnumClassObject = NULL;6 L1 z  a: p  Y  `
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
9 F0 P: q0 o. [7 N- M        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 g$ S% M8 b/ Q& i         {
2 v1 m# d- `! u! p" u           IWbemClassObject *pClassObject = NULL;9 \& [, T. W9 t3 c! K! a( V
          ULONG uCount = 1, uReturned;
9 D' m0 V7 ^# ~  ]/ q; f8 ?0 ^3 u           if(pEnumClassObject->Reset() == S_OK)6 [: M; w0 J; d6 @* b
           {
4 X0 c  l, L+ i& w4 S              int iEnumIdx = 0;
& m! K- ]: u& V# C4 z              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
4 \8 ^* D) e4 W. O9 W0 q( @               {# S: C3 g- F8 Y: |1 W
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");  T4 v# c/ b0 U2 Q

3 `, C* v7 m$ G                 SAFEARRAY *pvNames = NULL;% j8 G, V9 {9 h' o4 G/ @# r4 K
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
' a/ v. ^6 r( X+ M: l' P                  {0 T7 L4 X9 ?+ F6 }6 ]
                   long vbl, vbu;9 D2 k5 Z5 a% X0 a8 d* Y
                   SafeArrayGetLBound(pvNames, 1, &vbl);
) o$ W1 o: C% F: H4 q0 t                    SafeArrayGetUBound(pvNames, 1, &vbu);: @7 Q. \, V! _1 u
                   for(long idx=vbl; idx<=vbu; idx++)2 o! t- T! z2 |1 X, J7 ~3 @
                    {
+ _* _  q1 T6 {7 A                       long aidx = idx;
, Q  }% u0 j' X, y                       wchar_t *wsName = 0;
3 \2 }3 j3 h% v                       VARIANT vValue;- ?2 H0 E# _0 e! J
                      VariantInit(&vValue);/ `8 Q8 @/ |3 f4 d$ ^; u
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
. n8 x" P5 f" f, T, ~4 [, q# t2 j2 f8 g9 @/ q# H# i4 ~$ L% _' _
                      BSTR bs = SysAllocString(wsName);
* ]1 X6 F. S  E( o( l3 h% Q                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
- |% }2 A; \5 N! ~; R: y                       SysFreeString(bs);
6 G/ b& E3 d! W/ Q: w, b  n: U) u( g# N! I4 ~! w9 @4 D
                      if(hRes == S_OK)( I6 m3 n% ~* b5 c7 V
                       {
4 n6 U$ ~4 ~. \) L) Z; ]                          AnsiString s;" @7 l1 Z! }/ U
                         Variant v = *(Variant*)&vValue;
; L1 }4 e" s& _9 [; Z                          if(v.IsArray())% N* h' N8 r. ?: w( D! `
                          {4 f  s2 \4 W0 P# Y8 m
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
/ I9 q$ \8 j; t# Y4 e                              {, {; p% ~5 T- x
                               Variant a = v.GetElement(i);) j; B" f5 B/ e: L
                               if(!s.IsEmpty())
2 P$ o, }& R: M' v                                  s+=", ";
3 `1 E0 p: f2 T5 p7 Q) Y; ^                                s+=VarToStr(a);# J% I: t! W# o7 }) c! l
                             }5 Z/ ~# T* \" R: Q' t
                          }
( `: t9 c8 w9 P  O; H! J" q                          else
. ~: G4 N; w; K7 s: s                           {
$ q! t  ?  l: |, {                             s = VarToStr(v);+ W8 @' j% P. r  c
                          }
' N! z2 {! L3 X# ^0 L0 J# h: Q# C                          lpList->Add(AnsiString(wsName)+"="+s);  k& a3 X- N4 E6 G& z  K9 M
                       }. U3 @) K; O9 Z3 w, M) C7 Z9 J
2 d. Z. _; G2 r! `9 K8 b# X
                      VariantClear(&vValue);; }0 r$ b; B$ Y. T
                      SysFreeString(wsName);
; w1 r* t( H9 T8 c* Y7 A                     }
5 U/ C, n! A5 j+ F0 D' w                  }4 e, C  b' G; _+ J4 ]# [- D6 U
                if(pvNames)SafeArrayDestroy(pvNames);1 M6 ?8 K' k. J; C/ B0 l* O
                iEnumIdx++;
; m1 ?% Y  @  y' r9 n* n               }
6 M5 x* W+ e: ?( `            }
. x6 O0 @/ r5 ^+ q7 J% k4 J2 i           if(pClassObject)pClassObject->Release();( Q. _- a2 U: G6 }" e
        }& m3 Q2 M6 m1 I+ F# @, ?8 ~' C
       if(pEnumClassObject)pEnumClassObject->Release();
; O- j& ^$ B  M* R8 i$ D/ r0 }      }
; E! s) V/ ?  c  v( \     if(pWbemServices)pWbemServices->Release();
* X7 z, j# ~( b- B8 e- c$ {   }  u" ~8 z& ~" m9 e% T
  if(pWbemLocator)pWbemLocator->Release();) j" u$ l: l! G4 z3 p
}
3 n. c, ?5 _7 w* ~% k3 `! S//---------------------------------------------------------------------------
2 t6 X4 [; ^- @. k$ u
- e, g: [1 O, Z/ n% n// 通过 WIN32_bios 获取 BIOS 信息:* I; L$ V' Z8 q, y
void __fastcall TForm1::Button1Click(TObject *Sender)
0 [* Z9 v7 W* X4 ?' l. J4 K{' y0 |0 C* `' @$ ]
   Memo1->Lines->Add("================== [WIN32_bios] =================");
" z0 ]" p3 U. s1 g( i    GetWmiInfo(Memo1->Lines, "WIN32_bios");
2 X$ ~/ _7 k0 g7 `! x; c    Memo1->Lines->Add("");7 F# E4 H/ e7 n. S- N" z
}
& e6 ^) b( \: P/ j- p4 T" \: W4 l' B5 ~' c3 ~
--------------------------------------------------------------------------------7 p' V# k( D5 K, t% Q4 h
$ p* X+ K1 j9 s5 a8 a2 @8 J
WMI 可以访问的信息类型有:
) O) G0 A: P" t+ f$ w   Win32_1394Controller+ ^. k2 B* K. K1 W6 p
  Win32_BaseBoard( F4 ]: X8 Y3 U( W9 ?
  Win32_Battery: u4 }' K5 t3 g
  Win32_BIOS
: y. }( }0 w+ _! T+ w. \( b   Win32_Bus6 `! V$ a$ Z( e( D9 U2 H' G0 G
  Win32_CacheMemory
. h' ]# S/ I! [   Win32_CDROMDrive
* q+ d& Y1 [! a2 K3 y   Win32_CurrentProbe
% j& L3 x: t/ Y6 ]4 c8 T: ?% \   Win32_DesktopMonitor5 A- {7 j1 E; T9 o) e! l: N
  Win32_DeviceMemoryAddress& q5 r8 `0 T# q( Z: y- E3 {
  Win32_DiskDrive; L1 [1 ]4 W* o8 p8 |
  Win32_DisplayConfiguration
; b' x' p' w5 B& @# I+ F   Win32_DisplayControllerConfiguration
: o$ C! x9 E4 Y. o   Win32_DMAChannel
7 k" c; R$ F9 X" X: i   Win32_Fan
8 j. T6 n  |+ ~0 W   Win32_FloppyController
% M# i+ L: ~' x7 @2 l2 R+ _   Win32_FloppyDrive8 c9 G3 N' p5 Y6 @  T
  Win32_HeatPipe" D: b5 s  q" V, k6 C: Z
  Win32_IDEController
2 W9 q% K' o% ~, @( F   Win32_InfraredDevice. ?" i& {! n4 X* V' ^: r8 b  @
  Win32_IRQResource% \8 S  n% z; g) E8 F5 w
  Win32_Keyboard5 S8 x2 A$ _. E! S- H0 t) a, }) ^) b
  Win32_MemoryArray( a/ c/ D% g/ s$ ]. j
  Win32_MemoryDevice
( B* m" j. i! x! M  Z, m   Win32_MotherboardDevice* S- f9 X. u1 n4 F
  Win32_NetworkAdapter
& C! [9 X. q; [% \2 \' l8 w1 z1 i   Win32_NetworkAdapterConfiguration1 Q) r( o% z8 y4 r/ Y
  Win32_OnBoardDevice
/ @9 y" L+ g, T6 ^# ~; B' u+ {   Win32_ParallelPort
5 b( U2 v1 B, N, l2 f" F   Win32_PCMCIAController7 `) ]! b0 c$ o* y& _
  Win32_PhysicalMemory8 P" Q- F+ R  y
  Win32_PhysicalMemoryArray6 C8 C9 w; P: m( Z2 B/ H
  Win32_PnPEntity
6 M$ L, P/ n8 V) ~" L7 r" O   Win32_PointingDevice
6 b3 j/ C; c" c   Win32_PortableBattery! X2 ~' S2 U( p+ I% S1 Z5 F2 |
  Win32_PortConnector6 Z4 s  `/ e# |1 t# C
  Win32_PortResource4 g# _3 u4 e0 O9 z  @
  Win32_POTSModem
- p# u0 e) s* E. J   Win32_PowerManagementEvent
1 c% b3 l$ r/ z   Win32_Printer
) M' M- a! s0 ?: P: T& Y( \8 f2 m   Win32_PrinterConfiguration
4 b& K& P4 a3 D   Win32_PrintJob
6 Z# M$ m1 c$ d# p, E! ?   Win32_Processor
/ w  X1 k! f! g( X9 \   Win32_Refrigeration0 b  K9 F: b8 B
  Win32_SerialPort( n) l  H4 A) j6 \
  Win32_SerialPortConfiguration
( K7 U2 |6 ^; L& R% u8 F$ V; X   Win32_SMBIOSMemory
- v3 w7 {+ J) V- x   Win32_SoundDevice( a. i' P& b, y2 n+ H
  Win32_SystemEnclosure$ t( A/ ^: R8 `5 k; [
  Win32_SystemMemoryResource2 z9 e$ D% e$ X. }6 c
  Win32_SystemSlot' I  H* W! p. H# ?; H# `* h7 b% W
  Win32_TapeDrive
' v! N# C$ C2 u$ N9 Y) x" F' ?   Win32_TemperatureProbe
, ~/ ?5 J6 j+ m' r( `   Win32_UninterruptiblePowerSupply
6 Z2 u0 G' P6 N7 A* D   Win32_USBController* y3 I) U$ ]+ e7 g- T3 p+ y
  Win32_VideoConfiguration. Z9 p5 [  l& X  X
  Win32_VideoController
7 P; w) t- j; |9 F2 n   Win32_VoltageProbe  }$ w9 s# Z) O9 p

7 Q6 y6 t# [$ c; z, y% Z6 H4 g以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-27 18:07 , Processed in 0.019825 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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