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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
8 v; y) T' w/ U# O; b: V9 j7 D/ y0 B# J, {3 k+ O/ X0 I
6 m7 v2 J! `* j7 Z1 C1 v0 m6 {' ]2 P8 p
--------------------------------------------------------------------------------6 d% ]" Q( T& h, K/ v" ~- a
WMI: Windows Management Instrumentation (Windows 管理工具)
0 r2 Q4 t3 X0 ~( Y   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 , Y" T9 k, ^8 ?& x' b5 q
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。- S/ K. K7 E7 I$ B5 h: S
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 * ^3 y2 U/ k/ a% N
, N. X, V6 S  a. ~
--------------------------------------------------------------------------------/ Y- o2 P5 `) [
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
" W. }" l  S7 D6 X! y6 m
% _7 ?9 m. L- E3 Z0 W% q1 h+ v1 l) L--------------------------------------------------------------------------------' @  \" i# P& K' b) H
① 初始化 COM 接口:: d6 a: x1 o4 a6 e; Q8 g1 Z: p
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。2 G/ t3 ]$ n; ~+ h
  这两个函数在 #include <comdef.h> 里面定义。
$ @* Q) W; Z9 J, {
+ u4 c. e9 k- q  l; @& x② 获取访问 WMI 权限:5 U: H7 L! z. b7 A
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
3 ]$ G( E( `0 l3 d   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
& `+ j5 v6 U+ w* r3 ]- o% F$ L( y& m9 F' D
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:8 C- v/ l( O1 o& m
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
8 S# v8 z3 x' S% x3 q3 X) v4 Q; ^$ H1 L. g0 q; J; X+ z% p8 Z# \
void GetWmiInfo(TStrings *lpList, WideString wsClass)9 q, {! O4 i2 n& k: j1 ^/ w
{2 Q+ A0 p1 E# v+ G/ H
  IWbemLocator *pWbemLocator = NULL;2 U. g7 l8 E8 s) F" ^2 x1 Z
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
" l7 C% V" S& L6 e0 h0 j0 z+ r" ~   {# Z5 G* R$ f2 O  X, g( p( r* U3 V* i
    IWbemServices *pWbemServices = NULL;# n+ v9 t$ ]: `# Z
    WideString wsNamespace = (L"root\\cimv2");, i2 [# Y$ ]% e0 W+ I) Q( C
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
* b, g4 Q  L( _0 z. s      {6 V4 Z+ e# c7 c+ ~. m5 N, y
       IEnumWbemClassObject *pEnumClassObject = NULL;
( c/ o* L( a& w, L        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;! @- M9 {6 W8 l: i# M; F5 I
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)7 i6 u: v( x! F# A, z
        {! F) Z6 E7 f- \
          IWbemClassObject *pClassObject = NULL;
0 ~  O- x  U9 w  R: {# J7 s2 S           ULONG uCount = 1, uReturned;
) q  B8 ]  u( q           if(pEnumClassObject->Reset() == S_OK): d: {% c& m% h7 h& Z/ x: n( y
           {
/ n: q6 v8 U1 k1 c/ W              int iEnumIdx = 0;* S! d" G/ L' u! ~1 g" r
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
! j8 X3 d- S1 C               {
4 Q6 d6 |/ d* V  Y! j                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");# O+ f& o& [9 {: a2 @" ~8 c
, ]% r/ I  b8 m' o1 R6 h+ m
                SAFEARRAY *pvNames = NULL;* Q2 E" N( @$ C0 c. q) D
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
! c4 @3 G9 y. Q$ E& ?                  {
  X, b# h3 a8 @7 P5 K2 w                    long vbl, vbu;
6 G+ R6 J& O4 Z! |  E( o/ h( O                    SafeArrayGetLBound(pvNames, 1, &vbl);* h0 A& C9 g% X+ O- S( N
                   SafeArrayGetUBound(pvNames, 1, &vbu);
# _$ D' K2 g' q                    for(long idx=vbl; idx<=vbu; idx++)( T0 z/ L, n- s# i2 ^1 U' T
                    {+ Q6 ~3 H9 I! x+ i5 r9 U4 Y% w6 P
                      long aidx = idx;6 O2 {+ Y6 f4 X% R7 I( o
                      wchar_t *wsName = 0;
( f; k; G  h+ n' r; a8 l8 f                       VARIANT vValue;+ U: q$ R" f8 o  X' W
                      VariantInit(&vValue);
; d# w/ D  P: X+ a: S6 [                       SafeArrayGetElement(pvNames, &aidx, &wsName);
- N+ P4 @5 N! B( _* V7 i+ e, E
                      BSTR bs = SysAllocString(wsName);; K' U$ \5 l2 W, F" _6 ]& z8 K2 y
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);9 u! ^0 {% \2 B8 |! v
                      SysFreeString(bs);
, v( l! _+ O8 v* b$ Q2 T7 d. j
3 _$ n) \; l$ i2 _* Y                       if(hRes == S_OK)7 o: e- W/ m1 \( L: Z  }1 n1 E
                       {
- G6 t8 V& e/ i+ Z- k* L# p                          AnsiString s;
  J, ^/ h/ R8 O- `. w+ F4 h0 J                          Variant v = *(Variant*)&vValue;
& E' c+ E8 |7 |. ?6 w2 o8 C# V                          if(v.IsArray())) T) F5 ?$ x& M  h! J
                          {
- ]" V5 ?3 J1 t2 p                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)* J+ K9 M6 l* H3 Z5 n& Y. M" o
                             {, m% C! p5 M" g  B! W4 ?9 P8 L" |
                               Variant a = v.GetElement(i);
1 h( O9 m+ |: t0 ?* h                                if(!s.IsEmpty())
! x" u( {2 x4 L! f% N                                  s+=", ";0 X! v" k. H5 f$ q% o3 ~
                               s+=VarToStr(a);
2 ^2 b% x* T  ?5 h5 I3 B                              }3 U. q3 r' z7 Z" Y+ z6 X5 _* j+ q
                          }
* L0 g: i) B3 P( J5 U                          else( v2 Z8 C- U2 C7 l; v7 T
                          {
* Q8 N( U' K' e( \8 D) t* ~                             s = VarToStr(v);
/ z2 B) ]0 h5 Y! I                           }$ T  L/ k. A2 ], R( T
                         lpList->Add(AnsiString(wsName)+"="+s);& a7 M6 a! x/ A8 r3 M- A
                       }
5 B" p) g! w4 |. q& z+ C! A1 s! d% w- g0 y; c; w
                      VariantClear(&vValue);
" i; B0 T: S9 o* N3 d6 J                       SysFreeString(wsName);$ y& w  b$ B4 {
                    }$ h" {, g" _; z  G8 ]) ?9 p2 v
                 }  K: P" {- z; D4 ]; o  x! O
                if(pvNames)SafeArrayDestroy(pvNames);
: `( o4 x. v4 \, G+ ~! F- w                 iEnumIdx++;
" P+ u5 o9 C' h( U! g5 C               }
0 [! Y+ ?  p, m8 r% d+ q            }
0 b& t2 j0 C2 [- k: R           if(pClassObject)pClassObject->Release();% F) S; R* A3 E5 T5 B
        }
' c$ ?6 o# j- I0 S. U        if(pEnumClassObject)pEnumClassObject->Release();
* [5 t5 O2 k9 @8 F/ }8 `2 s+ J# s      }; l' _( ^/ n( Z* |$ E( C) I/ _8 K
    if(pWbemServices)pWbemServices->Release();, S, X, C: y( {* s& G
  }
6 \! r" ], n4 C/ ?  if(pWbemLocator)pWbemLocator->Release();, k2 ^; _- a$ K* b- k2 M  A
}
3 n0 Z8 R- e! E6 ]9 d" l//---------------------------------------------------------------------------
$ D: B$ F# C# W# f
  d# m1 }" n( p( @* h// 通过 WIN32_bios 获取 BIOS 信息:
& T" s7 J$ S- r: e/ uvoid __fastcall TForm1::Button1Click(TObject *Sender)0 Y7 p( x1 v4 ]& J" A
{
8 o! @, q: N5 L' d    Memo1->Lines->Add("================== [WIN32_bios] =================");
1 Q+ k* R& \; f6 B  c. d* d    GetWmiInfo(Memo1->Lines, "WIN32_bios");* K8 H# o; h  t
   Memo1->Lines->Add("");
& @- L* j8 F- K. g3 J}" K+ n# _7 p+ z4 y$ H
9 [. O/ |  g& h
--------------------------------------------------------------------------------$ A; V8 S+ J$ ?

6 G5 _/ X! V# u3 j) o  `WMI 可以访问的信息类型有:# S) J7 M3 k0 n4 l5 M; N1 S6 M
  Win32_1394Controller7 g* O; G8 q2 z( Y8 U
  Win32_BaseBoard
1 a$ J6 M+ H- `; @' y3 N* v   Win32_Battery# A. P) \6 X' N- {, q
  Win32_BIOS. r( ]2 W3 S0 @# ?' E$ d6 T
  Win32_Bus
1 A/ ?, |% W1 ~% c7 }   Win32_CacheMemory$ v* l# z# L5 t4 R
  Win32_CDROMDrive
4 [1 M- }; l$ @, V- x3 k   Win32_CurrentProbe8 C. f% d0 m: P/ u
  Win32_DesktopMonitor0 d" y7 o" `# i+ s
  Win32_DeviceMemoryAddress) h' p  u; |' [) e2 ?
  Win32_DiskDrive
. o* l) H+ x1 b9 g- U) z9 A   Win32_DisplayConfiguration
# l2 ?5 H; E$ i; g, I3 C   Win32_DisplayControllerConfiguration7 m* m6 n  Z5 H8 L
  Win32_DMAChannel; u4 W. Q4 N2 M
  Win32_Fan
+ h- ^7 Q: i3 L- n4 l   Win32_FloppyController
$ T: B8 {' z$ ~& i. G   Win32_FloppyDrive4 D" C8 Z- w( h5 ]
  Win32_HeatPipe
) ^, P4 k/ z& C* X# W$ X  v   Win32_IDEController
- K7 G; N$ a! o2 M; b   Win32_InfraredDevice
- d2 z& J" _" Y/ l# Z/ B   Win32_IRQResource! O& K5 D: f  O5 Z1 |$ S4 E1 }
  Win32_Keyboard1 J6 V5 ?1 @) |2 I4 H6 }1 Z
  Win32_MemoryArray/ `. z# a- F1 a# T
  Win32_MemoryDevice2 i# }/ P4 J/ n& d1 b0 R9 X* U9 w& M$ v
  Win32_MotherboardDevice
9 B) z6 d! e, ^! @+ }   Win32_NetworkAdapter
8 W6 J7 g# d$ a1 u5 j   Win32_NetworkAdapterConfiguration' E" ?. h8 W+ J. P4 d$ l+ \
  Win32_OnBoardDevice  s4 x) S$ o) h1 `4 ]
  Win32_ParallelPort
0 A9 r. w5 q- e; [% ^   Win32_PCMCIAController
% y; [( t/ P) ^; u( E   Win32_PhysicalMemory
2 b0 R7 d  N4 {$ Q   Win32_PhysicalMemoryArray
5 K1 N( j" K/ K* k' R   Win32_PnPEntity
9 l4 @8 V0 Q' p0 x7 i* M, t   Win32_PointingDevice
2 B/ M7 Z. k; k5 d! w2 d6 _   Win32_PortableBattery
$ z; h7 m9 b- U' p: |( a7 r   Win32_PortConnector
( N# D( h. F* @. s0 M   Win32_PortResource9 ^* M# _. ^  d3 p* e# n
  Win32_POTSModem: k( }: k+ H0 Z% V' W! |
  Win32_PowerManagementEvent
4 A6 v$ S" T* t2 C  |  p   Win32_Printer; s1 Y3 R; c3 ^3 x/ ?2 s
  Win32_PrinterConfiguration( s5 P1 D) o& z2 P$ {
  Win32_PrintJob3 V4 B( a1 u( `/ A
  Win32_Processor) f4 ^7 X( ?# `9 D7 u
  Win32_Refrigeration
( T. B, r. T; N# @8 W   Win32_SerialPort& D; @- R* G  J/ ~; [) {- e
  Win32_SerialPortConfiguration" Z8 J! ?- g4 b
  Win32_SMBIOSMemory
: j; ]: M1 w& L2 f5 F- g   Win32_SoundDevice
3 H# n/ |2 t0 a1 U/ P7 ~4 u   Win32_SystemEnclosure
6 |5 q+ Y7 B# u" H/ V( C; ?- ?   Win32_SystemMemoryResource
) i- L5 A2 }4 N& P. k! P   Win32_SystemSlot, V; d4 S6 V, o& n/ _
  Win32_TapeDrive
# T4 P# d2 Z( @2 g! f! j0 f8 \   Win32_TemperatureProbe
9 k8 F- N9 U3 ?0 `% F) a   Win32_UninterruptiblePowerSupply
  h& I- N' H" I9 Z6 z   Win32_USBController! o2 n" G  T  ?2 \  w3 N
  Win32_VideoConfiguration6 K: }2 B: A3 M% `- E8 ?
  Win32_VideoController, X' f& @2 T7 V9 Y% n
  Win32_VoltageProbe9 o# [4 `4 e" Z: Y; _: \, ?; v
/ Y4 p1 j( q+ \7 e/ a  E
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-31 11:17 , Processed in 0.021179 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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