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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)% u3 h4 {! q9 }

  D7 ]/ e- r7 B/ r- \5 I$ }
) V# e% B  `  P. X4 }0 ]* V# o6 B--------------------------------------------------------------------------------8 s5 J, S: n2 c4 h; t: q. q" t
WMI: Windows Management Instrumentation (Windows 管理工具), K+ Q) N4 |0 k0 {: l3 g
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ) }2 X8 I4 h) s1 r5 h
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。% y% M+ F$ L- q- Y, Q8 X  a% t' i. u
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 - W. j: j, h1 r
# ?+ q6 I) i. N5 Z
--------------------------------------------------------------------------------
  ^4 j. G: X: [/ X( WBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
4 T! j/ K" \9 A: K' \  [. O
4 i( A8 _  E" x5 Q5 Z7 h% A% \--------------------------------------------------------------------------------6 [* m( J+ f. ]8 E" M$ o
① 初始化 COM 接口:
- \/ f3 n( {9 C# s8 v2 ^   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
0 }4 r% R" G% S/ s+ Z   这两个函数在 #include <comdef.h> 里面定义。
/ i" \4 g; U9 w* _6 k9 U# O2 f8 F' C9 Q
② 获取访问 WMI 权限:5 T3 b2 w! J8 G2 E
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
* x" Y* q% Z  @$ h# ?1 L- m+ o   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
3 t: m: b% B; v  J& q0 _4 e/ N& E8 r1 @- y% A5 s+ W, i
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
- o& P# ?/ I6 N5 g7 h! c   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
* `* ~$ M7 q4 ]) P- ~/ o, n* g3 C* D+ h8 a1 K
void GetWmiInfo(TStrings *lpList, WideString wsClass)
2 C5 l) w7 i4 \4 _. |" T$ {. v6 \{% Q3 ~" Y: e% v2 ~; }! v2 ]' i
  IWbemLocator *pWbemLocator = NULL;" W& d  V# D8 v; a# x0 A
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)6 Y; h. I" u# k/ ~5 K
  {" N3 L# ^! @4 r4 ]) b& u8 [$ J" [
    IWbemServices *pWbemServices = NULL;( p+ g! r6 u& f# J
    WideString wsNamespace = (L"root\\cimv2");
; }; w+ w; y2 f/ P# l( R- x( G     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
  J" r( M1 _/ L4 U! _; \( P      {& x! b9 V8 E6 Z9 o) I
       IEnumWbemClassObject *pEnumClassObject = NULL;  R. Q5 x  C! Y, e* w
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;' a3 `: e7 k3 F4 k& i  S% j
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
% p0 Y/ P! D* M& \2 ~4 O. |         {% C* u7 T. O/ ^
          IWbemClassObject *pClassObject = NULL;& j/ z5 Z9 G. j; q
          ULONG uCount = 1, uReturned;
& A4 Y/ U# _* r0 y& N/ j; _& f           if(pEnumClassObject->Reset() == S_OK)3 m+ q4 G4 \5 ]+ Q  j1 h" h8 a
           {
) J- X. a( X$ J. _( s! N/ T              int iEnumIdx = 0;0 Y7 i' c' Y: i0 [$ L5 |2 t
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
" l' o* {8 J9 [! T0 i               {  Y6 p  k) \) T% b3 r, L
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");, y, m. l$ u3 _5 e) B* L

/ l/ A) F0 m! {8 H+ ^                 SAFEARRAY *pvNames = NULL;
  P; O& X$ D* S1 l4 d; |                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)& l' Q! Y+ i4 P: f2 g
                 {
5 T: x) y! U0 T* M+ e                    long vbl, vbu;$ h0 i! Z* m4 c+ F+ ]
                   SafeArrayGetLBound(pvNames, 1, &vbl);9 T$ n5 n$ A1 K/ t& H
                   SafeArrayGetUBound(pvNames, 1, &vbu);' M% V9 v, _4 w% c4 U4 Q% k0 D
                   for(long idx=vbl; idx<=vbu; idx++)
0 K' O1 l0 x- u  ^( t7 C                     {
9 e# J- W; h* \( l' @- X8 ~                       long aidx = idx;
. b! g- G6 n- W# m                       wchar_t *wsName = 0;) C, a2 }' m" A5 l' L
                      VARIANT vValue;' G1 n6 a* f4 y, U8 ~' V
                      VariantInit(&vValue);( [4 P# \% X$ t
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
. h1 @( v  i2 F: T8 L0 q
1 f# A  E1 }; W9 ~9 Y2 B  j5 u' c  d' ?                       BSTR bs = SysAllocString(wsName);
# Y' B. ]/ i8 j7 j9 _                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
( n6 y$ ]5 m! }0 F                       SysFreeString(bs);7 u1 E3 f% S$ V- }
- [; E% d) f# M  f+ d- B
                      if(hRes == S_OK)2 z% s& P) _! @! q' b) {# a
                       {
' r3 F, l9 ~7 k" g0 {# B) a0 [1 I                          AnsiString s;1 t! ?( r5 i0 @6 c2 S$ Q/ n
                         Variant v = *(Variant*)&vValue;
' Q6 G( M1 }" X9 o                          if(v.IsArray())- O  @6 z, {: Q5 q) f& u# I
                          {
4 C- u0 B! L9 N' x3 L                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
3 }- v4 E( |7 X                              {
2 o% _0 P' [, \9 L4 v                                Variant a = v.GetElement(i);4 Y1 b5 f9 C! B) Z+ h0 H( f2 R
                               if(!s.IsEmpty())
+ @8 y1 z) M# @                                  s+=", ";6 A1 K: {. H6 i' d1 M: u
                               s+=VarToStr(a);
" `9 W8 Z# e; C) Y7 W                              }
2 U' O7 W  G* D* Q+ o                           }9 G6 r7 ]3 O0 }# r4 u
                         else
1 l( K0 B3 A/ O                           {
. d7 x$ }0 l" X' V" M- _3 ?                             s = VarToStr(v);/ F# ~& s* e: L' A& g
                          }! I# a7 t% S3 d3 q0 b' a
                         lpList->Add(AnsiString(wsName)+"="+s);; g9 v% \7 t' F! s* f5 q/ T" {
                       }
: W& ~, a4 g3 k1 s6 U) _  `4 ?1 ]! Y0 C: `) l
                      VariantClear(&vValue);3 B/ ^7 d' F* }) h7 x) P' t2 M
                      SysFreeString(wsName);
" h! p& n4 T- k* k/ h% ^                     }
0 g9 D5 Q: m/ ]; E                  }
( z0 w2 p6 g5 r5 i. U7 d" H                 if(pvNames)SafeArrayDestroy(pvNames);1 y4 F2 j  I3 i4 V- F
                iEnumIdx++;) W" {* `* _" ]2 l0 B0 t. K
              }
- W5 k  L2 \& I            }& f) p. v. b# U* j( D
          if(pClassObject)pClassObject->Release();
