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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
- _4 w+ d8 c  k3 S* }# ^6 P$ |
( ], e6 n' Z$ @" e5 t8 N9 l6 [! f4 r% ]1 S$ v3 s( ]9 O
--------------------------------------------------------------------------------+ q* X8 `- A& I. B+ j" Y$ m2 g" C0 q
WMI: Windows Management Instrumentation (Windows 管理工具)' g0 [  U  c% W* u# K% W6 x2 J# p3 d( l
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
+ k( ]% C, D+ P# C3 [- a   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
# A% _! I3 p4 [; L   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
" p9 ]+ Z# {9 w" B. n# }2 w
$ x4 x' o7 q: T1 k4 }5 t; }--------------------------------------------------------------------------------# h* ~" e/ }' D8 K! X9 Z
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面; {/ Q% g, L, v& `+ Z

2 X/ D- g8 A. s- u# b--------------------------------------------------------------------------------; u$ G. u. r" W( @
① 初始化 COM 接口:7 M1 f0 d- e- _4 z$ k3 ]9 g
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
4 i, L1 [( T' o   这两个函数在 #include <comdef.h> 里面定义。7 u! Y5 f( h8 G6 L7 G, d
/ J# S. p4 r3 c3 C2 j3 g* }
② 获取访问 WMI 权限:" H' g6 i/ Q9 p& ~+ n  p
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
7 E6 J: I- f' z8 C   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
' I9 ~: s3 Z0 s
9 S! j; G' \/ D; y* n9 @9 z③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
6 P1 G$ g' ~9 y2 i9 }+ d3 W' F   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。: A" S8 T; P$ _; T/ r

* x4 ?% w. ]9 K' }void GetWmiInfo(TStrings *lpList, WideString wsClass)5 a# ~5 f& J: c1 M/ C* `7 C
{
+ x, P8 f$ A0 U4 D, Y" K  IWbemLocator *pWbemLocator = NULL;, V7 u" X$ F, M0 ?0 Q
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
  m0 f; i1 q# i6 \  {* {% Z/ W. u* H   {& I* g$ K: B# K+ X; S
    IWbemServices *pWbemServices = NULL;0 F0 t# q* Q) B
    WideString wsNamespace = (L"root\\cimv2");
: i1 p2 p/ R* w1 {     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
, c+ [5 B9 I+ q3 P) Z; X" Y      {
: @- n8 t8 K7 O+ y' d+ Z        IEnumWbemClassObject *pEnumClassObject = NULL;
9 @) ?& i; |4 V  q" ~4 O        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;/ j/ ^3 _6 V! z, G8 T9 T
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)% t3 F% t# V- g# n
        {
! j, u: c, z0 J           IWbemClassObject *pClassObject = NULL;% I, k' b5 R  A( q# `2 e
          ULONG uCount = 1, uReturned;7 j& i, m* F" ~
          if(pEnumClassObject->Reset() == S_OK)1 R$ F, @) p4 b4 s
           {
+ f. p2 j5 l0 ]$ V              int iEnumIdx = 0;
: t+ @' W) B9 G/ m- }              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
: t; N9 C6 R9 r6 O% s               {- j( {  j0 H( n' u6 j3 I; y  z  e
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
* G: y/ t5 A5 e  n  G
. ]! U8 X  I) \5 o0 v( I& w                 SAFEARRAY *pvNames = NULL;
% z. ]$ ?9 p8 S                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)4 @& c8 O7 {0 w: @$ [; J
                 {7 w# z  @* c$ f. T+ L; y% W+ l
                   long vbl, vbu;
% m' H) `* `5 O  o' }                    SafeArrayGetLBound(pvNames, 1, &vbl);
) U8 _: D1 `2 D' \                    SafeArrayGetUBound(pvNames, 1, &vbu);
9 O" ]' Q1 y; C; r                    for(long idx=vbl; idx<=vbu; idx++)/ d$ T  @( J2 ?% e# d# Q5 m
                    {
3 U+ a$ a- O6 P0 B. g                       long aidx = idx;. O$ X5 M4 C1 y- v: j* U0 M
                      wchar_t *wsName = 0;
3 V# \" ~7 Q4 c                       VARIANT vValue;
+ T1 ^1 G, H, o+ A2 H+ i5 B) S. J8 U                       VariantInit(&vValue);
  z4 x4 O% t' c                       SafeArrayGetElement(pvNames, &aidx, &wsName);( f2 F6 A4 p: r. g& D" g* f
8 [4 H% p9 a  C  }
                      BSTR bs = SysAllocString(wsName);7 @. p2 S: o  D% I9 g, _
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
/ g% }4 v% F# r& K0 u) q  r0 b                       SysFreeString(bs);
5 g/ u7 Z6 k" M. w0 K) ~# ]- @/ a
! V+ ^0 S- f0 u: e1 D% V                       if(hRes == S_OK)
" l3 E# z8 B5 |  N6 L* U                        {3 x& }, L4 R" x
                         AnsiString s;
% ]' N( I- ~/ M0 h: N0 p' _                          Variant v = *(Variant*)&vValue;
- I3 T9 {, ]( E3 r6 W3 X' [                          if(v.IsArray())
0 H& }6 w$ {! M+ c: O& d) K                           {
9 o& m  X% W, T+ r                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)# _( o- J9 C1 v6 G8 t9 c! A
                             {, d; j0 @$ @. L# L9 ]/ V
                               Variant a = v.GetElement(i);2 m* [' P+ n! M  Y
                               if(!s.IsEmpty())
: }. a2 X8 N* \* v                                  s+=", ";
9 A, m0 K4 o- u4 m                                s+=VarToStr(a);, Z- Q0 L/ N8 l& ~
                             }
" s; b0 k5 C; O9 \                           }0 T0 ^; k3 ^  a& n
                         else
4 v, v2 x2 W( Z. j5 r; @1 ]                           {' `$ i* B: ]9 u+ z) `! Z
                            s = VarToStr(v);
. M2 R: p. q/ `. b% l) x, U* b                           }
! J! c- |9 `% B7 D, O  i9 t                          lpList->Add(AnsiString(wsName)+"="+s);5 b1 ^. o- v3 a4 k# p3 y
                       }! w$ F8 R) i+ R7 b  `& {' ^

; a5 j* R; i  ~                       VariantClear(&vValue);& I2 P1 k' h. F+ v0 m9 \" x6 h
                      SysFreeString(wsName);
  @- E5 X0 y; a, g5 g                     }
