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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
( k& z  E' p  \7 S! X- R( A8 ?; c3 G+ U! o" R

: I+ l+ _3 j  \  W. s7 g3 |; |--------------------------------------------------------------------------------, T- s- W9 \8 u) n
WMI: Windows Management Instrumentation (Windows 管理工具)
) a4 s( N/ J- N( i4 n   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
) H2 j, A: F; A$ d  z; \   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
( M; n2 d+ C7 n+ r   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
& Y6 V/ G: n6 L) w/ S7 S# g$ Z: x  x2 L- t; H4 G' _/ h. o
--------------------------------------------------------------------------------* y% \* ]/ l. \& ^
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面) E1 f* Z# K3 L+ ^; q

, H) q- l; j' u2 c--------------------------------------------------------------------------------
7 v# |. E0 }5 Z/ P- T& r① 初始化 COM 接口:
; f2 |, s) t5 b$ d# Z2 x   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。4 O$ L5 n1 A% E$ s5 Z
  这两个函数在 #include <comdef.h> 里面定义。& {5 e$ w' N( K: }; Y  D

, M/ U% \$ r3 p② 获取访问 WMI 权限:3 S2 N% F* e$ x2 O
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
5 g( }; M; m# D0 C2 r" d+ i   如果这个函数返回 S_OK 获取权限成功, 否则为失败。' `0 ^. `( L" O1 W6 p& i! h

$ f/ ?3 R( @& ]7 _( u③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
4 z6 c" j$ u! J# r/ d1 w   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
( d' `9 V: R& Z/ G' E: Z
( T* G/ ]/ E: x: |+ q) h! Dvoid GetWmiInfo(TStrings *lpList, WideString wsClass)6 r: C' x( f* }; D* I% k0 \
{
1 {/ S4 P2 a% P$ f5 O  IWbemLocator *pWbemLocator = NULL;
) s% l+ K9 c* s8 P" O' U# p  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)& _, g/ i9 [' N3 v( ?" [
  {
' S* I+ \+ x2 f+ D     IWbemServices *pWbemServices = NULL;
+ }; S: m3 Z4 g     WideString wsNamespace = (L"root\\cimv2");8 J& z: B6 [+ _) A; Q
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
% i& _# s% N! O# b' R) E      {% ^! p* x2 ?5 E8 F$ n
       IEnumWbemClassObject *pEnumClassObject = NULL;
/ o& e4 Q$ M. X3 n: v        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
3 s7 r% i; A- Y" K$ {% M" v        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)  u% \+ v" E, @  D* P
        {) N: O6 i7 d" A# R  ^6 X
          IWbemClassObject *pClassObject = NULL;
" x# n6 c* C* @4 A! j; ?% o+ @6 M           ULONG uCount = 1, uReturned;/ L2 A* l; ]% y; i4 l
          if(pEnumClassObject->Reset() == S_OK)
0 k( Q! T. C5 P) Y            {
7 k: z& a: }* q- L              int iEnumIdx = 0;
; O0 [' z4 g8 s2 D1 y: m              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)# s2 D5 K% r' V- m
              {% }1 |2 |& E1 v# I) H5 c
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");4 Q1 }0 G# I5 @" C5 H! L6 F2 n5 m
( W. Q0 ]& V4 M# v9 s  _$ s
                SAFEARRAY *pvNames = NULL;
2 ~  t% u% O# k/ q% w/ |5 e                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
% L7 Y$ T" }( l                  {# r0 p+ M. n# k6 @" |  ^7 o
                   long vbl, vbu;' O( \0 @; q: m, e
                   SafeArrayGetLBound(pvNames, 1, &vbl);& p2 I, k- J7 \8 [
                   SafeArrayGetUBound(pvNames, 1, &vbu);
8 t% W) N* G+ U. q( @3 r                    for(long idx=vbl; idx<=vbu; idx++)
, F* c1 [/ k* r5 p, C' U                     {
& c( I1 h$ K2 n3 J                       long aidx = idx;/ v7 K9 \: C, V; l
                      wchar_t *wsName = 0;
. }% @2 n" T: I                       VARIANT vValue;, d. L2 \* q( j
                      VariantInit(&vValue);
) L  |$ L; Q: ~$ Q- G                       SafeArrayGetElement(pvNames, &aidx, &wsName);6 I$ b, Y/ C: R( S# g) ~# z

- L7 a0 N# m& X; |; h' L                       BSTR bs = SysAllocString(wsName);/ K9 s! i$ J4 Q5 `
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
( c4 L' F& K$ k7 O7 Y3 @& T                       SysFreeString(bs);
. I; X0 d. Q1 g( j- E* H: }
- k- }6 V- _: Y7 J: o                       if(hRes == S_OK)6 E0 d$ `& D) a/ p2 R
                       {
4 ^9 n, J) F8 V$ [                          AnsiString s;
" G; Q, A* N1 Z# ^8 _0 d                          Variant v = *(Variant*)&vValue;! a4 X+ f; q, e5 h2 O
                         if(v.IsArray())3 `* _! Y  S  Y$ z5 K8 w2 R5 e
                          {
1 |7 y, F; r5 f1 Q6 _. J                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)( K& Y! x2 m* A4 u  x  a0 i: l9 @
                             {) y2 J  @1 R6 L1 p! G
                               Variant a = v.GetElement(i);
3 g. O) {0 l3 R7 x: D8 O                                if(!s.IsEmpty())7 u4 p3 C* _, S, X. a. W) G
                                 s+=", ";
5 J1 m& I) G4 H8 S4 p- Y                                s+=VarToStr(a);0 z& t, g+ M% A, G1 ?) P9 X1 E) @
                             }