' g* @- C0 _" {0 ~         }0 n& Z/ D% K9 T+ n) n
       if(pEnumClassObject)pEnumClassObject->Release();1 s4 U7 G& _; R4 l) `6 N$ y
     }
3 u6 b( o& K4 |     if(pWbemServices)pWbemServices->Release();
5 k$ L( Q$ _' W) _   }$ b# L' j* G1 |( k  @2 X
  if(pWbemLocator)pWbemLocator->Release();
5 W( I& n0 X2 G3 F% n$ d7 j}% U1 j; N: Z$ @* P& K# I# x
//---------------------------------------------------------------------------6 d7 J# v: b# @+ S# s

$ t) O2 x6 a. h& y& Q# t// 通过 WIN32_bios 获取 BIOS 信息:+ h$ t1 _# d) L5 W2 V; j1 A
void __fastcall TForm1::Button1Click(TObject *Sender); t" O  L9 Y4 P: u6 p# C# C( h
{  C8 f2 T) |+ M. J0 F
   Memo1->Lines->Add("================== [WIN32_bios] =================");5 K) s) p+ w" Z, z) f6 @4 g
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
  Y  W- V- U' j* K6 E# A2 _3 T$ G. J    Memo1->Lines->Add("");
3 p9 F( f: @0 }) e  R}( d" ]% Y9 Z8 N7 R* k1 Z$ s
# R$ k' m: r) s0 q8 A# P% b* C
--------------------------------------------------------------------------------
) a# g4 A- S; o/ @% _1 S# b
4 |$ c( [& x' z+ F- H3 u6 [WMI 可以访问的信息类型有:( F! C) }$ t0 f, X+ l/ R9 r6 V" x
  Win32_1394Controller
3 m& K% t! x7 ^, E) j  ~% k& r- N   Win32_BaseBoard- p6 c: I9 {3 t, Q- j$ o  {" ^
  Win32_Battery
; Y& p4 N. M/ [2 x+ q, g   Win32_BIOS
3 l2 e2 T! J8 C* n1 \0 {8 T# L) z6 W   Win32_Bus
! r, X6 N/ s0 A! T: \   Win32_CacheMemory
5 S, _# D  y5 Q. T   Win32_CDROMDrive
9 |9 n* v* f0 A$ R/ W   Win32_CurrentProbe
1 u3 U5 N- y" M0 |: h/ x/ T& X! P   Win32_DesktopMonitor) l6 O' h7 G4 \$ J
  Win32_DeviceMemoryAddress' B/ z# s5 A% e, f) S3 F
  Win32_DiskDrive$ ]5 \! Q8 `1 t4 M0 f' g; x
  Win32_DisplayConfiguration, r$ D; W* P8 b  D! _$ z9 X  z
  Win32_DisplayControllerConfiguration2 c. c  Y7 W5 w# X+ |) `
  Win32_DMAChannel
