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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
+ V8 o# v) B% B/ J
/ a; H" a* G& {% v8 p1 L$ ^3 J( }5 {, }8 g% x9 R6 _  \
--------------------------------------------------------------------------------
( t1 S5 f- z6 m# W) i2 p. H$ V4 d! BWMI: Windows Management Instrumentation (Windows 管理工具)
: \) S3 b. w! K; \   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
4 R- \: A& @$ u  z   利用这个工具可以管理本地或客户端系统中几乎所有的信息。' m6 L1 t/ @$ }: D$ T3 ?
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
; S$ a0 I& `' v: ^4 k; w3 H: T* G8 [9 Y8 A
--------------------------------------------------------------------------------) F0 ?# d2 v9 V3 ~9 U! s
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
) s; S' \0 R- p' e4 o! u; Z3 V, T7 b/ m$ @' B1 _3 z4 r" S0 c$ k
--------------------------------------------------------------------------------
$ H. W/ T! T2 o1 Z① 初始化 COM 接口:
! s( l0 h9 G7 z   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。2 z8 i4 Y4 n1 t8 b, X  I" \' @
  这两个函数在 #include <comdef.h> 里面定义。7 P  X: w4 P$ G  A9 B2 H' h
$ i  `! T4 d4 X4 g5 ~# |$ s
② 获取访问 WMI 权限:; H7 A' t  t9 q) w/ n! w
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
* h4 u4 \* U- G) n   如果这个函数返回 S_OK 获取权限成功, 否则为失败。' O; [3 Y7 `/ K5 z& B

+ M" n3 L: z* R. S, G8 O2 P③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:, @: V! _1 ~" M6 E' J
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
* [4 q; ]$ A4 q/ Z1 Z7 ?$ ]1 o+ d+ [; t. p# }$ `6 U
void GetWmiInfo(TStrings *lpList, WideString wsClass)7 ?6 u$ V* P0 b* s& M+ v
{
* [  I$ l2 T7 l6 q& X3 C; I  IWbemLocator *pWbemLocator = NULL;6 L) K* l% i" _% a
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
) L* X- z! J% u9 V8 H   {- a% h3 n) `. Y
    IWbemServices *pWbemServices = NULL;
  A4 W: g7 e. B* A0 C' ?+ L: t     WideString wsNamespace = (L"root\\cimv2");
0 |# [6 m: l) G     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)- u. z$ P$ ]9 S4 g2 b& f
     {# W/ Q& g; Q- [
       IEnumWbemClassObject *pEnumClassObject = NULL;
2 s) ]( q+ e8 q- h5 Q        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
- n6 Z/ _2 n8 m2 U4 @) ?) _        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)# {1 V2 V" M8 u" N: E
        {- _4 D0 P5 J2 ]0 \% k+ k
          IWbemClassObject *pClassObject = NULL;1 n; b& F0 H# h* w% P- s- M2 W4 h
          ULONG uCount = 1, uReturned;4 _' [$ P. I7 |4 r( C% @
          if(pEnumClassObject->Reset() == S_OK)- z/ B, l5 u' A2 ^# ^5 y
           {' }( V6 m! @( S- ]8 V. \; A5 _
             int iEnumIdx = 0;) q! `7 F( Q2 b, D. Y  n  H
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)0 s) d- J$ B: v9 n/ g6 W
              {+ c  F4 s. j  ]1 c
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");+ G" U9 A. ]$ c
) _5 g  `( ~4 ?4 X5 q3 A+ }
                SAFEARRAY *pvNames = NULL;
2 K* F: i6 t4 i  S8 b                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)" j( T1 @3 e) |# n6 u8 p( E
                 {9 [$ m2 l' {; n! S. @
                   long vbl, vbu;. M- M1 |8 Y6 r' i# ]; W& E
                   SafeArrayGetLBound(pvNames, 1, &vbl);
. ?. I  y6 u8 \) O; t9 M+ u  z; c                    SafeArrayGetUBound(pvNames, 1, &vbu);
( C# o, R. D3 f; x                    for(long idx=vbl; idx<=vbu; idx++)
  K) w( O6 r4 ^- k0 d0 z8 J' d  ?                     {  l, j+ g5 f5 A+ z! K+ g
                      long aidx = idx;* B) |( P" P* t* x& w  t
                      wchar_t *wsName = 0;+ {% M; R6 t! Y, g# z! P
                      VARIANT vValue;
! n2 x- _- D& N2 v                       VariantInit(&vValue);
" H2 h9 z/ q1 G4 h* t4 B2 ?- R                       SafeArrayGetElement(pvNames, &aidx, &wsName);/ W$ N  T2 I4 H; a5 X

. F' ?( Y/ h5 n& b$ `1 M4 W                       BSTR bs = SysAllocString(wsName);
, I0 Z" j) w7 w* h8 r- f/ M                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);: |! L7 P3 c" R2 p: C+ F
                      SysFreeString(bs);9 Q4 C8 u+ ?; y3 p$ N. _' U! ?! O
