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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)# w5 ~# Z2 y2 ~/ h
( M# v+ Y1 g4 b4 t8 \4 F5 C
( }% G) \& O* C6 a( \
--------------------------------------------------------------------------------! |2 Z+ T3 ?' _; S; {. H
WMI: Windows Management Instrumentation (Windows 管理工具), m- Q4 ^/ e, i) Z6 r
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
" c( o: h# T* c2 \   利用这个工具可以管理本地或客户端系统中几乎所有的信息。. f: F  |& T) C+ m7 e
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
& x1 Y: W6 A, x: a# ]5 x: S( a; L. L* C! a1 O7 z) l% D
--------------------------------------------------------------------------------
9 u' n- t8 l, H5 hBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面8 H9 Y  f7 s. }7 X4 b% B+ \! Q4 c
6 P2 {" w& G& f6 w
--------------------------------------------------------------------------------
& o3 Q7 E  F* U① 初始化 COM 接口:( k& H- O& a) w5 P, K# E+ j
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
  Z. J$ f+ b6 W  O9 o9 K) S$ t   这两个函数在 #include <comdef.h> 里面定义。
2 `2 ^) ^+ @& A' j# K) M: r6 }; q$ m# J: Q/ v9 x/ R
② 获取访问 WMI 权限:
" f* {* q( x, z; T! O1 `   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
, R8 ]* D% M4 L2 u0 o   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
0 ~! X' l4 b% G4 g! c+ c) \1 _
0 c! J9 }5 x, N2 \2 K③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:3 L9 D" n% t+ M2 y
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
0 |- t) M/ [% ~  h- k1 ^, P7 t
5 m, w( v3 j7 d: Kvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
) O* A# u( w5 ~( o8 p% c{( Q" {) w4 w# G4 I# i
  IWbemLocator *pWbemLocator = NULL;
& w" F1 }7 |0 L  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
$ C8 t# W9 z: p" l   {  u% w% |$ g1 X' |  k+ W" H
    IWbemServices *pWbemServices = NULL;  {- W: T# f5 E0 T* W; k  k. h4 o- H
    WideString wsNamespace = (L"root\\cimv2");
& M: v' S% w4 ]+ a! V/ b     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
/ r/ }. |0 `9 T6 P% g/ O# G/ F      {
: R: w4 S- s) K/ Q7 X        IEnumWbemClassObject *pEnumClassObject = NULL;; O% y& P  e. f* n
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;% B/ y5 V0 ?5 M2 u  @3 X
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)- [. F% R7 ~5 J$ T, a# s, y3 d
        {
- {( a2 h3 O" E. S# O/ H, T" L/ U5 q           IWbemClassObject *pClassObject = NULL;
8 n" U% A% J! Z6 w1 P! y/ b: H           ULONG uCount = 1, uReturned;* j8 ]) d8 [1 b/ N8 C# [6 \. N
          if(pEnumClassObject->Reset() == S_OK)
$ L9 {2 A7 I: \0 S2 m* Z: K            {
, b( H" N- d3 j1 n  ]" E6 ]4 r' n: v              int iEnumIdx = 0;! K8 R) l$ D. K: h
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
7 W* r: @9 i) a* ?" `# D               {0 C( R7 O8 g% @3 Q- b6 n( J
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
0 J  W# C$ L7 `0 R( O" V3 X: t0 k9 C& c. q& k, P
                SAFEARRAY *pvNames = NULL;% E! E$ s- S- l. D5 [
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)4 g$ \1 e0 N" \7 Y6 S% \
                 {
0 Q/ X' c9 ?, F- @3 h2 c7 [                    long vbl, vbu;0 ?& y3 U4 n7 C( v
                   SafeArrayGetLBound(pvNames, 1, &vbl);
# j8 D. Q8 a" o2 @& W$ e                    SafeArrayGetUBound(pvNames, 1, &vbu);
( }% {0 H( v# P+ K                    for(long idx=vbl; idx<=vbu; idx++)6 D2 `& ~$ P  F- ~) Q
                    {) M6 J7 r+ K5 x9 e& ~
                      long aidx = idx;
  _$ [' ^  B" j) {# Y                       wchar_t *wsName = 0;
9 s+ @+ s, W& ]# \                       VARIANT vValue;
* W. m/ L9 m* p( h4 S( i' Y                       VariantInit(&vValue);
. S" q. S$ _- ]. B# W                       SafeArrayGetElement(pvNames, &aidx, &wsName);6 R+ T' T; R, O8 _6 b# X0 t

! }7 p/ |) i) U' p                       BSTR bs = SysAllocString(wsName);& _) ?6 j1 }) h
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
) t) Y+ y' I* a" Z, R; q                       SysFreeString(bs);
$ x0 y# k2 D& b% {" I+ W9 w# v
, g/ W5 q# {0 ]% G: E5 l& }                       if(hRes == S_OK)& Q7 l0 {2 q* B* n
                       {
7 t9 U1 b5 Q. D                          AnsiString s;( q" y/ T5 F' k" }, ^4 h6 y% i
                         Variant v = *(Variant*)&vValue;
# F0 S  S9 ?5 O  i# o1 L( {                          if(v.IsArray())
" W2 y1 D* `+ H- ]4 K/ f& P2 J' F6 |                           {
- J5 e/ }; \4 K7 Q                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++): g( {$ V8 b5 F- U8 ?
                             {+ ?6 y8 l# ?5 c9 H
                               Variant a = v.GetElement(i);8 U4 e5 w" y4 L0 y4 c. o1 H
                               if(!s.IsEmpty())
" k5 k( K: B  t3 Y/ e: c, g                                  s+=", ";
$ m) N$ V* u9 b+ H! f8 h3 y0 n9 p& x                                s+=VarToStr(a);
4 ^0 s2 A$ }# b( T( ^) C. [                              }
& a8 a4 ^3 l/ W/ y; m3 e                           }1 ~4 c5 x$ J5 F; v
                         else2 \+ ~" R9 |: z; N  G9 E, j5 \
                          {