# M( A! r& \1 I3 U6 t. H   Win32_Fan) |2 {& n0 |0 R5 j0 M' Y
  Win32_FloppyController
8 o. i, m5 |2 ~) \% N4 C   Win32_FloppyDrive
6 {( J- M! A3 S3 Y   Win32_HeatPipe
( B0 t5 S5 v5 @( h* @   Win32_IDEController
: P$ X  b& z# W/ A2 \   Win32_InfraredDevice
/ s9 g! N& r( [& z* _' w   Win32_IRQResource7 G# F& x: ?  g
  Win32_Keyboard
1 x1 Y; c1 m: ]* @( X* V   Win32_MemoryArray5 z) o* Q& ^" ?, \
  Win32_MemoryDevice
8 e' i+ n! ~: j0 p/ O8 X$ H   Win32_MotherboardDevice$ A( g" j6 Q" b! O* @. a
  Win32_NetworkAdapter
8 n. \& Z) Y4 @4 b6 T6 M) a4 L/ e   Win32_NetworkAdapterConfiguration& C  T/ P9 e" w! g: y7 E- p
  Win32_OnBoardDevice2 g! Q% z0 n7 T9 f; N2 i+ B1 r  u! s
  Win32_ParallelPort
. Y+ `. G5 x* R& t   Win32_PCMCIAController3 ^! C" L7 D5 a( j# N6 \
  Win32_PhysicalMemory+ r  L. g4 p% U7 H
  Win32_PhysicalMemoryArray: J3 G% Z" y" m
  Win32_PnPEntity6 ^+ F* O2 |( F, v
  Win32_PointingDevice3 G& L! t5 P( r4 p% n2 `
  Win32_PortableBattery) f; f" l; [' M. U9 s9 Z; J
  Win32_PortConnector
5 Y3 ~2 ?- c* f" g6 ]! `5 F! [   Win32_PortResource4 c+ x& H) s+ ^7 W! J
  Win32_POTSModem6 P, q% p% r( d$ v
  Win32_PowerManagementEvent9 a5 {( P" o3 c
  Win32_Printer
; k3 E9 B) y) _   Win32_PrinterConfiguration  o& ?3 |% Y: S, k9 Q6 p3 ?- \9 |
  Win32_PrintJob
9 W; c  X+ F. F1 V2 i' f& D   Win32_Processor2 L1 I* S) e5 U" r% p5 K* a4 k/ i
  Win32_Refrigeration& Y, s1 q" f+ S% @+ N8 l% g
  Win32_SerialPort% a" X$ w: u  `: _2 W# E
  Win32_SerialPortConfiguration
2 B3 g. ~6 `$ @) \- ]$ W( Z   Win32_SMBIOSMemory
$ l; u; K3 M9 v% L1 n- N- ^   Win32_SoundDevice
5 j3 Y2 U: q! l% o, g+ q   Win32_SystemEnclosure# @# z* d- i& v, D. n
  Win32_SystemMemoryResource% `' D+ B$ o( Q# C
  Win32_SystemSlot
8 R) i- `& E' \   Win32_TapeDrive) S/ O) w5 J3 V$ i) c  e% c2 k
  Win32_TemperatureProbe
/ r* D3 ^, m  A6 v& y# ^" Q6 B) o1 x" U   Win32_UninterruptiblePowerSupply
& Z9 A1 Q8 Q, b2 Z  a5 H2 Y# Z   Win32_USBController
' o# ?+ i1 D% r1 W8 s4 ^   Win32_VideoConfiguration
/ B9 H0 |  A5 j' A6 m, P0 {: O9 i   Win32_VideoController
0 c) z' M0 J  z) T. ^8 U  g/ f   Win32_VoltageProbe
$ W- N0 g) P2 r9 G! ^4 O5 {! b, c% Q% W; b( z" `6 c2 `
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-28 08:05 , Processed in 0.018490 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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