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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)# P! _! O) j6 h$ r) a! Y  g
+ g+ e. o6 l8 z2 I
: z5 P! I# W/ s/ V! `" U, T# g
--------------------------------------------------------------------------------- A- v+ R. ?6 x( u4 C2 `
WMI: Windows Management Instrumentation (Windows 管理工具)- A% _% M) O# w! u7 G3 U' X# K
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
; H9 [4 G. j( p5 ?8 h0 a0 p   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
) a* y; B6 ]9 e2 A# t8 k/ L: I1 D/ T   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 7 O; Q$ \" W2 K" w

6 Z6 Q# s& Z5 n* O1 F--------------------------------------------------------------------------------
/ h/ p7 s0 o5 d& HBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面6 N8 u1 P; Y4 V% O
5 }+ S6 w: b' j* O
--------------------------------------------------------------------------------
( ]$ S- |* V9 i/ t" N① 初始化 COM 接口:+ D; p" {. Q# y4 D& h
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。. C' ^1 i' G0 X* O4 d
  这两个函数在 #include <comdef.h> 里面定义。" j; _% d9 ]' |6 D" w

2 E1 U* \, \, v② 获取访问 WMI 权限:
% S2 K. M: {# V8 n4 E4 x( j: [   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);' g; c8 V1 Z# Y  S# n9 `
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
4 J' D, N( S. @0 M2 ]- F- H, L' s7 b4 \: @
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
3 |( T% _! ?9 y" ?& E   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
# C7 T( D; Z  t" D7 e3 _1 v6 d- ?7 v5 w1 G1 n' j
void GetWmiInfo(TStrings *lpList, WideString wsClass)# c/ D8 E1 j6 @/ j3 ~; c) A1 V
{* E! z3 a/ I9 m3 ~8 S! D0 F$ _% @9 Z1 e
  IWbemLocator *pWbemLocator = NULL;+ V) ?# m5 m3 e! W5 K" u
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)6 q. K1 W1 @8 w
  {. s* w6 K: i7 l& m7 v8 j2 d
    IWbemServices *pWbemServices = NULL;
+ x6 ~) x- E7 h% F! w9 E% M     WideString wsNamespace = (L"root\\cimv2");
9 s6 H3 H! m' I4 t2 e2 B     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)# p9 H& I9 @2 ]6 f; Y% C# B
     {
$ f2 C& B  C6 W        IEnumWbemClassObject *pEnumClassObject = NULL;5 L# q% r) F+ o/ {
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
& b0 @2 e0 q1 x9 M$ \        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)9 o9 f/ b$ P' _& B  [$ S
        {$ j2 D9 u/ D. g8 C; I1 R
          IWbemClassObject *pClassObject = NULL;- B8 l) Q' Z$ Z" m
          ULONG uCount = 1, uReturned;3 s' m+ n7 J' F0 q. j6 _1 X1 m
          if(pEnumClassObject->Reset() == S_OK)
( `! l: ~5 w" R. q$ n+ `            {3 z( H7 L6 K  _' g' G+ _* y
             int iEnumIdx = 0;
& C% v2 [/ V2 I' `0 N5 Y  I              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK); F) L8 i" P9 H8 k1 O
              {2 A! }8 l) e) ]  N2 D
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");( o5 Y+ W7 L- ]# ?8 N8 Y
. }  ^9 k. l# g9 a) U- a# Q
                SAFEARRAY *pvNames = NULL;: x0 e7 t9 A/ ]" B6 p- b
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)+ ^7 ]7 K# [0 A* ^/ ]
                 {
% v$ c# t% z: U% l7 ]. _" r+ s+ W                    long vbl, vbu;/ @; O0 j# z; V8 {3 W4 O
                   SafeArrayGetLBound(pvNames, 1, &vbl);
2 I  E% }; B/ B) X) R% n5 H" x                    SafeArrayGetUBound(pvNames, 1, &vbu);
- z# e- I  s2 s) ~) W                    for(long idx=vbl; idx<=vbu; idx++)
" `5 j' r* V. {0 f7 w) j  Q7 G                     {& ?& R  a' h8 o2 z; O" {
                      long aidx = idx;- [2 X! v& |1 @7 a1 V% Y& K1 l% p
                      wchar_t *wsName = 0;
4 \8 u2 W2 C" ]# F' `4 Q# R5 s3 A                       VARIANT vValue;& q- q% V  C# g! `1 u: O
                      VariantInit(&vValue);, W/ ^; I# a) H- x$ F8 y
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
8 [8 j* m5 I5 V% s. F/ h6 L7 w. T# b  g9 V: _; L) U! Y
                      BSTR bs = SysAllocString(wsName);
( E8 ]5 y% e# }# P3 [9 @% m$ b                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
' k0 F. ?- f$ v9 F$ i& i- \                       SysFreeString(bs);4 ?+ a' L; a; a% u  k

# A0 h# V# I" Q; ?% K                       if(hRes == S_OK)3 U' A9 {1 @. c# ]6 M
                       {
7 q* m: \5 a) b4 S$ @7 T, j# z2 M0 ~8 b5 g                          AnsiString s;
/ c0 L& C- d( v                          Variant v = *(Variant*)&vValue;
) m* E# q$ r- a- p. u( v6 P* _1 a                          if(v.IsArray())
5 t( p) B7 Y5 Y  q% \                           {' x" V3 R2 f$ L* c% [; f
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
& Q6 C4 K' U' F                              {
- }. y9 y8 |* ?5 Q                                Variant a = v.GetElement(i);1 t6 C; T) d4 W/ [
                               if(!s.IsEmpty()): @4 a4 Y- v/ p( ^; R8 l& m
                                 s+=", ";/ h3 {& G+ V' }
                               s+=VarToStr(a);( S" A" l/ j8 ?
                             }% p' G! J) |" L9 ~* Z
                          }
% V/ O( T! `  F& p, `1 F                          else
8 Y/ N$ F4 R# B7 K  h5 W                           {
0 D+ D$ U& L& N3 H% t1 q& X3 M/ u7 v2 ^                             s = VarToStr(v);
& [8 y% I; e) Q5 L# @; @" ~  D                           }2 H' x. n2 l) _. V& V
                         lpList->Add(AnsiString(wsName)+"="+s);
' l* F! ^* r. ~9 ^0 O4 L                        }
1 o8 g3 M0 l4 K! H, g( e: I  ^% l5 R/ R' G) z" b9 G
                      VariantClear(&vValue);
3 t" X0 [  H  z4 A4 p& B9 d+ r; N                       SysFreeString(wsName);# g* X. k1 `# j
                    }
1 A, p2 H, G6 G9 o9 f, V                  }( C3 C6 a+ I' p3 S3 \2 Q
                if(pvNames)SafeArrayDestroy(pvNames);) ]; p, m9 e  N5 F( S3 [! Q
                iEnumIdx++;
* ?* m/ R- g; @' M5 Y! X0 q3 z               }
* ~  C2 t( ?7 X; h            }
/ K- _. c" y2 Z4 G) Y7 c           if(pClassObject)pClassObject->Release();
, |! S4 S  V, ~8 c         }1 e! u+ s* a! u( L7 H1 V
       if(pEnumClassObject)pEnumClassObject->Release();, s8 u- [3 g4 B4 [
     }! }3 d: G8 F" _' r# M; j
    if(pWbemServices)pWbemServices->Release();% K7 p7 Z8 v% j0 q5 ?9 A
  }
) b: S0 Q$ }( g- V3 o7 ]  if(pWbemLocator)pWbemLocator->Release();! K) Z4 m& D9 d+ `5 S- s5 A
}2 W6 c( Z+ q; ~; ]8 T/ o
//---------------------------------------------------------------------------
7 H8 ?/ `* u) D9 X! y+ [7 g) B( A- p* v. |
// 通过 WIN32_bios 获取 BIOS 信息:" b; K7 i- x3 k( v% n& f' @8 a
void __fastcall TForm1::Button1Click(TObject *Sender)
2 g- y  t- W- ]7 L' w{
; H3 P# v  ?" g6 ]: H    Memo1->Lines->Add("================== [WIN32_bios] =================");
! h/ L* v8 E% O: ?2 ?    GetWmiInfo(Memo1->Lines, "WIN32_bios");$ I0 d5 z  b! d! t
   Memo1->Lines->Add("");7 f9 U. _5 k2 P2 _0 h$ X
}
( J! O1 Z- C& Y$ M3 m" c0 C: f- q: j  F/ S0 e+ a# \
--------------------------------------------------------------------------------; N+ k* {' |% d7 R/ F# h/ S0 {
2 y/ g6 u- y# `2 D- m) b3 c$ `
WMI 可以访问的信息类型有:$ O$ o$ m( \% I& |% ^: M
  Win32_1394Controller0 p; j; H+ R8 p& k& c
  Win32_BaseBoard- i! \% @6 T3 o
  Win32_Battery
4 F2 n4 ?; s* A" [   Win32_BIOS
& H1 D7 \7 K9 U   Win32_Bus1 W/ Y$ V) |; B/ P+ r3 x$ ?" H. @) a* C
  Win32_CacheMemory
7 x8 E  z7 b& {# Q. S- Z   Win32_CDROMDrive# }; o: A; p+ u
  Win32_CurrentProbe
/ h5 i: v0 Z9 U( Y- O4 R   Win32_DesktopMonitor
# A! a3 L4 I8 t   Win32_DeviceMemoryAddress
+ [$ X+ V2 Z, d   Win32_DiskDrive
  _2 K, X$ W# @/ {3 ^% D' H   Win32_DisplayConfiguration7 S# A/ w* Y  t4 W2 z; R
  Win32_DisplayControllerConfiguration, |/ z/ }, D! q3 |6 e
  Win32_DMAChannel
* E3 n$ o* A9 l5 @$ M- h# q   Win32_Fan5 {6 F* r& q2 \& X
  Win32_FloppyController  z! e, k7 I' U$ I9 Y  d* V
  Win32_FloppyDrive: d/ M5 [% e0 E5 \* Y9 F' T$ ^
  Win32_HeatPipe0 }5 l+ m$ D! d( x8 p# i' D
  Win32_IDEController
% t7 e3 g, `/ U0 t, T# H  g   Win32_InfraredDevice( J: Y" D3 [& R: H2 B- t
  Win32_IRQResource0 W/ J5 ?5 m4 g: L6 |
  Win32_Keyboard
* Q1 M9 @* X5 A" r6 a   Win32_MemoryArray
2 t+ Z* e% U% |$ Q6 y2 u# {   Win32_MemoryDevice
$ I, S$ h2 v$ I" S9 L   Win32_MotherboardDevice# c6 ^6 L9 x5 G  t1 r. R( E! v* N
  Win32_NetworkAdapter
0 S- g1 B( F. W2 X0 e) C% F/ e   Win32_NetworkAdapterConfiguration% f+ |' ~/ A9 v# i
  Win32_OnBoardDevice
6 s9 H) c; R  F; ^* \' O   Win32_ParallelPort
. D0 l+ A) [/ l- U   Win32_PCMCIAController
# E, T7 J3 p2 g& s' I  a: Y$ d   Win32_PhysicalMemory1 c$ p9 }( {/ K% K$ P3 h( q
  Win32_PhysicalMemoryArray
: I3 O2 N  E1 H# \; p8 l6 [; z! B   Win32_PnPEntity" n$ _, p1 X7 b; o
  Win32_PointingDevice
- @* X  a' H, o6 k0 q) m# l   Win32_PortableBattery/ u# j. E2 u* k
  Win32_PortConnector! T" `% p) \3 K$ f2 g/ q
  Win32_PortResource
3 `( h3 k+ L4 B0 K. g/ X, H   Win32_POTSModem( e1 f" [( L2 L4 d5 u
  Win32_PowerManagementEvent
/ S4 d; C# d/ o  C   Win32_Printer
& M) y" g1 K( w- O) T   Win32_PrinterConfiguration) p* d7 X8 i/ M1 d" \4 a1 ~, b3 b
  Win32_PrintJob" R+ F, ]1 H! d' I1 ~9 i
  Win32_Processor4 J: g* p$ O: E8 l5 a1 [2 l
  Win32_Refrigeration
# |" H0 ?5 h+ z' p; a+ x   Win32_SerialPort0 j3 Z8 h7 a' m2 r
  Win32_SerialPortConfiguration& M% s0 I% a- ]" G6 k3 h
  Win32_SMBIOSMemory
: R$ Q- W' I; d- h/ D* E& Z   Win32_SoundDevice
9 O: l  P* [8 A! J0 Q6 r( i   Win32_SystemEnclosure. t* Z, K9 G/ _# Y( U
  Win32_SystemMemoryResource
8 ?; j0 n. d. `' I. x) j& w) Y7 f   Win32_SystemSlot8 Z5 h, i2 M! ^2 b/ X/ w; \
  Win32_TapeDrive4 o1 i) _1 x% j8 a$ L4 E" g+ _
  Win32_TemperatureProbe
6 C7 Z9 V# a% T( A8 H* l   Win32_UninterruptiblePowerSupply" O2 v! o- z( m) h( z
  Win32_USBController
7 i3 Y9 J7 j. ]3 e   Win32_VideoConfiguration
( l$ P, U8 T. P7 b   Win32_VideoController2 c/ @- e. s7 ]
  Win32_VoltageProbe9 j6 W- j. E% K! }1 x3 ^+ d( {0 b

* V3 ~7 C4 t0 V1 d以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-11 10:40 , Processed in 0.017931 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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