( _9 K# Q: A% ^3 V) s) ]- E                  }+ K7 S  F- v) X' H
                if(pvNames)SafeArrayDestroy(pvNames);
0 M/ ]" }  V+ H# I* t4 X                 iEnumIdx++;
3 J6 q) r" S' M7 `+ g( ]! d               }, t9 B- J+ P- X
           }
$ `9 _' u' e: O6 m( q( a7 N! e) n1 `           if(pClassObject)pClassObject->Release();+ [& t0 R7 M, c; B! d7 O9 d
        }# L) L1 \. G' B. Q2 |
       if(pEnumClassObject)pEnumClassObject->Release();7 R8 J, S& D  G& a- u) n
     }2 @: R& O5 O$ |  v# `5 P
    if(pWbemServices)pWbemServices->Release();: N) q8 E5 ]: y8 q
  }# t2 t/ _3 c! d0 x3 h9 G& K
  if(pWbemLocator)pWbemLocator->Release();
# |  }: c3 w7 R; v}
2 {9 }$ T* Z2 P& P$ O//---------------------------------------------------------------------------9 u% W. Z8 \0 p6 W! c5 A3 |7 h+ I
  d* l) Z7 ^) `9 l) l4 C! H6 K
// 通过 WIN32_bios 获取 BIOS 信息:
1 N) P' a# `" o1 bvoid __fastcall TForm1::Button1Click(TObject *Sender)
  d$ z' y0 i3 ^5 S* n) S2 F) y7 w{
