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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)6 l4 J5 P2 I1 Z5 j3 }4 [

' r7 @- W( D! _' q! n8 m
; X* s2 a9 u: p4 |--------------------------------------------------------------------------------
5 ]! u7 w' V) q& k% b. d6 {% |WMI: Windows Management Instrumentation (Windows 管理工具)1 i3 p5 m+ T5 X* Y& X9 ]! i
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 & R& i, r7 ~( n! w
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。: x3 o2 r- ?, d6 C2 o; {9 M
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 2 j7 r8 P6 n0 d; [

$ a+ m; D$ v$ h--------------------------------------------------------------------------------) Z2 o7 R, `& H* X. H& R' M- Q; j! u
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面" x$ X" g+ `9 M9 w1 ~8 q
" h5 w, ^" X" f  C/ m
--------------------------------------------------------------------------------* n7 Z. S1 }  B  q5 f0 r3 F
① 初始化 COM 接口:. o. A% O& |. q; P! B; W
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。$ i4 l, D$ C+ F4 F
  这两个函数在 #include <comdef.h> 里面定义。
6 }% @3 G$ l7 d0 ~3 W
- z7 o/ u! E8 h  P② 获取访问 WMI 权限:
- y7 Q2 g! S/ l# E6 w5 P7 s( K( d4 O   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);/ V) T2 a5 f3 Q) @
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。; P! I# C  z: Y' {  [: p6 I  a
) s. c: `: ]/ N7 t6 m6 d" B
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
; J/ W7 x. k& t   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。9 u. v3 ~4 O7 p  U% [$ _* Q4 M
7 j: C3 ~) b& |# {- A: j0 |
void GetWmiInfo(TStrings *lpList, WideString wsClass)
/ G9 S, ]- `7 ^1 C( F7 F5 c2 f{
; Y7 ~' L$ P7 j  IWbemLocator *pWbemLocator = NULL;
+ N  v# _# t# [# o. E  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
1 s: p8 K* O* A1 t, `   {
; Z  V# \4 V( l     IWbemServices *pWbemServices = NULL;8 e& f% I) H; ?- K
    WideString wsNamespace = (L"root\\cimv2");7 W' B  `" n' v4 `  d& o* Z
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
. |; T* j8 x4 Q$ N      {
3 m9 L8 G' L  a        IEnumWbemClassObject *pEnumClassObject = NULL;7 N$ E" g( Y2 S. K7 `$ @$ u
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;  g5 T; g0 q+ P
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
* n( p/ o0 s8 L7 Q" }$ H0 ^. N         {: }' H( e$ }: z! K
          IWbemClassObject *pClassObject = NULL;  N& F5 g. I$ Q) z( E; p  Y
          ULONG uCount = 1, uReturned;( B: p( L& T( T. w
          if(pEnumClassObject->Reset() == S_OK)
) X5 w; i5 [4 z+ Y            {8 }+ Q, P+ q+ ?: k/ O
             int iEnumIdx = 0;
4 i( X: Q! v7 b6 s  G" a              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
/ Q. X& X/ j$ q9 Q               {; z1 {" Y+ p% H5 `, V
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");9 u2 a2 s, `4 i& ?) w

% {# Z5 J" C9 C( l8 ^                 SAFEARRAY *pvNames = NULL;
0 f) v" @# A) o& u                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)! r5 g# z% s" r, u; ^: }
                 {; _& h4 l6 W& i: D1 d/ H0 z5 R
                   long vbl, vbu;, W- _' K# p5 o' j! Q' s1 Z) n
                   SafeArrayGetLBound(pvNames, 1, &vbl);
( V8 o$ f# V& W) U) R6 T                    SafeArrayGetUBound(pvNames, 1, &vbu);% `/ x1 Y* |) H/ q4 s
                   for(long idx=vbl; idx<=vbu; idx++)
) |  ~: r% U7 L5 ^+ U                     {
( r' |3 C* P- F$ s                       long aidx = idx;6 n5 u! I( g& h% B3 F) o' s
                      wchar_t *wsName = 0;
' @( o1 m: o$ o2 {6 _. v& Z8 V( m/ J                       VARIANT vValue;
+ m1 h8 i$ l6 u                       VariantInit(&vValue);" s# n# S$ R6 g3 O4 O
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
7 G& p/ h4 y, D* \' l- d* R4 N" u6 O& `3 f
                      BSTR bs = SysAllocString(wsName);
$ Z, F9 ]& B/ U, J& ^) ]2 R: d                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
( |. z# M! ^7 T+ Z$ N1 Z6 F                       SysFreeString(bs);& L) A' E& [5 a1 I
0 B' E5 |, p. B, |7 e  h: N+ ^
                      if(hRes == S_OK)
, R9 Z' c! g8 d                        {( s0 y. ]: R% f* K) ?! L9 y) n/ R& \
                         AnsiString s;
; a& m" S/ n" S# r5 g                          Variant v = *(Variant*)&vValue;
8 u7 {- q2 H' L" B                          if(v.IsArray())
2 N4 Q4 x! a% V: e3 Q$ z                           {# I1 g3 h, s% h4 |! w
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)2 a; T; g' F3 b( O
                             {
  \# c0 b9 s, J% l, [                                Variant a = v.GetElement(i);3 K9 }$ A: g( u- i* ?
                               if(!s.IsEmpty())
0 G4 X* @. Y, A% t1 \                                  s+=", ";. [# ]" v: }5 p& Y2 L
                               s+=VarToStr(a);* y, T, @3 e& r) h$ r/ o
                             }8 p$ ^- ~! M& }
                          }
3 Q- s7 y% r8 f! s2 b. ~( B4 f  b                          else1 X2 Y4 \$ X: Z0 l+ P6 p+ A
                          {1 o' m+ t4 ]% u9 L
                            s = VarToStr(v);0 H; s9 U, Y$ M( U6 _
                          }
# b2 j% \# i3 }7 ~( d  z0 M6 U: N                          lpList->Add(AnsiString(wsName)+"="+s);
! K  Y* I- l7 D0 |) w                        }( _6 k1 F5 O. ]: [: D
& @8 Z3 |( V; H3 x- [
                      VariantClear(&vValue);1 `  I; y, W6 v+ H
                      SysFreeString(wsName);1 u' I* F, X, k4 @9 D
                    }* V; _; `" H+ }8 ]% ^
                 }, S! d* C/ R( e: q$ s6 r
                if(pvNames)SafeArrayDestroy(pvNames);! j  p7 B6 u: n4 S( o4 n
                iEnumIdx++;
. B0 Z* B+ C! N$ Y" a# m7 K; P/ N               }
  A' @  Q# {0 b4 b# R) R            }
! e0 u  P' i% m. f           if(pClassObject)pClassObject->Release();
* n( z! _5 U( Y         }' V1 M* m. d9 r% s; S( i
       if(pEnumClassObject)pEnumClassObject->Release();
( W9 H4 a# d8 m4 V" X      }
* s7 i7 p; F8 S5 F+ y- A     if(pWbemServices)pWbemServices->Release();0 o! ~$ c" X2 t, Z
  }
2 S/ _6 A  p# l) d  ]; i- x  if(pWbemLocator)pWbemLocator->Release();1 m$ }, s$ z# I! [5 b
}
7 a% C# W# K) q- k0 v//---------------------------------------------------------------------------
% x# V! u( q1 ?: K3 c/ {6 o! U1 Q3 j% [9 b' Q. V* I! `
// 通过 WIN32_bios 获取 BIOS 信息:" m8 X: N& m9 [. z
void __fastcall TForm1::Button1Click(TObject *Sender)( X. k7 G% a% s; H7 s1 e
{
) n* ?, J' Y8 Q+ Q6 p    Memo1->Lines->Add("================== [WIN32_bios] =================");
! i7 h; l; g/ D8 r    GetWmiInfo(Memo1->Lines, "WIN32_bios");
: i; C; v, M1 |/ q" k    Memo1->Lines->Add("");- m) Y6 z% x+ i3 X, b7 ]5 E$ e
}5 \1 d. b* S5 ^% w4 G' ^0 E

5 P: u9 s* k, }( g, x2 D  ~--------------------------------------------------------------------------------% N6 u$ G" ^! ]  _; F4 x
1 G& G" l! o+ J+ ^% U/ y/ S; c9 h' [
WMI 可以访问的信息类型有:7 ^6 S5 P  ]$ ~3 k  g/ v
  Win32_1394Controller" K# `# B6 |: s9 @
  Win32_BaseBoard
- b. j( T% s0 @- o+ c8 T/ \' {   Win32_Battery
4 @% B0 \  z* ~" K/ b$ i. s   Win32_BIOS- n# b* P0 s" `% D$ C2 `1 k
  Win32_Bus! n& t# @: k: q" N4 _& O
  Win32_CacheMemory
* |4 [" N: k* [   Win32_CDROMDrive' p" o6 Q2 e1 A
  Win32_CurrentProbe
7 x4 o2 m+ d( g0 c$ t   Win32_DesktopMonitor9 [, a* E: Z) W9 J' Y' t
  Win32_DeviceMemoryAddress2 p+ r/ q: p  O/ b* l
  Win32_DiskDrive
! \. l5 j- r0 Z: \8 h* R# J5 L   Win32_DisplayConfiguration
# {3 I/ g3 J) P: Q   Win32_DisplayControllerConfiguration
: Q$ `5 v0 ~- V$ J# P, Z2 R5 x3 L   Win32_DMAChannel" B' v' v* Y6 W$ S4 M3 h" ]
  Win32_Fan: R: M4 h! J+ ?5 |% Q: N4 I
  Win32_FloppyController
# J; Y, _$ U6 W  A* W! }# W   Win32_FloppyDrive, L( J: N9 s/ g9 t8 a
  Win32_HeatPipe
; R3 G+ y* H6 s3 c$ A% A% N$ s& {   Win32_IDEController
9 L0 a3 f  F6 E   Win32_InfraredDevice. M1 m3 Z. z* K  O
  Win32_IRQResource
- |" j) F4 x6 X: v6 n" B   Win32_Keyboard
! G8 X1 P, h5 x3 k6 _6 G) T   Win32_MemoryArray
6 p% L* ~5 w  }- |5 g, w6 S0 C5 D   Win32_MemoryDevice
4 {; y. U5 w# V$ V1 z+ ]; j" m0 `- S   Win32_MotherboardDevice! W* X+ c1 G1 m3 q( e" g
  Win32_NetworkAdapter
& P$ u8 Z1 Y0 }# P+ r   Win32_NetworkAdapterConfiguration
0 n) }" [! z5 ~4 j3 l   Win32_OnBoardDevice
/ P6 |/ J1 a; h1 L/ ?/ ]! X% U   Win32_ParallelPort0 K8 v" ~6 R; J. k
  Win32_PCMCIAController/ L$ Q6 h) t) L+ ~1 g8 D) U: f
  Win32_PhysicalMemory6 z" U/ Z. n: z$ j* P3 P
  Win32_PhysicalMemoryArray1 V% G* L# \! N. c0 W
  Win32_PnPEntity: ^$ T- W5 e2 l/ V) _4 ^6 D
  Win32_PointingDevice  L$ ?% M* z3 J& c: K
  Win32_PortableBattery" c) b" _& n! E
  Win32_PortConnector7 j) V* F9 t/ L
  Win32_PortResource
! t/ q( F# Z$ z# b+ s, U   Win32_POTSModem3 H7 K3 W2 T( M& N+ J2 _3 J- T
  Win32_PowerManagementEvent
0 i" n" I7 E1 j2 G1 C- w   Win32_Printer& ~# _: Y7 I' e- W
  Win32_PrinterConfiguration8 o: b* V0 j  }7 j9 N+ B2 b8 X
  Win32_PrintJob
, R3 D# }' P  J   Win32_Processor
/ }* X4 L5 m- Z8 A7 F   Win32_Refrigeration
: D) T6 U6 u8 A2 D7 J: W3 n2 j   Win32_SerialPort
. [9 B' C% t! v# x, d4 [   Win32_SerialPortConfiguration) `/ W1 U) d) O$ M1 V
  Win32_SMBIOSMemory
7 S: }' d% n( Y1 n: P1 i4 ~   Win32_SoundDevice
* N4 v, _' r# c5 ~3 ^7 w0 G   Win32_SystemEnclosure) h* X- n5 c% ^3 F
  Win32_SystemMemoryResource
" S& f( F) B* v4 ^/ A   Win32_SystemSlot
$ ~3 b8 ^( e2 F( s; j5 U8 _   Win32_TapeDrive
" \* T% D2 h. v0 J3 S   Win32_TemperatureProbe- B  S5 i! b% J6 I/ Z% Z' n3 h7 m* M9 p
  Win32_UninterruptiblePowerSupply. M- b! @8 R8 @7 U3 |! B( r
  Win32_USBController
) M5 A- I0 ?6 d* W5 @4 Z) o. q5 Q: B   Win32_VideoConfiguration
2 [2 ~; ~) F7 }7 B$ D# q   Win32_VideoController
4 N1 D& v+ i3 F   Win32_VoltageProbe
* u6 \: N$ K& U; k& x' a( m
' Z! R0 u) b" \9 G0 I+ e以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-25 12:38 , Processed in 0.020154 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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