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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
! |7 O( W# [5 c2 @1 j/ ?! G
" x; j' q( Q! P+ O' n# B5 Z- T: {+ `! P. s+ m( F
--------------------------------------------------------------------------------
" e/ T9 j4 ^" L! m5 I3 cWMI: Windows Management Instrumentation (Windows 管理工具)
8 A2 n# v4 @8 q$ `   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 . z4 j$ p& e# z; y
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
5 @& ~( O& v9 S- {5 z% L   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 6 c! L  @9 `5 y$ ~6 n7 g3 H
" R0 Q. }% a/ d8 p
--------------------------------------------------------------------------------
+ U: k4 {" g9 l4 s4 Q* BBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
! n, C  E$ b' p6 J; Z2 K. ^
( g; T! E5 z* p  j# V: g* \--------------------------------------------------------------------------------
) p& n- Z  F( a4 H" o2 s3 R" X① 初始化 COM 接口:7 Z0 U0 [$ \0 ?) z3 f) Y9 C
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。  E0 F/ v! l9 ]5 O$ `0 h$ _# E# H: y
  这两个函数在 #include <comdef.h> 里面定义。
+ r7 b0 j8 U8 ^' n4 W8 {; Q
6 t2 [* ~' w2 {3 I# b7 ]② 获取访问 WMI 权限:1 b' a- E& L4 b9 a8 L* `) \6 k7 a
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);5 }3 l1 R' L3 d/ t7 a$ T
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
% ]- P* H" \) |+ U4 k; m; ^" a) u
" |- C3 j' j: a) n1 e! V0 C③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
. D' e, H1 M# x' {   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。; }2 d1 O+ Z0 e4 ^, ^
- V& \2 K- j1 m0 P2 F
void GetWmiInfo(TStrings *lpList, WideString wsClass)+ ]0 z/ V  X% I; P* |  W) a1 y, a
{
2 K9 q6 I& r! U3 R  IWbemLocator *pWbemLocator = NULL;( a  I+ R+ Q. K- N# s
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)+ K" \/ A9 u, g/ v
  {
. m: `/ {+ n9 h3 t     IWbemServices *pWbemServices = NULL;% Y8 U2 K1 ~/ v
    WideString wsNamespace = (L"root\\cimv2");
/ H, Y/ Q6 d. d6 g8 d8 w: ]     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)6 M+ O+ T, t4 A; s
     {' y/ H. s' J  _6 A( P
       IEnumWbemClassObject *pEnumClassObject = NULL;1 _0 M, I7 o3 R3 o" U" d
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;' b) ]4 B  M  W! [
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
) v! W7 O# J' N7 E' T0 H1 O         {' j4 Q' y5 d7 P: e, {2 u' x
          IWbemClassObject *pClassObject = NULL;' z) Y2 e# H6 ^2 D1 t
          ULONG uCount = 1, uReturned;3 ~" h* j% ?' |; I5 ]6 M# \
          if(pEnumClassObject->Reset() == S_OK)) I* F/ }% |" i
           {
9 @; |( j7 K# q              int iEnumIdx = 0;
5 v% l& Q+ ~; a9 [7 I  I  S              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
# y( o6 |/ ?# s& C               {4 i1 s2 L- i' O! J
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
! {! w5 E7 G5 b  g# t7 ~8 k  C0 X# v
                SAFEARRAY *pvNames = NULL;# s8 D5 l  d% S# e% ~* S; E
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
$ q* A: [: N: g6 i5 n) _' k                  {" x3 ~5 S6 S- i: o9 R
                   long vbl, vbu;
+ }" G$ I  t. h  B) j! G                    SafeArrayGetLBound(pvNames, 1, &vbl);% y9 t! y/ E0 I$ v: z: S! J
                   SafeArrayGetUBound(pvNames, 1, &vbu);
8 l' p3 y( [/ M& c: g- [- r+ D                    for(long idx=vbl; idx<=vbu; idx++)8 m% r( r5 Z) c* u+ x& F2 Y
                    {& V9 g, d- x8 U: p
                      long aidx = idx;
! V4 ?- n- S7 h" s3 n: Y                       wchar_t *wsName = 0;- q* n/ Z4 H4 e$ c$ C' ?$ U0 ]
                      VARIANT vValue;
6 n% t; W; B' c                       VariantInit(&vValue);
3 }$ V. Y. K4 A/ A8 M& R( R                       SafeArrayGetElement(pvNames, &aidx, &wsName);
7 y, b7 f' t& q5 a9 A8 L) ]0 e0 H% p, C3 r: z* F
                      BSTR bs = SysAllocString(wsName);
0 `3 C: ^8 [( Y0 k1 Z                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);: W; ~9 K- \. Z' t2 d1 G
                      SysFreeString(bs);  ^# ^% q# k4 a/ u  R+ }, \

' F+ B, p$ x9 B) g& H) \8 y                       if(hRes == S_OK)$ s+ X4 {9 ]" e
                       {) _* j) A  F: P% f) K
                         AnsiString s;
& r# [5 k6 N+ H1 X7 n                          Variant v = *(Variant*)&vValue;) E3 Z3 I3 i6 P; l, z
                         if(v.IsArray())
: p: o' z6 j. A, s1 u6 l: f                           {: o- {1 X+ Q, q' O
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++); j( I+ d3 b% ^: p
                             {" F  D2 A" o' h5 z% x2 g' ?# i) t
                               Variant a = v.GetElement(i);! O( S: r6 y: }% e: L) H* B
                               if(!s.IsEmpty())
5 y5 U$ a5 m4 O- ^  H; j/ R                                  s+=", ";
$ W0 d2 T) ]* X  S+ u1 K: C3 _                                s+=VarToStr(a);% i# m$ O: E) n5 [
                             }
, M- \( [9 a# l& d- Z" V                           }; N5 a$ q& K  x$ A& U  v
                         else
) I& g* R2 K5 Z! m                           {# c. @5 h, A, Y( S: W! L
                            s = VarToStr(v);4 g) E5 N% h0 O3 P# [! u6 I
                          }
$ l# ?4 e2 ?5 s5 l# `  h                          lpList->Add(AnsiString(wsName)+"="+s);1 y" u; e, N2 ]$ i! |$ _3 D' n
                       }. ?  r4 z# d/ I0 ?+ s: R

' n9 O. z* a' |( }( P+ b                       VariantClear(&vValue);
0 X4 d0 \, M" a8 y                       SysFreeString(wsName);- [* m; M5 O7 z, E  [' F) r/ ^% K
                    }" {7 y% f' |) n" K$ ^7 i
                 }: S& T9 O; u0 ~" N% \( W; X; H
                if(pvNames)SafeArrayDestroy(pvNames);
0 O$ S" J2 W0 {+ g2 @                 iEnumIdx++;
4 b) c4 e% v# \; T7 `7 V               }
* `* N  l2 }7 f1 p, C  I% i            }
3 V" {3 i- L# r9 {5 ~, O           if(pClassObject)pClassObject->Release();- j, V; x# U7 o0 T+ ]6 J
        }
. {; R& O# z$ s        if(pEnumClassObject)pEnumClassObject->Release();
8 g: M0 Y( K8 g5 b/ E* x- f      }$ q1 e, @4 {" d3 F9 ?6 ~
    if(pWbemServices)pWbemServices->Release();. y# B; l# V0 a% M
  }$ L2 k3 d% [  e* S9 o
  if(pWbemLocator)pWbemLocator->Release();
3 P; Y" c  n* \2 B' p% a}  ~0 @) a8 N+ y; J: O" t$ ]
//---------------------------------------------------------------------------
1 H% g6 w, u$ M5 f. x
4 U) L6 {5 B9 V3 x% d$ x// 通过 WIN32_bios 获取 BIOS 信息:
6 r3 @3 U* L( d8 e' Svoid __fastcall TForm1::Button1Click(TObject *Sender)
5 {8 x; k# @) I8 q9 o1 L, ~1 j{& x8 ]! i9 a& @# a, t6 f- Q3 x3 I
   Memo1->Lines->Add("================== [WIN32_bios] =================");
5 k: o& b2 ]6 @. T# F, S    GetWmiInfo(Memo1->Lines, "WIN32_bios");
3 b' [: v) U8 |5 E% |- X+ R; Q    Memo1->Lines->Add("");& O0 b1 P- i' H2 v$ ]+ |
}7 d( U% y) [* w& J. e
8 P& q* t* r6 |, ^6 _5 u
--------------------------------------------------------------------------------
( k  }- k6 [7 `- T& f2 h, E) E, f5 d5 s% p
WMI 可以访问的信息类型有:
6 P* T+ U. B" p   Win32_1394Controller( F5 a- b% X4 g" F/ y; s! ]
  Win32_BaseBoard
7 E( B7 g2 o0 W. K. |3 |: R' C   Win32_Battery. J3 P2 i; @8 P9 |
  Win32_BIOS
3 [: U; q# v- b  K   Win32_Bus5 X, O! [4 j  ?+ z3 N
  Win32_CacheMemory
* _  i7 l$ O# r: ~$ p0 @   Win32_CDROMDrive& w7 b+ t' ~  x6 u6 L
  Win32_CurrentProbe3 B3 E+ _3 Q; L0 D0 a! ]
  Win32_DesktopMonitor
% @- g3 s3 c8 {. D8 m% i   Win32_DeviceMemoryAddress: _- v# q' g' C7 l! Y
  Win32_DiskDrive
3 G, s! j3 h) I  t, {5 z   Win32_DisplayConfiguration
# M9 }' @2 o2 L3 f( Z6 }. y   Win32_DisplayControllerConfiguration7 B' ]7 _9 A/ r
  Win32_DMAChannel. ?6 [8 T  @- D  ?! E; t3 [. E, ?7 f
  Win32_Fan
+ m+ ~* g' Z9 I+ H   Win32_FloppyController
% D! K+ O6 f+ t+ V& {$ E+ O   Win32_FloppyDrive- J4 L9 b' f( c2 {9 X6 _+ N
  Win32_HeatPipe
! q+ ?: a+ r4 g  x) C; I/ L. w   Win32_IDEController
1 I# V( j+ E8 V0 Z4 {   Win32_InfraredDevice% ]0 t$ H3 M: I( |! n
  Win32_IRQResource) `% a- z$ o$ D: r- [
  Win32_Keyboard
" U- c! O! d8 R+ a   Win32_MemoryArray: n3 C- u# g; T+ e+ I+ j
  Win32_MemoryDevice
4 r) M8 M) J9 l   Win32_MotherboardDevice
- m$ j" Z  ], w   Win32_NetworkAdapter7 M, Z( i( e3 a7 G+ ]
  Win32_NetworkAdapterConfiguration2 D" j4 j8 }* l8 ]. ~+ j4 L6 y
  Win32_OnBoardDevice! D1 E# |6 z- E* y; X/ w
  Win32_ParallelPort: I- E& e% ^( L" o# X  S" I
  Win32_PCMCIAController
8 z7 {' @' i3 Y1 Q- P% J( K   Win32_PhysicalMemory
' f# y- q6 H) w2 S/ h' f   Win32_PhysicalMemoryArray& N: c( q, p0 G( T! h( {& {  v
  Win32_PnPEntity! G1 O9 E( ?: Q4 n: {7 R* ?
  Win32_PointingDevice
! q7 t; N3 [7 V$ Y- g8 R" U   Win32_PortableBattery+ `4 ^% ]0 Q5 l5 q  g6 X; G
  Win32_PortConnector; {! z0 q+ N! H1 i
  Win32_PortResource/ [- ?4 x" `& g6 V
  Win32_POTSModem
2 c  n8 v' l) \5 k( e2 N! G* i, O   Win32_PowerManagementEvent
- k; l0 s; f5 J0 g9 O+ R$ L   Win32_Printer" F4 Z) m1 I: F: {
  Win32_PrinterConfiguration
1 n& J. x( N3 i* X  l* ^   Win32_PrintJob2 K/ n# ^7 l0 l4 ^# |" T( D
  Win32_Processor$ ?3 r) `# |$ B$ A0 u
  Win32_Refrigeration* S7 k5 v5 D7 k& i' b: _- q
  Win32_SerialPort
5 Z; x5 T3 E, |8 }2 m; {; k. p   Win32_SerialPortConfiguration
3 C; ^' o" `2 T! v1 ?, G8 i5 }" z. m   Win32_SMBIOSMemory( `0 C! B2 V' A* P: j/ }. w
  Win32_SoundDevice4 ?  z9 A: P0 ?# l! l/ S
  Win32_SystemEnclosure
4 t* C* C; `) L* r; L$ s+ J' S   Win32_SystemMemoryResource5 k& R1 Y7 Y) X# [9 }$ R5 J; `! w
  Win32_SystemSlot. r2 O% Z% }4 O( ]0 @4 H7 q
  Win32_TapeDrive
) Y4 _! A1 G: O9 `+ I2 O' ?   Win32_TemperatureProbe
; s8 k. {' T; O9 s- U8 w   Win32_UninterruptiblePowerSupply
: ~- E% {4 P' h2 z6 Z' `   Win32_USBController" j: C0 f1 B6 s4 l9 X6 o
  Win32_VideoConfiguration" i& u& a7 m& K
  Win32_VideoController. u" V' [0 y- h# A. w; f6 }: R2 n8 a
  Win32_VoltageProbe
: o* O* ~! O) [) |: ^1 i  ]
; l: M/ P: p/ N2 m以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-2 20:35 , Processed in 0.016429 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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