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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
! T$ J2 T) r- {& P) m& w/ e, Y+ D9 V, u6 D0 p3 u- \+ a9 i

- ~* t" C3 L" }/ q1 w--------------------------------------------------------------------------------
8 t3 Q( p& c4 j9 iWMI: Windows Management Instrumentation (Windows 管理工具)
2 {% r" N3 A: |4 E  v   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 # L, R. V- q) z& }$ O
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
1 l$ p4 y& N  i0 ^   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
7 L+ v% \* a2 Q  o# t2 E( R, x$ _4 r; k0 i
--------------------------------------------------------------------------------  w( {/ ^" r' j% G, j
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面3 J) n+ q( O: u* `& @# [
6 J- \2 R% a6 b$ W( ^/ k  C
--------------------------------------------------------------------------------+ M3 c/ P, b9 T4 h( g
① 初始化 COM 接口:0 g& A2 h; G; y5 C8 A* b6 e
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。$ i' N' P% `0 g3 Z
  这两个函数在 #include <comdef.h> 里面定义。
' e) ^/ P; N* W4 s" Z* L+ L* u4 [; o  @1 v. N  y  n0 ~# G
② 获取访问 WMI 权限:
0 Y3 Q) {' Q' P) w  Q  d   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
. O# c, H. X" a   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
$ ?: @6 r; d; ^$ F0 L# S. `
3 m! c/ y2 y  l  N/ D* H③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
6 q6 h1 G0 e7 k% S& g4 d; J0 u   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
: P) q. _. ]9 b9 ]. Z% ^3 a+ F- H5 F' s# Z
void GetWmiInfo(TStrings *lpList, WideString wsClass)3 q4 Y3 O. Y9 |- y1 K6 d
{
" T& i/ e( z6 j' |1 ~, _, i$ \8 J  IWbemLocator *pWbemLocator = NULL;' Q/ J( B7 A% w  s7 h. E
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
$ ?; n; g0 T" T) x5 Q$ g* l* m0 ]   {
- ]3 ?' g. y3 l3 l& V     IWbemServices *pWbemServices = NULL;
6 C% q/ I. q* c) Z     WideString wsNamespace = (L"root\\cimv2");
8 i& G( t. F1 `5 {; j# g% L     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)% e. {% S! E5 f; C5 Z3 X4 P1 ^
     {0 ?' P2 \* F3 K( k% v' k1 Z9 B/ `
       IEnumWbemClassObject *pEnumClassObject = NULL;
5 Q; T& z  ?: a( C8 ]/ U2 C1 [" w        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;: _5 z( M) d# ?6 W
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
' _) r/ `- P& P# }+ I         {
. [* a6 l1 H; F6 }' W           IWbemClassObject *pClassObject = NULL;
/ n' e  k: U& v8 P0 u9 D           ULONG uCount = 1, uReturned;% n, W$ q" G% F  m
          if(pEnumClassObject->Reset() == S_OK): m/ v) Z' t+ n( F
           {' l& u, q& M# ^8 C/ e
             int iEnumIdx = 0;, I2 B& V' h: E* R, N1 ~1 \! c
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
9 V/ C8 o: @) [/ }8 u4 S9 v- O               {) u7 K0 b* T- B( b3 Q5 H
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
! @( S% c. Y8 R7 a5 S) x$ E; K+ ~$ L7 ]
                SAFEARRAY *pvNames = NULL;3 v% G7 Z% w4 S- J
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
) q( x  V" R9 Y0 F9 N                  {8 x# R" o$ n, P$ y8 z
                   long vbl, vbu;
/ z4 R3 A9 S7 o8 a                    SafeArrayGetLBound(pvNames, 1, &vbl);
. S1 R; z5 P9 R. t1 l( R                    SafeArrayGetUBound(pvNames, 1, &vbu);
$ b/ s0 Z. G( e3 O                    for(long idx=vbl; idx<=vbu; idx++)
' w8 q+ ^, V% @6 |                     {
0 S9 h2 [8 u/ _' G                       long aidx = idx;) O2 h; G0 z' Y# k
                      wchar_t *wsName = 0;
$ }3 S/ e( ]- S6 `( C. P                       VARIANT vValue;" _9 K9 O) n* p9 X* e) m; m+ p6 c
                      VariantInit(&vValue);' q3 N# G3 L& G7 d; _  b
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
# S2 L) W6 i0 p1 c/ ?" C, k+ b
) }# L% Z! X5 F1 G, v) n: v7 f. t                       BSTR bs = SysAllocString(wsName);/ A2 @1 L. W& N
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);# H! K( ~, L+ y, Q
                      SysFreeString(bs);$ J( P; b0 o1 d& |2 C  e( U

/ ]* O$ F, v- |2 K% {9 I: U                       if(hRes == S_OK)3 w3 N" h( P4 W
                       {
1 `2 ^7 X6 F8 i5 c  b( @- C( P                          AnsiString s;
0 b4 N! A0 h  i+ l' Z4 d' Q                          Variant v = *(Variant*)&vValue;
# |) ]+ V* ~) b3 W                          if(v.IsArray())% l8 ~+ t" q6 U- i3 t6 a9 \/ Y
                          {
/ G/ J9 k: a9 y7 I% u                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)/ X& c1 U# U& b* a
                             {% P* y( u0 p" K; s
                               Variant a = v.GetElement(i);
7 q7 g5 Z+ D1 V# n& ^' N+ V                                if(!s.IsEmpty())* N. V6 f5 |5 E/ Q  ^8 w
                                 s+=", ";
( {, x; V& z' f9 @, E                                s+=VarToStr(a);9 X& x. s0 d  l4 D7 p
                             }
4 N# q7 [; B3 Q  v0 z2 [! {                           }
' G# c" ~( x; h& {                          else
  x2 a( V$ C  D8 A7 n7 L* S  w% f                           {
6 o2 n5 V  f5 A7 J3 b6 a! d                             s = VarToStr(v);2 s0 t- u* D( |- P8 E
                          }% b/ J, x' u* G* z  R! ~0 H
                         lpList->Add(AnsiString(wsName)+"="+s);
! d5 A8 @( |6 ~. p0 c( A5 g! Y) d                        }. l! j/ Q' G0 Q3 c$ h1 G

  J% [' j$ z+ k, O                       VariantClear(&vValue);
+ \0 @3 x: s7 X7 H. A                       SysFreeString(wsName);
2 n/ Y  j+ t; c0 B8 b: v- D, Y. w; w                     }( w' A/ }& L8 ~! O5 g  @
                 }
8 w! F+ r+ a1 {8 u( q                 if(pvNames)SafeArrayDestroy(pvNames);
3 c6 g0 K% u1 ~$ V                 iEnumIdx++;
) {, [$ ~& y0 c% {               }
4 `8 P0 Q  |; d# \            }
) A  K% e9 \* x           if(pClassObject)pClassObject->Release();
3 a; R9 d, O( K         }
6 b6 G$ b9 a, E1 e1 E$ e( F$ x+ {3 [/ Z        if(pEnumClassObject)pEnumClassObject->Release();/ Z& Y4 |- c# x4 W6 T6 `
     }0 ~% l* a% q* D) d' a) D2 J$ X# Y
    if(pWbemServices)pWbemServices->Release();
# R% o0 I$ m' Z- L* `# x7 b( U3 H   }
. C, F8 u* Q0 ]9 y" H7 i1 G  P  if(pWbemLocator)pWbemLocator->Release();! s0 e" m; R- _9 Q; r' l2 W
}2 O8 A4 f$ h+ V4 x4 M
//---------------------------------------------------------------------------
7 V. f) m% o2 ~' U! s$ i; ~0 _! ]; j: D9 K1 Y
// 通过 WIN32_bios 获取 BIOS 信息:3 b( U( i: H- K% l- {" B6 e
void __fastcall TForm1::Button1Click(TObject *Sender)
" ]: H5 K3 x/ ?# L* R$ U" |6 u# @{8 t# U& g, Q1 c7 n( `  l
   Memo1->Lines->Add("================== [WIN32_bios] =================");( ^0 `1 q- T: @; ?" T
   GetWmiInfo(Memo1->Lines, "WIN32_bios");1 K% e' c: q$ z2 @' {
   Memo1->Lines->Add("");
) h4 x& f0 C- N' f7 Y1 _! t}
5 o, v1 W! b5 ?1 @, F9 i) v, W2 B) K
1 s$ _  T$ j: E) ^4 {--------------------------------------------------------------------------------* R. L, a' p5 I! w8 }
4 L# N! Q" {5 V; ?( N
WMI 可以访问的信息类型有:
; C3 n/ w2 C! c) E   Win32_1394Controller% D! t3 t) e* C1 k7 r/ P. g
  Win32_BaseBoard0 Q. {* s! Y$ K+ K1 N5 T
  Win32_Battery
" z% g* e$ b1 I) z   Win32_BIOS
& N3 u3 E, e- G$ D$ V$ [* e  [   Win32_Bus+ @8 U) W5 U5 u. g' G: X4 j
  Win32_CacheMemory. B- c+ Q4 g8 a8 f( v$ U' Y
  Win32_CDROMDrive
2 i  y8 N# v3 }% d, L' [   Win32_CurrentProbe
) Q( q+ }! \& T: k! ^) ?   Win32_DesktopMonitor
, a+ Z$ \' i. I. N   Win32_DeviceMemoryAddress
4 J) a& t- T$ f1 e2 \   Win32_DiskDrive# O$ Y5 F8 L, n0 y* P. C, y+ X( y
  Win32_DisplayConfiguration
/ c8 F& ^1 ?2 v7 J   Win32_DisplayControllerConfiguration
( g, I* m( V( v* h" O  H   Win32_DMAChannel. x. d+ N9 Z+ r
  Win32_Fan
1 d" {# s1 K$ E1 Y. I) l: i   Win32_FloppyController& f" Z0 ^1 S2 d" U  j  j
  Win32_FloppyDrive
# k* G- [! \: M3 ~. e2 b, Z   Win32_HeatPipe
6 }$ E. W/ x1 z! c% m: @5 R( Q   Win32_IDEController
9 j% n8 ~- B1 H5 f$ t   Win32_InfraredDevice, g, t% N0 S9 G4 @4 x2 {
  Win32_IRQResource7 F, ^( I& Z% k8 F# F! F
  Win32_Keyboard- d0 Y- o( L# Y' h& y" `' Z
  Win32_MemoryArray
6 w2 ?9 o9 @2 G) S) \   Win32_MemoryDevice/ L! f$ V& ?8 V5 s: ^8 Z* w- i) u
  Win32_MotherboardDevice
9 S0 g: H: K& U" X   Win32_NetworkAdapter
: V) J7 b; q+ u) W0 U   Win32_NetworkAdapterConfiguration
- I% b, e2 O1 f. W$ E$ X   Win32_OnBoardDevice# b" u# ]" j: @
  Win32_ParallelPort
4 {7 \) O9 h8 }   Win32_PCMCIAController
7 z& e7 P% I& r0 E- L! [8 E   Win32_PhysicalMemory
5 h# b: {& g0 Q) f: W. G   Win32_PhysicalMemoryArray
3 c- S, H9 \, H3 C4 ^, C( u   Win32_PnPEntity
/ ^! ~0 `9 T0 v4 w4 C   Win32_PointingDevice2 r7 e# w  `7 H" \1 m
  Win32_PortableBattery
. s/ `+ a7 d7 t4 }1 M" B3 r   Win32_PortConnector: Y4 Y8 Y% R  {) O1 Y- i
  Win32_PortResource
* K* `' X2 E# }( y$ S; S$ H   Win32_POTSModem, [: i# A! O( w& \3 {2 I  |' V
  Win32_PowerManagementEvent
! j* Q. a1 p& y; j+ P! R   Win32_Printer+ h: T6 w/ _6 Z) w1 e, H
  Win32_PrinterConfiguration$ Y  j3 R4 [  m- V" g8 U
  Win32_PrintJob
3 r% n$ X4 d* v' u5 T1 Y   Win32_Processor6 b3 `0 B/ ~5 O0 V+ c
  Win32_Refrigeration1 D+ n9 M: W$ h; E! `) ?
  Win32_SerialPort
) M6 u% o- Y5 Z' k   Win32_SerialPortConfiguration
8 A/ |$ G6 ^; M% `3 F" ~% e   Win32_SMBIOSMemory
0 F; P! y& D$ v& o- c, F; U   Win32_SoundDevice/ k$ n: J* y: u' z. h$ M+ Q
  Win32_SystemEnclosure
+ U& {( x) B3 r1 \   Win32_SystemMemoryResource/ g1 G$ `% }' V9 k+ Y; X) P4 r
  Win32_SystemSlot
4 L! P3 k( a! n1 a! H   Win32_TapeDrive
4 N: O  m) F; h' s/ Y; \   Win32_TemperatureProbe
5 j2 u; O  d% }. _! _   Win32_UninterruptiblePowerSupply
6 G# I1 B2 h2 B4 Q3 k   Win32_USBController
. M. A& H4 H& }   Win32_VideoConfiguration
+ e9 s8 B9 h& q% [$ m2 Z   Win32_VideoController
* P! w4 X  m% o' l3 s   Win32_VoltageProbe
7 V/ w  s+ m* d$ _* E% I$ e
6 }/ n3 j6 o4 U! j以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-3 06:44 , Processed in 0.026823 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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