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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)/ K6 Z  B/ O7 v7 x' e! J

0 b( \0 I# `0 W/ g7 a
2 i8 I; ]+ N8 r% k--------------------------------------------------------------------------------1 ]6 u& z/ F) U9 t
WMI: Windows Management Instrumentation (Windows 管理工具)0 h$ f. E, }# t
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
  u& D: f/ z, k9 V; }   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
( I, k5 _) Y& \   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
* x" ~6 L/ h# ?5 g% h1 d' G0 M0 J& I$ d. m
--------------------------------------------------------------------------------
7 |- E4 r3 T! W, ^1 T1 sBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面1 T/ |6 B& Y  V) m

$ O7 H. v$ G+ F' @* m) ]--------------------------------------------------------------------------------
7 w3 q/ M% ]5 S# |① 初始化 COM 接口:
) ~5 `2 p% }, I& J: L   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。0 ?4 H1 t9 L$ Y0 f3 }4 n. e9 T
  这两个函数在 #include <comdef.h> 里面定义。- w$ s/ P) C1 a4 A

, C3 f" t( _9 ]! r  \$ M" Z② 获取访问 WMI 权限:  L/ o+ X# L% U2 r
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
4 w& f$ @1 v" v* A3 a% P* J   如果这个函数返回 S_OK 获取权限成功, 否则为失败。1 w: j8 ~6 M: [+ s
& l3 n2 z- c& t0 B! k' x
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
- E* z6 u- N6 w5 e   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
: x. p9 ~& n9 n7 U. `- c7 Z; x3 v2 j2 }9 R
void GetWmiInfo(TStrings *lpList, WideString wsClass)
: n/ C/ |  z4 x7 R{2 t* ^" ?- w5 Z7 u, M
  IWbemLocator *pWbemLocator = NULL;
# w6 }) |  |  [) G7 _0 }  e  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)( V6 g2 m* W9 c
  {  t& \* t5 x# u3 X
    IWbemServices *pWbemServices = NULL;
7 }% \( v' \+ s5 f     WideString wsNamespace = (L"root\\cimv2");
) R: W. A& [# n7 H/ _     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
, |/ t' u# d$ B+ @& U3 e      {, s9 d, c( e. D7 X- t4 ~2 d9 [  I. b
       IEnumWbemClassObject *pEnumClassObject = NULL;' l- |. [0 A$ O8 P: |% L
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
8 d8 J) n, h! r- y7 |% n        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)+ m3 o' C7 o8 @+ n6 `4 K% n" @. r
        {0 S0 T: a6 l5 P' \; o
          IWbemClassObject *pClassObject = NULL;  _' X; r2 v: K& d2 Z
          ULONG uCount = 1, uReturned;
( r7 ^( f6 k$ K! N7 k! x8 b           if(pEnumClassObject->Reset() == S_OK)
( W( O1 l) U* p: x% E# i            {* t& G7 B1 v* N/ c& J% K
             int iEnumIdx = 0;2 A* H; H- F3 \! ?
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
& c) K6 m1 Y: m' S6 }2 s' r               {
# c! X3 S5 o& F( U. ?, Y# J3 }. A: T: O                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
- J% z3 e( X- {# D; z# a
! r1 N7 N/ p5 v                 SAFEARRAY *pvNames = NULL;9 J- c" x+ Q& g4 Y1 _1 \
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)0 t4 D! a4 g2 k
                 {# Y+ |5 T0 T6 g5 s$ Z9 s
                   long vbl, vbu;! S4 o3 n! R, l
                   SafeArrayGetLBound(pvNames, 1, &vbl);
% i- I3 s! W0 l+ H( g4 ~, \                    SafeArrayGetUBound(pvNames, 1, &vbu);2 A! a0 `) h$ G( V
                   for(long idx=vbl; idx<=vbu; idx++)
$ z! k7 U& h8 {                     {
( C6 q1 r6 ^2 h) {6 P                       long aidx = idx;2 m5 [& Q& z* t" J1 \
                      wchar_t *wsName = 0;
: \; J: G" b, f; v) S+ ~6 L  B                       VARIANT vValue;! A) D* F# }, n' s$ C. k7 c; W
                      VariantInit(&vValue);
# y+ H, L8 i6 p5 e1 `  N; Q" n                       SafeArrayGetElement(pvNames, &aidx, &wsName);9 J5 a+ N' ~* s( f' ~
1 A" I8 ^, E- z- v+ s/ W
                      BSTR bs = SysAllocString(wsName);
9 v1 p6 S, M+ \  E                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);9 A" l0 ^, ~7 [& K" u
                      SysFreeString(bs);
6 {. M$ K5 ~2 }# W4 t7 G  ^3 n% y% U1 G/ R* M% S3 C- h
                      if(hRes == S_OK), K. D5 q' b/ ]* D: H! o5 \
                       {; u6 ?2 F  `1 L6 P: a8 a
                         AnsiString s;
5 r8 L8 _5 j& G4 O& B                          Variant v = *(Variant*)&vValue;
. \2 V' \3 b0 d; }                          if(v.IsArray())# o& J  c( A- r) T3 B3 k% b; z3 T
                          {$ W, Z) b; L: t0 j% J9 G
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)/ r. L" z6 N; B) b
                             {3 D7 K! _) P7 j% J/ z1 t2 {0 J
                               Variant a = v.GetElement(i);, w+ |3 ^3 p6 s5 _2 V: }. h! `
                               if(!s.IsEmpty())! {! i- X3 @. t& f/ V  b
                                 s+=", ";1 {* y" [9 R: Y) z/ N; [" y- m
                               s+=VarToStr(a);: \  X. @& t. ~1 a
                             }4 a/ r4 N: G- |; D/ H0 ^
                          }$ e3 u4 U* j# N  C7 J
                         else2 u! U5 f' R2 N6 P0 k0 o3 J
                          {
2 ~" s' ?4 i0 l                             s = VarToStr(v);8 Z# G/ L$ v5 r4 ?+ R$ B
                          }
# b7 G) m$ j# K! \& d* r                          lpList->Add(AnsiString(wsName)+"="+s);
! ~0 j# e/ E  n/ N, g                        }( p/ C3 \# n: m" S" u$ O3 y

( F  {3 i) N9 \) A1 @                       VariantClear(&vValue);' Y% B" m. V- z3 }/ B1 z
                      SysFreeString(wsName);
5 c% P4 \9 _7 {' z8 N                     }+ m- X# J, ^) n* w# _) j( p+ A3 P3 _+ y
                 }: D5 X. x: o5 C* |& S# b% H
                if(pvNames)SafeArrayDestroy(pvNames);6 O; v8 P' \) t/ `" s9 v2 m
                iEnumIdx++;5 m, Y0 L& A2 N# y8 E; i4 u8 s
              }
& A% R) ~" u7 X) c5 W! k            }6 e7 h  n8 W) V9 P7 X7 C
          if(pClassObject)pClassObject->Release();
5 Y- ?! ]& G) o* F         }& y2 O; L. N5 y% s( g+ ^$ ~5 y7 G
       if(pEnumClassObject)pEnumClassObject->Release();
5 ^7 ?& d& F& V9 L; X$ A      }+ f$ j1 b( F# U% X$ ?5 D
    if(pWbemServices)pWbemServices->Release();
! t# Y$ S) a) `8 s3 @2 D   }/ C3 ~8 H4 I( ]- f7 h
  if(pWbemLocator)pWbemLocator->Release();
0 L- {3 @8 I" r0 l! f' k8 c9 O}) k' a2 e! e0 L3 |* f) c6 f. ^3 a
//---------------------------------------------------------------------------( u  }) \( V- L  {0 H* w2 g  |3 u

1 t7 R: n1 f& g$ A* I& ~8 t3 _// 通过 WIN32_bios 获取 BIOS 信息:. i1 f) U- z$ e& _5 N' [
void __fastcall TForm1::Button1Click(TObject *Sender)' ~8 f1 i/ W0 m1 t
{" a  E6 \* @% E/ e. ~* s
   Memo1->Lines->Add("================== [WIN32_bios] =================");2 G  i+ s2 p4 Z
   GetWmiInfo(Memo1->Lines, "WIN32_bios");: E# ^3 m# F# M' D: a9 i3 o
   Memo1->Lines->Add("");5 `& J, @1 k) j% j- v8 G
}( `6 h: E" {# H$ x. p/ X% a! S9 \. o" ^
, ~" e2 u6 Z- u) d3 r9 S
--------------------------------------------------------------------------------
9 S" z: @7 Y$ ^1 F0 }4 F* ]
+ \8 d3 H# A( Y: m3 UWMI 可以访问的信息类型有:+ f2 u  J! H1 y4 ~/ A) o
  Win32_1394Controller3 ]$ x/ A# r; c! c& N
  Win32_BaseBoard! R& @% Y/ f- d4 e) Z6 A
  Win32_Battery
' Z( Q! @' \0 O) Z3 {   Win32_BIOS. y- g: c3 ^6 ?
  Win32_Bus
: Q! W" i5 I1 g: S5 y. O9 G   Win32_CacheMemory0 x1 E. y! i9 {/ B1 E
  Win32_CDROMDrive, s1 P; _0 Z: o) {
  Win32_CurrentProbe
$ L7 n, ^! g$ ^4 U& _/ w   Win32_DesktopMonitor* w" e  o8 b) @  k; g6 c6 a4 z
  Win32_DeviceMemoryAddress4 `0 M; O5 Y% z& E! N0 t
  Win32_DiskDrive- ]. L  {9 P* V. i$ t5 Y0 M
  Win32_DisplayConfiguration/ p% H" [, i) x* h7 ~$ y
  Win32_DisplayControllerConfiguration
0 [" t  C3 I2 X, I/ ^2 P   Win32_DMAChannel
; z% l& z6 J( a0 q3 A   Win32_Fan
5 s+ S: g* ^) j  J: _7 E0 o   Win32_FloppyController6 D( `8 N8 n6 T0 N5 y7 @* R- q) k4 d
  Win32_FloppyDrive, W5 Y' ?* T5 D- _1 f$ \
  Win32_HeatPipe, `2 V% w. {( n# V
  Win32_IDEController4 W/ w* q6 R# t' B/ A3 r
  Win32_InfraredDevice
* @2 S5 e' @. R& h   Win32_IRQResource6 m7 k! D- x" S2 S8 R0 n: q
  Win32_Keyboard$ N( M% u; }- B/ V& ?
  Win32_MemoryArray3 d3 E2 }1 i+ e4 @  e3 l! o8 _
  Win32_MemoryDevice
