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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
* c. y% c& h( O, g
, t5 J6 T3 t7 P( Z* U5 T4 {* u* g. R- G4 p8 Z4 c
--------------------------------------------------------------------------------: h" e- N- i8 _* m/ v# V! h
WMI: Windows Management Instrumentation (Windows 管理工具)
6 e9 @7 J6 B: u. h   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
4 X4 ]. S$ c2 c   利用这个工具可以管理本地或客户端系统中几乎所有的信息。, d! G! J9 r/ w" V
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 4 h3 O! h, g* a1 N, r( O
; b) K4 h  b  _& ]" E2 x6 {1 h% n) @  G
--------------------------------------------------------------------------------
6 W1 w/ i( z+ E6 K: S9 dBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
5 {7 W4 T8 e/ l- s. M5 W3 Q& t' Q3 H( O* |  N0 C
--------------------------------------------------------------------------------
* X3 O, J- z6 X& m( g① 初始化 COM 接口:- s9 R. r4 q  e
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
4 Q; k1 g  k0 [  T8 a3 H   这两个函数在 #include <comdef.h> 里面定义。
/ d! `& w: C, R
4 D; [$ w* H4 b% _; F; E( T② 获取访问 WMI 权限:$ N4 T9 Z. v' U
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);$ \, @4 ~; `8 A4 x8 W6 z) t
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
) ?+ [7 q  m5 u
7 A0 v: [$ _8 k③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
( b9 R/ M  ~5 x$ T) T   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。* X" Q4 r' }* {8 |
! K: L! _  q, N0 x
void GetWmiInfo(TStrings *lpList, WideString wsClass)" n" m1 {4 x* [% H" j# v
{0 l0 m- ?: _7 y( ~# P
  IWbemLocator *pWbemLocator = NULL;
' I. v) N0 Q. q: H* S2 W9 G  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
( O( a5 q( A8 B/ ~( P* x   {$ I! k  M( y% b7 }; ^( o, {: N
    IWbemServices *pWbemServices = NULL;
* l: J, H+ ^5 l: G% ]     WideString wsNamespace = (L"root\\cimv2");
. r! _. z7 ]0 R5 ?3 p8 m4 H     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
7 d4 @8 V5 w$ ~; a; b      {
) o; a/ B, t# t% e% Z, @3 Z8 D        IEnumWbemClassObject *pEnumClassObject = NULL;
& P) C+ v7 k) O2 P# I- ?        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;2 J7 e4 i& X- A! ^0 R/ u  H
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)5 z8 d* s1 F/ m
        {
  \$ B: l4 W$ k  f4 z: L           IWbemClassObject *pClassObject = NULL;0 Y( `% U% X9 D3 C* [1 g; l
          ULONG uCount = 1, uReturned;
/ i4 S& j' j( J           if(pEnumClassObject->Reset() == S_OK)
% x3 j5 d/ t+ c7 v            {
3 U) L) q& Q3 Z- P/ ]5 j              int iEnumIdx = 0;$ v- z( W4 F' O
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
! @" T# e' K" s               {
/ H: F2 R6 |+ Z! S( f( @) v                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
- [* Q1 p6 g+ V' ?; g/ B" ], I% H
                SAFEARRAY *pvNames = NULL;; w/ t4 w3 y# ~" N
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)7 {" O5 p8 V2 Q( x. }) ~, Y9 ~
                 {, H. u+ r% g' i& s  F/ ]& h) h" Y
                   long vbl, vbu;: Q! W7 |" p) s  G. P8 i/ n4 j: q
                   SafeArrayGetLBound(pvNames, 1, &vbl);
4 C' m! `- |" k9 O& P, _% v, U                    SafeArrayGetUBound(pvNames, 1, &vbu);
) H* x" }4 c5 k( S4 B* b$ `  B                    for(long idx=vbl; idx<=vbu; idx++)
3 \  B0 G6 b+ h/ E* x! v                     {: t- ]% v4 d" ]% |) z7 b
                      long aidx = idx;* {, X- E$ R. a! k/ v* \
                      wchar_t *wsName = 0;7 H" }* V7 o% a# }& i9 ]
                      VARIANT vValue;
/ r7 C7 r/ ?. K# B* R                       VariantInit(&vValue);
3 y; a3 O" B& _* M) O+ c  Z) Y' L/ M; t# i                       SafeArrayGetElement(pvNames, &aidx, &wsName);5 Y: r( H: u: ^9 ^3 m0 ?
9 m+ V: i, G: T. i7 C, K5 z
                      BSTR bs = SysAllocString(wsName);/ X# i5 ~. ?& Y5 r! }: e
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);! G  M3 k4 w5 q6 Y. Q
                      SysFreeString(bs);+ l& D2 n- W5 j, M  N

( m8 T1 W! `7 ]% _( h* @- f) T. D                       if(hRes == S_OK)# j. E/ g& N1 d7 s2 [
                       {
3 x  S, r  ^4 k' W5 u                          AnsiString s;
, d! G+ H" M6 b                          Variant v = *(Variant*)&vValue;; {* M# Q% K9 A$ q+ t
                         if(v.IsArray())
$ g5 Y9 [' D) W2 r                           {7 {6 p& R# r! ]5 B  ^) Q* A1 u
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
. m+ u, N/ F3 b, Y$ Z: Y                              {
: |& G1 B% ~2 o8 k                                Variant a = v.GetElement(i);+ b  _  S+ R0 g; L
                               if(!s.IsEmpty())
0 b( z( f" P* v' r; [                                  s+=", ";
$ ^, b4 i; N2 c                                s+=VarToStr(a);
( S) N, g5 X" t* c1 i+ D                              }
3 Q8 a& z7 z/ M! L                           }& J3 d1 r8 r9 U5 I
                         else
. V" p- p, r: V9 x' q                           {
* h, o& }8 h  `- d: ~7 R) M; u, ^# |                             s = VarToStr(v);3 i1 _/ u3 T% k
                          }  ]# K! E# {, H3 u( Y9 s
                         lpList->Add(AnsiString(wsName)+"="+s);# G- v' u3 j$ k# p% e
                       }
' f7 R; p5 v( R8 f; m' n& F: i7 d2 |; R& _; S) J
                      VariantClear(&vValue);
* x5 H" Q/ U3 s( @1 ]7 J: i                       SysFreeString(wsName);
) [3 s. i: ]" o0 b. @                     }
8 h% G0 Z, o% }2 c5 H                  }/ p# A. V- ?6 b6 r
                if(pvNames)SafeArrayDestroy(pvNames);
; \4 F3 V7 s5 @( d5 |5 s9 c                 iEnumIdx++;
4 K( J' ~7 W9 u7 x9 I8 N7 {* c. Z               }6 ]; t, m$ V8 _' {# `
           }$ `2 k; V( u5 Z# G( o! O1 ]
          if(pClassObject)pClassObject->Release();
0 y* |. g! c1 ]/ a2 S, z: U         }1 u9 S8 Y: \2 ?' {
       if(pEnumClassObject)pEnumClassObject->Release();9 l) W; G6 N0 S+ d
     }
' M( \( P7 U0 b     if(pWbemServices)pWbemServices->Release();' y; f- l" u! h- }: B! t  q
  }
0 x1 Q3 u0 u4 u$ V; e  if(pWbemLocator)pWbemLocator->Release();
, x2 e' f' h  `3 A! i6 t2 W- a7 \}
5 R# ]" z- T/ f  n. P/ H! M& Q//---------------------------------------------------------------------------
% i) ], N& v! v# b, J
- M/ I  q- t. v8 N// 通过 WIN32_bios 获取 BIOS 信息:' K6 A4 m  h) T! z
void __fastcall TForm1::Button1Click(TObject *Sender): ^1 `9 N! h/ G
{
& U9 u$ |1 M0 i+ X! I    Memo1->Lines->Add("================== [WIN32_bios] =================");
7 E" a: N' M2 n8 y& a" t    GetWmiInfo(Memo1->Lines, "WIN32_bios");
" z. h; d% m. \5 @    Memo1->Lines->Add("");' ]3 ^" M! L7 d$ K1 _' ]
}) l- {5 P' R+ j
4 C. E. e$ I' A  _' Q
--------------------------------------------------------------------------------& w1 A# n* t; n* i: B" u0 o( d8 [

2 C, C0 n; B- n+ ]; RWMI 可以访问的信息类型有:
( n* S: r1 j3 d) A: T   Win32_1394Controller
% k8 y" H* z! {6 A0 v) b$ v4 t   Win32_BaseBoard
0 H. ^1 ]8 K3 r5 N5 P   Win32_Battery- o% b4 z3 w: H% r4 K8 R
  Win32_BIOS2 H  G9 _8 m. Y2 O
  Win32_Bus% A+ I% C1 c/ t9 a* M- y3 y8 Z
  Win32_CacheMemory6 z1 S! ]* z/ }
  Win32_CDROMDrive
7 V. Z" P5 ~& D9 k" T3 s" R   Win32_CurrentProbe: }' J# L) s( x2 m5 f9 k
  Win32_DesktopMonitor/ a5 Q$ t$ E1 }! D% i
  Win32_DeviceMemoryAddress7 t) q0 Y7 X- K& f
  Win32_DiskDrive) j1 N7 \6 `% t" p% ~% J
  Win32_DisplayConfiguration
  P0 H1 E+ e2 q   Win32_DisplayControllerConfiguration/ \* X* |9 L6 ^$ T
  Win32_DMAChannel
9 ~5 w( R, |0 e% O3 z" V- [4 o   Win32_Fan9 c' d5 |( X5 D8 P4 r. n
  Win32_FloppyController" g0 n) k) }$ x& J/ X6 N2 i! X
  Win32_FloppyDrive4 A5 [) U) I) q7 f/ F& v9 E
  Win32_HeatPipe
0 c( k9 h- n. f* r# U4 f, j! R   Win32_IDEController
3 H( }* U3 {* b7 v   Win32_InfraredDevice) X4 N7 E, w7 G
  Win32_IRQResource4 \( V1 M; p6 `' m: `) w+ K
  Win32_Keyboard+ Q+ j: Y/ ]# f1 z) T  b4 \9 h
  Win32_MemoryArray
/ e8 @& c9 `, N3 e  Q' \   Win32_MemoryDevice6 b: R& P+ k/ D0 w- h8 g
  Win32_MotherboardDevice
7 x5 R" \6 Y  W   Win32_NetworkAdapter
0 n6 M+ @/ K$ s   Win32_NetworkAdapterConfiguration
6 E+ D: `0 K! K   Win32_OnBoardDevice
( I6 q/ S) d0 M   Win32_ParallelPort
$ Z; Q: B! ]; D" {9 r+ P0 H7 t* _   Win32_PCMCIAController& \' p1 e) a# }6 I" l
  Win32_PhysicalMemory4 K6 Y7 a0 a9 ]: R$ Q
  Win32_PhysicalMemoryArray6 {' S& r1 \: y% F" r8 `- y
  Win32_PnPEntity. m5 W% \; k" M6 B$ q, i! J5 q
  Win32_PointingDevice# X) P, q: j  c. a
  Win32_PortableBattery1 d" ~1 E9 Z1 R" v, \0 h
  Win32_PortConnector
0 ~1 E  R+ I8 k( K7 Q9 j0 }   Win32_PortResource
+ H% Z$ f# U1 f; q   Win32_POTSModem5 ?: o1 H% u! Q! n9 Y
  Win32_PowerManagementEvent4 I; K; @2 m* s3 P
  Win32_Printer
' s9 ]- r$ D! R. U   Win32_PrinterConfiguration2 j2 \5 A8 f: H9 e" U
  Win32_PrintJob
1 ^+ C0 F5 f0 i/ h: n/ j3 d   Win32_Processor
. ], m  B6 G4 z$ q   Win32_Refrigeration( E  y7 }2 a* z. }+ h7 W0 a
  Win32_SerialPort
  W1 g6 @5 m: O$ h   Win32_SerialPortConfiguration
3 _$ B/ _+ W( {   Win32_SMBIOSMemory' ?: @  I/ t$ A, R- A  I$ l+ `
  Win32_SoundDevice# [* K6 F- {* A/ ^/ ~: N( y
  Win32_SystemEnclosure
! }6 x  z6 F" N. U   Win32_SystemMemoryResource  J  Y# ~: R: W4 k( B7 {
  Win32_SystemSlot
4 \8 |+ K7 \. f1 H/ ~# f- W   Win32_TapeDrive% Z( s3 j7 S+ r
  Win32_TemperatureProbe( w4 f9 B  `5 W; @
  Win32_UninterruptiblePowerSupply; k' z: d- ?$ \' i4 _
  Win32_USBController
+ j2 }$ Y8 ~3 m: C0 r+ w# r   Win32_VideoConfiguration
( i/ G4 x, p  r" T8 B% Y7 L   Win32_VideoController
! R" s' J8 S1 [! [- t8 z2 I+ }# ?   Win32_VoltageProbe% Q8 D: S9 i" }( ^3 A% h

3 {( a8 b2 s/ {( q3 \' x7 n, Y以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 23:50 , Processed in 0.018300 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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