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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
$ `& s0 M, n1 p7 x( w0 `
) A+ Q0 X0 s) X* n! i7 N4 A' @- ^" t9 r* T3 G1 c
--------------------------------------------------------------------------------- K9 o; k1 p# i: \
WMI: Windows Management Instrumentation (Windows 管理工具)
; n: n, z1 h& }' E# t& L# M   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ) [- b! v6 o3 b8 F5 F; R4 k' L- M
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
9 ?$ k5 K$ h& n   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
& g- r- C+ ~; N$ r) V- n3 P5 T9 X& p2 l
--------------------------------------------------------------------------------% u% u) C! u5 W7 F$ ]1 O7 ?8 U
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
, g- W2 ]% b3 @2 \, s2 G! {2 N$ x: m4 T' {& m" J
--------------------------------------------------------------------------------) f0 e, m$ }: d2 j( b6 h
① 初始化 COM 接口:+ r' p; W3 u) |  u7 k
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。3 d7 K1 g+ U6 M
  这两个函数在 #include <comdef.h> 里面定义。& j0 y( {3 f$ L0 ?$ [  o' W

( h; r. b6 e/ u② 获取访问 WMI 权限:7 e: C) \& A8 f1 X0 Z
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
$ x5 `9 J+ e6 L4 Z* B( u% S6 D" ?$ P   如果这个函数返回 S_OK 获取权限成功, 否则为失败。' ]+ Y1 T, S4 R

. T* x, M( w* e& u4 s③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:1 P5 p% q. s( |6 x' L! R8 O
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
# i0 S3 f& Y3 O3 w+ g, L( w" B6 C0 b) U+ h
void GetWmiInfo(TStrings *lpList, WideString wsClass)
0 J' _4 F$ [- \/ \5 D: j{7 i$ \0 h# T, J8 ]7 o! A
  IWbemLocator *pWbemLocator = NULL;1 _9 n7 p8 ]# N4 i0 K
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
$ a4 u' U" n1 a( `1 [. d   {$ I# b5 {! A9 F5 E4 @0 O
    IWbemServices *pWbemServices = NULL;
0 T* j& w9 R4 E- T     WideString wsNamespace = (L"root\\cimv2");
5 A; I* ]* d( n3 |1 l& |     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
% O" ]1 G% |- z& r% m      {
0 C+ `) f7 O1 d2 Y: _# X        IEnumWbemClassObject *pEnumClassObject = NULL;( \( e, F$ m# n$ Z
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
5 F8 `$ @7 o# u9 K) Z$ }- t        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)6 S: P. v; O, F+ P8 P. O
        {/ [- G: ]9 E! S+ t2 T! J$ z
          IWbemClassObject *pClassObject = NULL;- W/ J3 }7 X9 }
          ULONG uCount = 1, uReturned;# Q5 b6 M9 ~& x8 S2 S& \
          if(pEnumClassObject->Reset() == S_OK)
5 v4 l' E7 ~, a$ d; S# w            {
1 {! {( i+ @/ f3 `) ]3 w; t              int iEnumIdx = 0;: n, z6 v3 S$ N: E2 ], F5 y
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)" T+ k' E* C+ z" X% T9 n
              {
. k2 C! V4 n' ?. O                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");  E% O  i% X, G) k: F- F

2 K* _3 c/ A7 @- p# a                 SAFEARRAY *pvNames = NULL;
* u: I/ M( o" S8 y2 U$ f                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
7 _) c& F! C4 L0 ^, y+ X( @6 B                  {
# K* S. X$ M, g# `+ q. o% _                    long vbl, vbu;
( Z4 S$ Q# n- D; M8 V                    SafeArrayGetLBound(pvNames, 1, &vbl);
& w4 x$ b$ s( \0 S                    SafeArrayGetUBound(pvNames, 1, &vbu);( M' k* j- Y+ M2 g
                   for(long idx=vbl; idx<=vbu; idx++)
1 l1 H% q6 H1 U7 M                     {
8 Q) ?$ @* S' }  J( |* \                       long aidx = idx;0 G' ?. r. S3 ?, `& H* }2 G) A
                      wchar_t *wsName = 0;. u& N0 j  h9 o: \6 g
                      VARIANT vValue;; v7 S7 y& ^3 ~. t% l- x, b
                      VariantInit(&vValue);! K- I  S5 s( W; i
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
& [- I/ O1 y  B
; s/ i; F9 k5 H                       BSTR bs = SysAllocString(wsName);
& Y- _( R8 o9 Z* @0 L$ P1 j& I                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);0 l8 a6 w' O. {8 {8 L; R# x4 C  ^
                      SysFreeString(bs);
+ Z+ d; n8 M0 }; {" x
" ]$ p8 h! s/ V                       if(hRes == S_OK)6 ^/ d. H$ ?# e
                       {
  n$ y1 }8 V/ w" n, ^                          AnsiString s;) b: R; v, b3 h. G7 f; _
                         Variant v = *(Variant*)&vValue;' ]. y1 g' h* e# A# Z  A
                         if(v.IsArray())
% k( o9 B  H+ q2 h; x+ D                           {0 ~( O. }" K3 b1 w4 b) y( I7 P
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
  x$ @& e7 m* ~2 l7 z) O                              {
2 r0 j( p' A- Y1 M0 `. q                                Variant a = v.GetElement(i);
$ B$ Z6 `# Y/ Z+ c4 u3 z. ?- `! d                                if(!s.IsEmpty())7 P0 r/ y. h) w1 o: O0 Y
                                 s+=", ";6 G- ^8 t7 [9 K1 [2 q, C9 o! W1 U0 s8 Q
                               s+=VarToStr(a);
" Z/ V# ^) W5 v7 \9 g: R3 N                              }
' M% t, |  h8 n- {+ A' |8 O% Z                           }! b1 ^: m- s; E- h4 h7 v
                         else8 d) B9 Y( h5 |. ?1 c8 X6 C
                          {
; m4 n3 O: g: `* B                             s = VarToStr(v);
( I4 R# ^) @9 Y; J7 I% S" I. ^                           }
5 F0 {$ u3 v# R* D  I& y( a  d                          lpList->Add(AnsiString(wsName)+"="+s);2 k' K" i) p/ A" q9 a; `3 l
                       }
9 g3 V# i3 |- G- A& }6 q
: H+ U3 [& r. Y: z5 O                       VariantClear(&vValue);" o3 S" T7 N  Q# N
                      SysFreeString(wsName);
7 z, Y: M* {2 a0 g. h; S* _$ w                     }
/ i# A0 y& r; k5 {6 g                  }+ `7 G/ z) n8 M# Y0 G; w
                if(pvNames)SafeArrayDestroy(pvNames);6 J/ A9 q. a+ m: k  ~6 C
                iEnumIdx++;
! E- J# h& e& X  a# ~               }& n8 u" F/ H4 d, }# F- f* ~
           }
) t; f3 [5 L1 Y           if(pClassObject)pClassObject->Release();" _$ e2 T" x6 O9 }" M! O# l
        }* y; O. v0 V5 }$ ?
       if(pEnumClassObject)pEnumClassObject->Release();
: `+ \# |9 }9 v& x      }
, Y# ?' _! ^. }. C     if(pWbemServices)pWbemServices->Release();
5 @( a* X; x0 f  K0 K   }
. h; m% V( z0 s( u  if(pWbemLocator)pWbemLocator->Release();, I4 W0 I9 U" ?) Z
}
7 f+ ^. N; L( U& d1 M* w//---------------------------------------------------------------------------
/ u/ g$ [" r6 x5 C# s8 R8 h4 A
# {) D5 [1 _$ ~8 z// 通过 WIN32_bios 获取 BIOS 信息:
- A" M5 g1 {/ \8 nvoid __fastcall TForm1::Button1Click(TObject *Sender)" @7 y3 @5 i4 K5 [- X* C+ P
{
' a* ?$ O0 J- U    Memo1->Lines->Add("================== [WIN32_bios] =================");
+ |) [  ?3 F6 ~, Y: `6 ~    GetWmiInfo(Memo1->Lines, "WIN32_bios");
* J) ~; ?2 Z. v    Memo1->Lines->Add("");
% B2 U5 q! e2 H4 `9 b# e6 [: D}) Q" t  {/ r& S1 [" u

6 m6 c+ e: N2 q( j& o2 w--------------------------------------------------------------------------------
1 @. ]: k. W7 K7 g8 Q8 H0 ~4 ]) d. R, p3 V
WMI 可以访问的信息类型有:4 V/ @. j7 }2 @, H  o) s' d
  Win32_1394Controller' w9 R' t+ @( t# k1 {
  Win32_BaseBoard
3 W! E% e2 g- f' u* P! b2 f   Win32_Battery
" J$ h, n5 z9 W" _* Z1 ~9 m   Win32_BIOS8 X- l1 q" v1 k9 J, X7 u3 A: j
  Win32_Bus. @' V; E/ {7 _
  Win32_CacheMemory
; }+ e% T' w( z, ^( c. r, C8 v; `   Win32_CDROMDrive( `" C/ Z/ o4 A/ c% L6 [7 a- \0 j
  Win32_CurrentProbe# }4 Q8 l/ _+ b( b  F
  Win32_DesktopMonitor
$ ]( Q. d8 w4 q& y; ?   Win32_DeviceMemoryAddress
, L" }% m: M1 |: s* R0 E   Win32_DiskDrive: V" R. w3 K. n3 y) l( ?' b: g
  Win32_DisplayConfiguration
! s3 k  L* r6 J* ~6 s+ \   Win32_DisplayControllerConfiguration
( C/ e1 h2 U: C- N. g" E   Win32_DMAChannel6 E3 p' j5 }! }7 Y5 }
  Win32_Fan
( f; ]& ~, Z* h. t   Win32_FloppyController
" ?& e: L/ t9 T# X2 @$ [  Y8 u, B+ U   Win32_FloppyDrive& g. a, E/ _, u' L5 ~7 ]
  Win32_HeatPipe
& Z9 [) h; K7 x6 U. r$ i& C   Win32_IDEController1 A- h3 X+ {6 v0 K: t# V4 z
  Win32_InfraredDevice
+ w) e( Y: e* a   Win32_IRQResource
) ]; E7 o' y+ }6 N0 D1 I. e   Win32_Keyboard
) Q  f0 q, C& B. r   Win32_MemoryArray2 ?  O% _1 p# l/ ^
  Win32_MemoryDevice) C5 f/ T3 ~, T1 \
  Win32_MotherboardDevice" T' _% n$ n- l4 U  E; Y' H% B
  Win32_NetworkAdapter3 l! V: U0 J  T2 @
  Win32_NetworkAdapterConfiguration# ]1 E9 ^) A. c( W- C0 w0 {$ U6 _
  Win32_OnBoardDevice- X- J  t0 s3 \9 _" x  v' \4 ~
  Win32_ParallelPort
' r  M3 C# |* ]( @  ^/ V# g1 {   Win32_PCMCIAController
8 f4 u8 V8 n8 a& x% D   Win32_PhysicalMemory
) J6 x3 D% N+ N$ V   Win32_PhysicalMemoryArray7 V  B* m7 H. C2 e8 R, Z/ M& l
  Win32_PnPEntity
5 n$ S+ K9 A) m' t; Y! Z   Win32_PointingDevice
8 `' j/ w+ T8 O/ g" M% w; n/ b, a   Win32_PortableBattery
9 r; d* m0 Q$ A1 a3 N   Win32_PortConnector
& L2 X" [& z1 F  Y4 l   Win32_PortResource" ~9 l2 b, P) B+ C  s, ~
  Win32_POTSModem
4 m- E6 m8 w3 R2 d/ ?   Win32_PowerManagementEvent
9 p- @* x3 j* v9 E7 m: a5 l   Win32_Printer
+ o; M, n4 X- b+ f7 `   Win32_PrinterConfiguration
1 ]( z: p# Z& m( @   Win32_PrintJob/ E3 N: c0 f2 h
  Win32_Processor1 j! u, A  R4 |1 L) {
  Win32_Refrigeration+ N) M9 y2 h) O
  Win32_SerialPort+ }( K" ~5 C9 u- Y. ]$ o
  Win32_SerialPortConfiguration  y; C' D: Z% `/ Y- z
  Win32_SMBIOSMemory
; K4 l$ P6 [* V! a   Win32_SoundDevice
: V# l! ^$ a3 I   Win32_SystemEnclosure* J0 N3 G" s9 ~# h* I
  Win32_SystemMemoryResource
! [. ~/ e/ ]( n. L   Win32_SystemSlot
+ Z$ h3 J5 u* L! _! c   Win32_TapeDrive
# L* d5 z) z/ t' y6 ]. D   Win32_TemperatureProbe% G1 p2 ^  v6 M  v. |, c, k
  Win32_UninterruptiblePowerSupply; v  O0 c6 ~2 P! Z
  Win32_USBController+ a: ]% [* X+ [2 Z
  Win32_VideoConfiguration
9 j; _; ~( E  N% v' K   Win32_VideoController0 H4 v  e* @9 R' N) Q
  Win32_VoltageProbe0 s2 a8 w  x; D5 T! V9 T

) w+ G* ]4 q( V4 D3 [, h0 @以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-9 10:14 , Processed in 0.019449 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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