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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)6 E0 g2 S* r: Q& P9 a
$ t* d" s2 ]4 w; y

% _* d% q6 F. E" G8 y--------------------------------------------------------------------------------
$ J# E1 n8 H" Y+ f- E# U' X1 eWMI: Windows Management Instrumentation (Windows 管理工具)0 D7 d+ ^+ U- L8 `! x
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ; ]2 d9 P7 G3 f6 I9 @" t$ e
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
* \. m- t4 M, t/ t9 ]1 ?, e: Y" q   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
+ i; Q9 {. M5 N5 Q* s! E3 `: H1 A. h% h
--------------------------------------------------------------------------------0 G+ J! {$ |( e4 m! j- U
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面- c) {' d0 Y% J6 L" C

  q6 d1 R9 j. }7 y. Q--------------------------------------------------------------------------------9 R0 Q) R* ~6 g+ [$ X
① 初始化 COM 接口:! n- f: i' |7 z% G
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
5 X* {/ H# Y% o! i6 n/ d   这两个函数在 #include <comdef.h> 里面定义。. L: i" i& J+ \3 W3 {5 d. V9 _5 V( T
  c& K) m  p0 m; y
② 获取访问 WMI 权限:
1 c% V$ g: D7 Z& _4 k6 c# Y. z   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);, D; y% |( {9 M0 m/ I: O9 A" I9 I
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
6 q( C  N( e2 G! J/ ~
- A9 b) R! S- g. e③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:" l* L8 s+ r# ^- A, M* E0 d
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
) G* f# H5 J: |9 q0 L/ D$ k: {4 e2 [3 E9 B$ X  T  `* s$ Z
void GetWmiInfo(TStrings *lpList, WideString wsClass)! v3 l: W& B4 Y" V" q
{, y3 Z4 @$ A. P2 E% \
  IWbemLocator *pWbemLocator = NULL;
8 P) R# R' K) E, e- n- g  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
* g3 h3 B8 b6 p6 e   {
5 m4 @% z( M9 n" f# ~     IWbemServices *pWbemServices = NULL;
, N+ i  b) b3 W/ l( D, y     WideString wsNamespace = (L"root\\cimv2");) k' y- L2 w6 M5 A; p
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
9 [" }( b, W. N" `( ?      {
- w' X9 n1 _" F# n6 c( |4 n        IEnumWbemClassObject *pEnumClassObject = NULL;
$ B% ?  Y' {+ i5 o; `        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
/ G' P/ H% s  C' ~$ A* p        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)6 ?5 y. h' Q3 g' a1 W2 ^7 I
        {
" J6 a2 c6 Z" l& n) L" z2 o6 s6 T9 X  m           IWbemClassObject *pClassObject = NULL;
! o5 L0 _2 l  @3 g+ ~' U           ULONG uCount = 1, uReturned;
& T6 E. U5 G1 A+ [' I           if(pEnumClassObject->Reset() == S_OK)* J7 A( ^$ P7 g5 K( N
           {
/ d4 d/ d+ g4 f9 `. t; O' U              int iEnumIdx = 0;
4 [  q( @- q; S; N$ m; ^5 E              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
. H$ e- q1 |8 u) ]6 ?6 _               {  b6 t8 ?: o! ^8 @3 l0 S
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");3 [, }9 ]4 L5 z# r! f, I% Q

+ I  ~$ A6 |" {8 y+ E! z4 T                 SAFEARRAY *pvNames = NULL;3 f2 E+ b- y7 _1 `4 c
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)8 Y; P. n- w6 v, S( q
                 {
: `& `/ j$ `' d6 R                    long vbl, vbu;
9 k, t6 s, t3 r( W7 Q7 h                    SafeArrayGetLBound(pvNames, 1, &vbl);
3 [& d5 N3 v) g! {; w6 r                    SafeArrayGetUBound(pvNames, 1, &vbu);. l0 a" z" _' r' d, y
                   for(long idx=vbl; idx<=vbu; idx++)
' x' K6 q6 }% R- B3 ?' b8 `                     {8 A- Q. k) J6 q$ m
                      long aidx = idx;
2 I! {. A- v$ V. [+ B4 b! b                       wchar_t *wsName = 0;
) D, g8 Q) q% _( @9 A5 d                       VARIANT vValue;
3 m( T$ v1 Z* `* g7 O# `8 c  c                       VariantInit(&vValue);
' Z* E/ S8 ~0 w* J% k& o1 O$ a                       SafeArrayGetElement(pvNames, &aidx, &wsName);# h( a6 Q2 ?  W" p) T
0 P  O" P4 E* I8 n9 Y3 l; B8 `( }
                      BSTR bs = SysAllocString(wsName);
1 i) x) b3 s9 M; l                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);; o  t! I  O; U
                      SysFreeString(bs);
; Q- X2 v7 @* u: A/ I# R" g* o* ~+ K# N  M8 O
                      if(hRes == S_OK)
* v; ]" o# X3 t                        {6 x) W) q% N$ J8 n7 u1 g
                         AnsiString s;0 c1 d4 P3 H1 Z: H
                         Variant v = *(Variant*)&vValue;
% `2 u  Z8 R0 `                          if(v.IsArray())! K, _' g/ I. [+ @3 B- s0 K) m# T
                          {
# h+ B, U8 k- k" M0 O                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
' B0 u5 @1 o& x  [" W1 I* d8 Y/ _% Q                              {
2 [* M# {7 X  M( Y% q3 ?7 K8 S/ ^# o                                Variant a = v.GetElement(i);
2 x8 f2 z! J" O                                if(!s.IsEmpty())2 q: K' n: e& {
                                 s+=", ";! c2 d' K% [  x  o/ [
                               s+=VarToStr(a);
) a$ P( C. N  l% X7 b7 {: j                              }- K' a9 ]2 G; V
                          }  o# O" J+ d5 u0 u. y7 r6 o+ N: p
                         else
# C( I7 c1 {0 o. Z                           {: }% U7 J6 [7 Z9 ?6 ~0 Z$ J
                            s = VarToStr(v);7 p4 n* ]2 K8 }4 b  E# w
                          }
/ {0 S/ ?; x0 r                          lpList->Add(AnsiString(wsName)+"="+s);
/ X6 z7 |* `' h3 N2 Q                        }# H! ]! G* ?7 q, l2 K+ B1 _* f

0 U2 E4 |6 T* a2 \7 S                       VariantClear(&vValue);
( n  j6 N7 R4 l                       SysFreeString(wsName);
; G; G* @# X. I/ Y. p& r                     }
, @; t' W$ W% F' J3 x, }                  }9 U5 n# n+ K+ C$ P+ \$ x6 m
                if(pvNames)SafeArrayDestroy(pvNames);
' D1 w# I4 V! c# q$ J7 t                 iEnumIdx++;
+ b" L; l0 h' T               }
- L/ z8 o7 t2 v/ |            }
3 p; A$ [! {2 K: q2 i; B           if(pClassObject)pClassObject->Release();
, V/ U& E' `8 {& j7 d/ G! i" ~         }$ X0 w; X% N4 F) Z1 @; @* ?9 F
       if(pEnumClassObject)pEnumClassObject->Release();4 q/ o/ U" h& E: w
     }
7 o; }/ @' g" k1 S' X8 y     if(pWbemServices)pWbemServices->Release();0 g9 W/ B% A3 U2 v; {* K  p4 C
  }- |# C3 t. i) Y) P& r' w+ [8 E
  if(pWbemLocator)pWbemLocator->Release();& S/ h8 u9 l# Y0 K+ f
}8 \1 ^+ n8 m% U( U- {7 [
//---------------------------------------------------------------------------
: ?! ~5 p* w6 {5 V2 o2 F% Z1 j$ F7 \$ ~) d
// 通过 WIN32_bios 获取 BIOS 信息:
" X$ \5 R  x$ O( Cvoid __fastcall TForm1::Button1Click(TObject *Sender)
; i, F7 O$ A% O{/ n% _2 a% \" p2 o& w
   Memo1->Lines->Add("================== [WIN32_bios] =================");
: B5 g& d# A) ^7 q! B  f" k    GetWmiInfo(Memo1->Lines, "WIN32_bios");  B; x, @* w' o8 Y
   Memo1->Lines->Add("");
8 x$ v' h4 Q" t. i}
: d' f# I/ x- I& L) q# u( m, T; W3 e1 H/ e% w$ b) o# ^6 f6 A/ y- T
--------------------------------------------------------------------------------
- H' n( T, Q, V9 I; {0 l& {* b$ y: s8 k. A. k+ O
WMI 可以访问的信息类型有:' ?$ r+ p" r7 V) W7 F* Q/ N+ Z: K* @
  Win32_1394Controller
& n& B( w- W$ |   Win32_BaseBoard
. J- e6 a% {  r1 w$ m# m   Win32_Battery
  N1 A- c5 W/ ?5 q   Win32_BIOS- t  @! ~% ~( g# d& r
  Win32_Bus( }2 v4 ]/ R( f  c) i) m
  Win32_CacheMemory
; P/ i  P0 X" z9 p   Win32_CDROMDrive: P, U5 o" H  T, Z7 C; ~: a8 T
  Win32_CurrentProbe
1 o9 W6 B! \+ j8 N, e4 [4 e   Win32_DesktopMonitor/ v% E% z1 N* [! {9 H
  Win32_DeviceMemoryAddress
, U) p( N( {) H* y) _1 m3 a* Z   Win32_DiskDrive
8 g/ d; \) \4 p5 V" P+ {   Win32_DisplayConfiguration
5 @& ]4 L* Q  U4 l7 Z   Win32_DisplayControllerConfiguration" {; k( ^0 u& H9 J; O
  Win32_DMAChannel
3 R0 J. m* s% f4 E4 W! B- w   Win32_Fan
/ Q" U! t+ D; D: p% N   Win32_FloppyController% m7 ^  Z* q" f1 `* d. Q
  Win32_FloppyDrive
% f" L, v, t$ M9 q   Win32_HeatPipe" |, s5 f+ Z! F8 B/ E
  Win32_IDEController
% ~0 }9 M6 C) Z' W2 t4 |   Win32_InfraredDevice
6 F, U. H1 w( q1 p, L. {  X/ L   Win32_IRQResource8 n+ t0 I7 j1 T6 v6 ~" d  \
  Win32_Keyboard
6 b0 R' |+ {, B: x& u   Win32_MemoryArray
; G0 k1 R5 d; n; W4 Y1 B" L   Win32_MemoryDevice
2 o, U0 Y8 g2 Q; g) X   Win32_MotherboardDevice
/ V1 {- \# Q* @   Win32_NetworkAdapter
7 M; M  d: p% X   Win32_NetworkAdapterConfiguration
, T# E% ?( t2 u) f   Win32_OnBoardDevice
& W3 l# p1 ~1 H" H- D- W   Win32_ParallelPort
9 I) L5 n2 ~5 G" W7 x7 ~$ `   Win32_PCMCIAController8 ?/ V6 b5 N: A! }$ a7 J
  Win32_PhysicalMemory
5 ]2 R0 E) h. B, V' x3 r) u6 P8 T   Win32_PhysicalMemoryArray; O' o. z& X4 C3 u5 x- e: q
  Win32_PnPEntity
& q) ]4 F! R! x# x7 a, n, {1 C: P2 T   Win32_PointingDevice% K+ V0 u# A! o+ V
  Win32_PortableBattery3 @' R8 T3 `4 q# R+ a0 @
  Win32_PortConnector
: s0 A3 Q3 ^# W; f- D- y' B   Win32_PortResource
2 f0 t# m# \+ q% d   Win32_POTSModem& P1 p( o* v5 J& \& p; B4 a
  Win32_PowerManagementEvent4 q& x3 o5 a* ]8 l' h" C
  Win32_Printer7 W' `( Z% o- ], [! H& v
  Win32_PrinterConfiguration