3 O4 g6 ^$ g" n0 L) j9 D                             s = VarToStr(v);8 }' ^( _7 Z8 R7 o8 O: i
                          }! E) y. F; X# E+ X* E, A, \4 Z
                         lpList->Add(AnsiString(wsName)+"="+s);
$ l, l1 f; d# K8 \0 Z                        }) d+ ]( n0 S! B, D6 g, k% o
: T+ d3 w- F0 T/ W
                      VariantClear(&vValue);. D; |) `" q" |! h0 v; _" `; Y& U
                      SysFreeString(wsName);) r7 R7 b/ L3 D8 O: [5 o& {3 E$ i
                    }
3 ~# W  I' ]$ Y* c* }9 h% P2 J, x                  }+ m$ b- P/ z- E) b9 L
                if(pvNames)SafeArrayDestroy(pvNames);
& Z* M4 l" B: S: v5 \, w                 iEnumIdx++;
, G+ I+ F$ W- G6 M: ]3 R( g               }
) k! o2 T6 V4 T( }5 F4 u* Z            }
" w% H  I; v( k8 A           if(pClassObject)pClassObject->Release();
2 Z# C9 @" U! L* y2 E& K! V2 r         }
( C6 a" B8 y% n6 \$ i& {        if(pEnumClassObject)pEnumClassObject->Release();
6 U, S( r& K1 y/ o# @% w      }6 [; T& ]! b/ \! T
    if(pWbemServices)pWbemServices->Release();8 u3 J, g7 C7 }  l& ]
  }4 {1 |5 ~4 k$ a
  if(pWbemLocator)pWbemLocator->Release();; }2 B4 X6 X. f, J
}& D$ @2 U3 p" o. W0 f% V3 x6 L
//---------------------------------------------------------------------------
% i! j, X  F) l0 g
3 t2 `$ q% y) v& _4 N// 通过 WIN32_bios 获取 BIOS 信息:5 W3 H/ }* K* I- D; I! Q
void __fastcall TForm1::Button1Click(TObject *Sender)3 B! b" I0 ]: y6 w
{
, d. b2 Y$ J% F. u    Memo1->Lines->Add("================== [WIN32_bios] =================");
" F" F" B* }% b4 G3 U8 z& v    GetWmiInfo(Memo1->Lines, "WIN32_bios");
7 R. `$ k  [1 L) c    Memo1->Lines->Add("");. q, X  p: S- ]0 ?4 M  J7 K
}
+ n  k4 _& K2 B/ X% v
$ ^5 X* J3 d/ C0 Z--------------------------------------------------------------------------------
9 y  I7 z+ q' M# o: O$ O3 D
# Z9 ^4 l; i& iWMI 可以访问的信息类型有:0 W. T1 `. n/ X3 Q) F. c0 l2 T
  Win32_1394Controller
( S; z5 w$ D; ?. A( R2 t   Win32_BaseBoard* r  }% h) ]; q3 l, S8 z
  Win32_Battery