' d) W7 v; h" \, A6 L* H                           }! U8 N9 w- O+ G3 t6 d4 R0 S# t
                         else0 n/ y" {  x0 P
                          {' O1 x) H& B% ^( B( o* D5 A, n
                            s = VarToStr(v);
& r" w9 E3 M: k                           }* _6 A, q, \1 M2 K3 [$ M& h
                         lpList->Add(AnsiString(wsName)+"="+s);
% o% h9 L$ i# G$ z0 U/ g% ^                        }7 b8 _  m& D1 |& Y8 }0 P: H

# k9 N/ B/ }) t; n& V, {                       VariantClear(&vValue);
* t/ m$ D% ^. Z9 a5 m) c                       SysFreeString(wsName);6 C5 S# {3 K6 z9 o
                    }% o6 C! n3 b; _1 Y6 E
                 }! ~" {$ S8 Y1 }# M
                if(pvNames)SafeArrayDestroy(pvNames);) i4 g  O+ h: }! |
                iEnumIdx++;
( O- k: C+ V8 [  P8 Q. h. _               }
7 V3 @% z# }4 r3 x9 e! G            }" S6 r# ~* w; p2 I6 I
          if(pClassObject)pClassObject->Release();$ T8 V$ j; H/ k) \( g6 C' ]
        }
/ f, k/ n, ]' n8 ]4 ^% l        if(pEnumClassObject)pEnumClassObject->Release();
& q- ]# l( f3 S, t( D+ O4 Y; B. j      }
& w( W/ _! k; R: q0 h     if(pWbemServices)pWbemServices->Release();2 j4 o9 i+ ?1 ^. q
  }/ [0 _* d4 d3 f) I0 X) d
  if(pWbemLocator)pWbemLocator->Release();+ T. z( K' B+ W0 o
}  x% g; O8 M. j% E
//---------------------------------------------------------------------------# P" B( }& k6 a

9 W9 b( n  S( l* I4 k- Z" o1 o, ?// 通过 WIN32_bios 获取 BIOS 信息:0 p3 h5 J2 D. i9 b8 B" Y! ?
void __fastcall TForm1::Button1Click(TObject *Sender)
& Q9 b: j7 P, s$ M{
9 O9 L! t% ]2 i2 ~: ]) K    Memo1->Lines->Add("================== [WIN32_bios] =================");
1 q0 f, A% y) _+ y    GetWmiInfo(Memo1->Lines, "WIN32_bios");
( b  M; d  J# m' S7 P8 u    Memo1->Lines->Add("");) a. B4 R0 j& X; V
}
# P- a2 X4 `* U1 i4 ?& ~3 y5 {+ [) I: l; D; O! S- K( o' ]" E* e
--------------------------------------------------------------------------------
* _8 |& [( K9 o+ }4 O2 o! A2 [0 T) ?: i4 H! \
WMI 可以访问的信息类型有:' x3 l! C4 s: i0 Y# }
  Win32_1394Controller
  T2 ]5 Y1 C& h9 R   Win32_BaseBoard