0 Y' A( l$ q9 p5 [1 r6 q. [1 j   Win32_PrintJob4 b* u% w9 C9 b- b! n
  Win32_Processor: c9 a) `, n7 r  c/ w  |) K) a, {
  Win32_Refrigeration3 m( ~. ?* y% T& X% _$ r8 C1 i! Y
  Win32_SerialPort, c. b  {0 v/ d( u& s1 a
  Win32_SerialPortConfiguration
3 v0 d+ ^) y3 ^$ ?9 v0 I   Win32_SMBIOSMemory
$ C0 P3 x0 m& a, f   Win32_SoundDevice
6 B- r# b2 [% ^* C: ~: c0 q   Win32_SystemEnclosure2 c6 C9 O/ {# `& p& T; G/ F, p
  Win32_SystemMemoryResource
% G: V  Q7 A/ `2 q   Win32_SystemSlot7 G( v* L' i1 M6 ?! T/ g7 P
  Win32_TapeDrive/ Z0 ^* z8 N2 I3 c) t8 y8 d
  Win32_TemperatureProbe  ^. m( P7 i1 n* a9 M
  Win32_UninterruptiblePowerSupply& |: P7 S) V# ?* S' ~$ N
  Win32_USBController- Q6 `! m2 Y& s) j
  Win32_VideoConfiguration$ D. f  m6 k( [' \
  Win32_VideoController
3 n4 O- V& F# N4 s( h$ A5 m   Win32_VoltageProbe) k' F" b9 O: o

: B8 H& S; F' I0 u以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-5 12:56 , Processed in 0.019692 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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