# ]" A) }. a( L   Win32_BIOS
* \' y$ D: {  x- k* \/ Q. S   Win32_Bus
1 `1 Z" g3 B. a* m, A! r8 l  U   Win32_CacheMemory
6 d) t; y" o4 N. l7 T   Win32_CDROMDrive; U( B  d5 _$ ~4 t7 {- r
  Win32_CurrentProbe; p- B4 G4 `& N% N+ X+ G5 j
  Win32_DesktopMonitor
9 v* j1 h# _0 N+ [   Win32_DeviceMemoryAddress$ E& S; ]3 I% Y5 X$ e# l  L
  Win32_DiskDrive* Y6 W0 p% `' c4 y9 `
  Win32_DisplayConfiguration
# A. i$ h6 w) v: o! k   Win32_DisplayControllerConfiguration
" x* D5 Y/ Y$ q  W* b5 H   Win32_DMAChannel
+ x& L% X& J6 c1 _9 w  c* h   Win32_Fan
5 D1 _' r/ ?0 [% f   Win32_FloppyController
8 g" X* Q" M6 {4 f4 }0 G   Win32_FloppyDrive( e* q5 k! ~) r/ a
  Win32_HeatPipe" F; n  H. K% T  F' D+ G, q
  Win32_IDEController
+ |9 i) \% h$ M! f$ b  O$ [9 ]   Win32_InfraredDevice
- f/ f) a( n, J+ x* S9 v   Win32_IRQResource0 X7 v$ z( _+ K% D& R8 S+ v) q5 u
  Win32_Keyboard- B  ~! S" E) i2 T1 e' X
  Win32_MemoryArray
. M$ H6 h$ W. k. N4 @   Win32_MemoryDevice3 d) T, \% o1 r' z
  Win32_MotherboardDevice
8 @+ y" Q8 @  o7 O   Win32_NetworkAdapter. w. y+ y) Z7 S6 _$ k' N8 q
  Win32_NetworkAdapterConfiguration+ t8 B) L+ ~1 {! s: y: w% h
  Win32_OnBoardDevice& c# a% l6 r1 x  ^5 ]
  Win32_ParallelPort4 z4 L( ^) t$ E, r4 c! l9 {. Z
  Win32_PCMCIAController
0 D2 L8 x4 O/ k' L   Win32_PhysicalMemory
" b$ n  t# Y0 p, T   Win32_PhysicalMemoryArray
& p. B- R8 s* D   Win32_PnPEntity2 Z0 y; _. s, U; w# \. H: s' [' N
  Win32_PointingDevice9 N3 a. Z/ T3 P/ N; h+ T4 D
  Win32_PortableBattery
: u4 `' e- X: l   Win32_PortConnector+ t7 ~( p5 h8 W  h- _/ O
  Win32_PortResource1 y3 k& ?% Q2 c' I8 e$ R  ?
  Win32_POTSModem6 b5 u. U; e( W" Y- b" k
  Win32_PowerManagementEvent
# H; Z& s0 N; v9 @4 R3 b  h( m( t   Win32_Printer/ T# u; V) e+ P
  Win32_PrinterConfiguration! `! Q: d+ j- T7 S1 A, }# y5 Q
  Win32_PrintJob
! m$ |: S4 g, Q  }- V   Win32_Processor! \7 e7 h4 x' B2 V  }. j" l( S
  Win32_Refrigeration: @' f; A7 S( x- F' U* }
  Win32_SerialPort
: u5 X, T- n  ~   Win32_SerialPortConfiguration, J! v% F& `* \" Q* c8 I, F
  Win32_SMBIOSMemory& D/ s7 ~9 n3 H* d" c; t4 A$ e
  Win32_SoundDevice+ h  n/ @% y2 Y9 j7 y: e
  Win32_SystemEnclosure
% r& g# Y8 W3 l* }" l   Win32_SystemMemoryResource8 o6 c% u1 a  A9 k0 z
  Win32_SystemSlot4 C" y5 c' f; d. E: ], s, Q* x
  Win32_TapeDrive% c3 N5 U. u3 I& D5 i/ J" B8 [  w
  Win32_TemperatureProbe" a8 \+ R5 O- s( ~
  Win32_UninterruptiblePowerSupply
; U3 |2 J" P; k& p& r! S8 S) D   Win32_USBController% O  ^' L2 a: f! ?, U5 I
  Win32_VideoConfiguration  E) I+ l4 D, v7 K' _6 ]4 X
  Win32_VideoController
1 f; Y! C# i0 a, f7 ]   Win32_VoltageProbe
( x& e! p. o* |  a3 P6 c
) x# g( Q1 z8 \' z- h/ b以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 08:31 , Processed in 0.015043 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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