4 l2 R- M% u4 j8 t) C6 q* {    Memo1->Lines->Add("================== [WIN32_bios] =================");2 y5 L/ U2 X# J8 ]: v
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
" W3 f' u3 d' S- i8 W    Memo1->Lines->Add("");
/ P: t; x2 ~/ O: h. }}
0 m) P0 ?4 u/ I7 ^8 H6 t8 m( C6 Z
( Z, [) r8 G4 T  M2 m. E--------------------------------------------------------------------------------
* j/ {( Q6 H% B1 Q2 d0 L+ R& |4 I+ F# V# p+ @. I( d% G1 Y+ S: K
WMI 可以访问的信息类型有:
( k) |$ d- Z  z   Win32_1394Controller
8 k; s( I8 E0 S/ C8 I) R   Win32_BaseBoard9 U+ R. T. `" u3 ~
  Win32_Battery' H1 D" h; B( k. w. Z
  Win32_BIOS
- v$ D6 L7 i2 T5 Q# w   Win32_Bus3 Q% n& b/ @3 ~+ x
  Win32_CacheMemory) X5 ~9 S- P' _0 ~( O3 y2 |
  Win32_CDROMDrive7 B+ Z, G" `' W. j
  Win32_CurrentProbe
8 q6 Y+ Y" w" i+ s7 w$ F8 T; z) I   Win32_DesktopMonitor
* @: U4 N& o4 u  s* m/ M+ |+ x6 L   Win32_DeviceMemoryAddress
9 H6 i6 F' J( K" F   Win32_DiskDrive
2 P/ \9 A- B0 I" Q/ [: P1 p$ U" w   Win32_DisplayConfiguration
, B3 i4 i/ ^1 w# G1 k1 `' d7 _   Win32_DisplayControllerConfiguration0 x( }5 [/ U4 E* D% Y! |
  Win32_DMAChannel
5 p/ [7 \1 P' m0 p$ R" C( a   Win32_Fan
: z8 A, z7 d" c" c( H* M   Win32_FloppyController1 v* |! i7 D1 p, I8 K  g
  Win32_FloppyDrive
& O. Q! Q8 V2 V( |! l& c3 C   Win32_HeatPipe
# }" U: D4 _+ ~2 }1 Y* M( T2 B: D$ z" y   Win32_IDEController* q) [! y) R1 ^) j+ t
  Win32_InfraredDevice
# @2 n% B$ F/ {   Win32_IRQResource
8 p, w. z$ F; _5 Y! r   Win32_Keyboard
0 N6 u5 x" s2 w4 ?5 b   Win32_MemoryArray
# z' R, R7 K0 o. I# W   Win32_MemoryDevice+ O$ x. J0 E7 N* M
  Win32_MotherboardDevice
& \% X" b& @6 @6 B2 v   Win32_NetworkAdapter9 J; B  Z3 j# j- L9 V" ^8 F
  Win32_NetworkAdapterConfiguration4 i; I% @! O( J: k1 i; E  ?4 r
  Win32_OnBoardDevice
+ a: k' V- l6 J( l; S7 ]# U   Win32_ParallelPort
# H9 F* k- [, P: K   Win32_PCMCIAController, u: r/ F5 L! c/ z
  Win32_PhysicalMemory
2 r/ }0 p: q. S+ _0 u9 k9 e3 a1 h   Win32_PhysicalMemoryArray, s/ Z7 l, ~. ?$ i
  Win32_PnPEntity
+ l& w7 d: P# s. I: h! b* y; Z# u   Win32_PointingDevice
1 b, S  D/ M3 W3 _' [9 f   Win32_PortableBattery
5 e6 M( q" Q  q+ [( A: k& H' W   Win32_PortConnector
" X) O4 V0 S9 P" ~; w) v4 D7 Z% R; A   Win32_PortResource
9 x' P2 |6 \" m  J   Win32_POTSModem( ~& J0 Q9 H$ c1 K& p; ]& |
  Win32_PowerManagementEvent
$ n9 a! l- t$ s' J2 X   Win32_Printer
! }% ~- I4 [7 b) E   Win32_PrinterConfiguration1 A- T0 T, k3 X/ z+ ^! ^
  Win32_PrintJob9 m. E) v4 T% I. W6 g& T
  Win32_Processor9 B0 R/ L; E. ~6 J: S& q# q
  Win32_Refrigeration0 B/ }0 e6 t0 U& r) U- m
  Win32_SerialPort
  I3 ?( d) C: l# a5 K/ j   Win32_SerialPortConfiguration; l5 o9 r3 G1 G+ j# X0 c' G  ^# E
  Win32_SMBIOSMemory
' J( w2 B9 q. [5 T# M7 _   Win32_SoundDevice% }# K7 I' y2 j0 C4 ^
  Win32_SystemEnclosure2 |8 [3 R1 w* ?  y! ^- J
  Win32_SystemMemoryResource
: s+ g  [- y& T# @' l   Win32_SystemSlot/ j" `- L' N% u) L0 P% D. U0 v( N
  Win32_TapeDrive
. @3 W* M  M4 t) X7 R8 H5 T, [0 G0 n   Win32_TemperatureProbe7 K5 ~; i3 F6 m$ ]7 D  }
  Win32_UninterruptiblePowerSupply
8 d" D" k. B3 w( [) }4 y6 N   Win32_USBController
: U# M* t7 s2 p0 \   Win32_VideoConfiguration+ o9 j9 a/ m# Z% v5 K
  Win32_VideoController7 v# P# s) G3 X  m
  Win32_VoltageProbe1 L; S- M4 ~$ T1 @( s: i
. X% N# t) b, Q( F% C' d9 b* K
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-30 06:13 , Processed in 0.020206 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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