# n4 b6 ~% ~; q) k; F1 \* }   Win32_MotherboardDevice
% }+ N- C$ K* F5 i   Win32_NetworkAdapter' i2 W1 J& T5 y4 o- G# u
  Win32_NetworkAdapterConfiguration
( a, P- c! R. z8 B; T+ z5 |2 M   Win32_OnBoardDevice
0 |0 M- l2 U$ I   Win32_ParallelPort
+ _$ n5 J3 A6 b' g  R- F# V! q, Q   Win32_PCMCIAController
4 N! w, \  Q1 [3 c  q   Win32_PhysicalMemory
$ W! @- V: K9 s2 Y) J7 S  x   Win32_PhysicalMemoryArray
( A; \% B1 X7 ~! ]9 ^   Win32_PnPEntity4 B: S  a# a8 f8 H9 R9 X3 d  K) F- t
  Win32_PointingDevice
. i' l- l. }  W4 A   Win32_PortableBattery
2 J+ V* u5 a4 g( c; l- [   Win32_PortConnector
5 Q7 t1 {4 y) X5 C   Win32_PortResource
* z3 _! m- ~1 x! z   Win32_POTSModem
3 R+ P' B( n# k8 X( u   Win32_PowerManagementEvent
4 M; x: N) C, J- x! \. m0 F8 l   Win32_Printer
% H! d/ e1 T+ I6 q   Win32_PrinterConfiguration. n' E. i& G! d; I
  Win32_PrintJob
0 ~# h- `, u& i/ U2 ]6 }3 G8 M% ^: S   Win32_Processor
; P  ^7 T6 X; M4 Q+ U! h2 H: k$ b8 ^   Win32_Refrigeration) }: E" b. w9 X- |
  Win32_SerialPort
7 m! y4 y* Y; i4 O/ R8 z7 f   Win32_SerialPortConfiguration+ k& W$ J( a6 {4 c! j
  Win32_SMBIOSMemory
5 q  s7 h# E8 w   Win32_SoundDevice) w- O9 S2 e- V% h$ G' U
  Win32_SystemEnclosure1 |! ~1 I) E5 L% @: }+ J! X
  Win32_SystemMemoryResource
% K/ K( `" R* @& L   Win32_SystemSlot5 p7 ~& n4 Z: M
  Win32_TapeDrive4 |( m2 k  A, D& x
  Win32_TemperatureProbe
6 s  g/ W% Q) ~1 j   Win32_UninterruptiblePowerSupply
# r' a' f9 @& b   Win32_USBController
& Z2 u, _) ^7 R   Win32_VideoConfiguration+ M  u. s0 ]5 x, J" E
  Win32_VideoController7 l* P6 B6 T" d" ~
  Win32_VoltageProbe; V& _; h; G: T7 u- W
5 L; n( E# f! u" k
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-14 20:41 , Processed in 0.020790 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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