0 G& l. K$ P% g+ u6 X! C( \   Win32_Battery9 {& R+ l+ m4 T2 U
  Win32_BIOS
& Y, j# ~* Y4 \   Win32_Bus
6 a' X4 e* u6 }& n  v4 U   Win32_CacheMemory
1 H8 G& ^8 `- n; D* k   Win32_CDROMDrive
: A$ \  }4 u0 z6 t/ w   Win32_CurrentProbe9 L) P2 O4 G, @
  Win32_DesktopMonitor0 S4 {: @2 s) |1 S
  Win32_DeviceMemoryAddress
9 g, U: O( w3 P; m: T   Win32_DiskDrive7 B# T' `$ r+ ~5 [$ Q9 A9 ~& p- i, G
  Win32_DisplayConfiguration
% v( v+ ~+ B- S% j, l   Win32_DisplayControllerConfiguration
# g) b6 e( Q- x( @( W7 y# S   Win32_DMAChannel+ R: F+ b) b; A" L- r4 }( J: P
  Win32_Fan
8 W7 {' `* h6 [) O, }" `+ A   Win32_FloppyController
- e/ v3 l6 B/ j2 H) v) d% I   Win32_FloppyDrive
% V$ m: |/ C( c) X0 J   Win32_HeatPipe& W8 k- y5 @: I- n1 A+ J
  Win32_IDEController, e' g% T5 O5 _
  Win32_InfraredDevice# o9 i/ \1 i1 S3 r' z5 [
  Win32_IRQResource
* G4 |+ W+ }" o& t1 V- g   Win32_Keyboard4 _5 G8 u; r; M
  Win32_MemoryArray  m$ I% c4 ?6 b% h3 X
  Win32_MemoryDevice7 V& U& r+ M4 E" S* n+ [
  Win32_MotherboardDevice) V; k/ ]2 T7 G9 [1 c( t) @
  Win32_NetworkAdapter
, o! ~% s% |' @( V   Win32_NetworkAdapterConfiguration
! x0 I8 J9 S" k9 N6 B) q" U1 P8 P   Win32_OnBoardDevice( r% L' E2 g: r
  Win32_ParallelPort
1 W& f0 c/ g9 U   Win32_PCMCIAController
, g  a; j4 E1 a   Win32_PhysicalMemory  l1 M0 r* R3 R7 u) v) g
  Win32_PhysicalMemoryArray
& [/ T& G- y: A3 J; ]8 L   Win32_PnPEntity1 \/ G# ?! n  U$ T( [8 t) e
  Win32_PointingDevice
7 G, r3 q4 n+ ?( O9 ]   Win32_PortableBattery
4 H+ R' D. s/ P' L. X   Win32_PortConnector
- K( h: z- k: {; X   Win32_PortResource& z4 Q2 U# K/ T; u4 _
  Win32_POTSModem
- J2 I5 G7 `* _, C" E  _5 a   Win32_PowerManagementEvent8 n% k* f5 u3 v  d
  Win32_Printer6 e& J7 m9 c0 s$ ]
  Win32_PrinterConfiguration6 e4 F; `4 @% ]0 l$ d4 G
  Win32_PrintJob
2 ^3 R4 `4 @, i6 L! m( v% X: Z% e   Win32_Processor
" A! z- h; d& E6 S+ M( t6 T) H5 Z   Win32_Refrigeration4 }5 B- F2 n" R4 r5 M
  Win32_SerialPort
* S" u) V; ]% g$ G1 E( \   Win32_SerialPortConfiguration# y( n& h3 \, @
  Win32_SMBIOSMemory+ C0 [2 ~, y6 s7 I5 w6 D
  Win32_SoundDevice
* v' X* k# |) }* v   Win32_SystemEnclosure
7 F5 i! Y1 Y& c   Win32_SystemMemoryResource5 X: S: a; B$ b
  Win32_SystemSlot6 X3 J1 G9 j2 ]8 |! ~
  Win32_TapeDrive/ `! t7 g. i% |) J
  Win32_TemperatureProbe
' D% a+ j) Y, K/ l" m; ?0 h) ]   Win32_UninterruptiblePowerSupply8 Z  f0 g' t2 X% s# W
  Win32_USBController! ]4 _% J3 ]  z$ `9 f
  Win32_VideoConfiguration4 r* I" }2 H" d
  Win32_VideoController# a( n, {- \2 V0 b& I# q
  Win32_VoltageProbe7 M2 W$ `! Y& s7 r! d3 {$ Y
4 a! i3 ~5 t0 R, P
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-12 23:45 , Processed in 0.020981 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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