. Z' C, q. ?' N0 X5 ^" \/ p
                      if(hRes == S_OK)3 ~/ ]! h" x) K! g( k
                       {2 F# z  n/ X- ?8 p% l7 k# A
                         AnsiString s;- \6 T) X  G6 E5 _
                         Variant v = *(Variant*)&vValue;
* A& k6 H- a! w6 S$ Q                          if(v.IsArray())- W  F7 T: h5 s  t7 Q8 v  w
                          {
! }/ o* K9 {: E( ]$ ~- o( F, f) [                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
  k4 L( m; i" S; N/ ~/ N3 q6 J                              {
; |, [% o8 Q/ e                                Variant a = v.GetElement(i);7 O$ m1 [3 E1 R. \
                               if(!s.IsEmpty())3 a9 _9 c  d2 R
                                 s+=", ";
. J+ F7 }( Y: U                                s+=VarToStr(a);
& @" X7 N7 }, q+ h* d; n                              }* M$ C; g3 S# p& a: \* Q
                          }+ z) _% [% [$ }) |2 B) c" A
                         else
4 |4 `5 @2 ]$ V3 I4 {                           {
" q7 B. E$ T) J0 k1 E                             s = VarToStr(v);5 |7 j% s( o; h+ s  Y7 Z1 ]& S
                          }
$ X" c# @) o4 L1 n+ u                          lpList->Add(AnsiString(wsName)+"="+s);
3 ^( j. z5 ^7 F. V0 ?+ U                        }
$ V0 n' y4 N# A7 ?& \5 n
  ^* y" M$ b! Y1 |" Q9 b                       VariantClear(&vValue);
8 d& J( Z0 N; h" @$ M                       SysFreeString(wsName);
/ g+ j8 g2 t+ }                     }: g( W4 Z/ \5 ^5 G
                 }! _. @* U  A5 l* {
                if(pvNames)SafeArrayDestroy(pvNames);( A* j# S8 |% b% R
                iEnumIdx++;- @  R& o7 N, G" y' G" t5 u
              }
! [+ t8 X$ X& C6 A8 ]7 {            }, {) Q( l& ~- g6 a
          if(pClassObject)pClassObject->Release();
  L7 x* [+ h; f, d3 b3 m         }1 q( K$ E7 z" D" j  O4 P/ B$ [8 N$ X
       if(pEnumClassObject)pEnumClassObject->Release();  P* b8 C9 N" ~
     }
3 Y2 G  X. z  E     if(pWbemServices)pWbemServices->Release();# b% b& D0 E2 p. v: l' P9 @9 X3 b
  }7 V" p; \# [- N6 t
  if(pWbemLocator)pWbemLocator->Release();1 I# a) u# m0 o
}( `8 T1 {( S3 m; u2 k! H
//---------------------------------------------------------------------------+ L  R. z% j9 g3 K4 y5 l8 R
+ v9 B' E" L7 B/ x. @
// 通过 WIN32_bios 获取 BIOS 信息:
5 {6 `" A  R7 b7 a5 K$ lvoid __fastcall TForm1::Button1Click(TObject *Sender)& j- n  C* K. [0 ]' Q' c
{
5 H+ O6 o% z# ]! b5 E' [    Memo1->Lines->Add("================== [WIN32_bios] =================");
* X( h  W/ l- A    GetWmiInfo(Memo1->Lines, "WIN32_bios");
, ]: y0 j6 G6 J    Memo1->Lines->Add("");
# F2 X7 B4 {5 q; a  C}
; D, @4 o. R7 P% d1 K( p/ R: `+ U
--------------------------------------------------------------------------------$ E" Y" C6 ]& {0 v2 R
) y8 p9 Y  b+ l
WMI 可以访问的信息类型有:
+ A" `% w, j+ ]7 w8 d4 E- R   Win32_1394Controller
( \2 o2 @0 S& x& i* n! j   Win32_BaseBoard, q; p6 |' ~0 h9 J
  Win32_Battery
2 a6 }' g, `- b5 n. r) L2 o   Win32_BIOS
3 F8 o) H4 q6 R; G   Win32_Bus
, v7 g5 y* \: P! t5 t3 `3 t   Win32_CacheMemory# |. h0 t2 |4 ~$ |
  Win32_CDROMDrive
2 J+ }) y5 {2 y: R9 S2 i- _* u2 q   Win32_CurrentProbe
3 {+ N) u- W# Q   Win32_DesktopMonitor2 ~& O5 ~  y. d/ g/ [  z
  Win32_DeviceMemoryAddress
6 z4 l: P3 O& I# @   Win32_DiskDrive
; }- l+ z% S8 _   Win32_DisplayConfiguration
3 s2 p6 f, r7 T/ e! Y; y6 {4 _   Win32_DisplayControllerConfiguration+ O" Q" r* G( t% b& u# S) b! X+ |
  Win32_DMAChannel+ Y" p4 _4 _1 \! I. n) E4 [- D
  Win32_Fan
. F1 P, _; k1 n# w. V) x   Win32_FloppyController
1 _2 k& t; m* v1 ?( w( m   Win32_FloppyDrive
& b8 [2 h) t8 h, @$ Y/ K( V   Win32_HeatPipe
0 V3 ?- o8 s/ `7 j- k   Win32_IDEController
  k3 u. [* s7 V! N7 B   Win32_InfraredDevice
9 v4 W2 e' f6 Q- K0 E$ ]& q   Win32_IRQResource
- J8 T5 W. w8 l) t* P- J3 M4 U0 a! ?   Win32_Keyboard3 w5 v8 e6 [/ |2 C/ o3 Z
  Win32_MemoryArray& e1 M8 T$ q4 H  D( ~$ Q, ~
  Win32_MemoryDevice! @; b, h0 a! F7 Q0 d; K
  Win32_MotherboardDevice' @( J5 i( V7 P& {- h. S# c2 O8 Q
  Win32_NetworkAdapter& D4 K+ o1 ?/ d8 i3 v
  Win32_NetworkAdapterConfiguration
/ T7 f+ s: @9 a/ U0 ]: M   Win32_OnBoardDevice
- V6 z- ^8 G) {. i; z   Win32_ParallelPort# T$ h6 c' E; V* w
  Win32_PCMCIAController
9 J, l( \! i  u; c5 q, A   Win32_PhysicalMemory& {- s: q' H( d1 C; A7 f# K$ s
  Win32_PhysicalMemoryArray
, M/ k, b& I8 I7 ^   Win32_PnPEntity
$ H3 x  I9 R& d5 X  G/ Y   Win32_PointingDevice" V+ u9 E- V9 t) o& R7 V3 N8 |% R3 j
  Win32_PortableBattery
& B5 A2 l2 D4 M/ `7 L   Win32_PortConnector
4 f8 F$ J( j) Q* k   Win32_PortResource, s: i* }' B8 g! U8 R
  Win32_POTSModem6 X8 L; `* Y3 w  U
  Win32_PowerManagementEvent. ?6 y% j8 b4 L( K6 Q/ j8 F
  Win32_Printer& |% f( Z" |, y' m; a' P+ I( d
  Win32_PrinterConfiguration6 Z( w0 K- R/ A( Z7 M$ ?/ B
  Win32_PrintJob
; M# i+ W3 K( v! g& K% }   Win32_Processor. t! K9 H5 m1 @7 W2 t9 q
  Win32_Refrigeration
5 y2 X+ w0 s/ w' R; A3 S" W0 U   Win32_SerialPort
6 `: J9 |: E- O8 y7 e   Win32_SerialPortConfiguration/ g# ?5 l9 N- I
  Win32_SMBIOSMemory
  z% L& X% O2 V0 i   Win32_SoundDevice
1 k( h. o" R$ J! n   Win32_SystemEnclosure5 U9 w: G2 f; E7 j9 ]* H  C
  Win32_SystemMemoryResource
$ y; o" C3 Q" R4 C# Z. V: U/ S6 p   Win32_SystemSlot
% Y( V0 J5 u+ X% S9 K6 \6 C   Win32_TapeDrive. L$ b+ |* q" F
  Win32_TemperatureProbe$ T8 i; d, c$ s" |% Z' e$ {
  Win32_UninterruptiblePowerSupply
7 [8 w1 U/ y5 A" x8 o  S9 s   Win32_USBController" G6 _; y( X6 E, p/ B
  Win32_VideoConfiguration
+ I9 @; g' V* J( _   Win32_VideoController
1 Z' M6 B$ e1 z, v, {- I   Win32_VoltageProbe8 I! N, V6 k# s, d* w$ h
2 f4 i+ O# D- o0 Z& T7 a. w
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 01:41 , Processed in 0.034623 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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