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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)/ p: D( f7 b& X! P" Y& Q
% @2 E  }/ J9 i/ V/ e

4 j+ z! u8 Q: Z4 a& r--------------------------------------------------------------------------------
5 f8 W( M  u0 ~# w' z/ jWMI: Windows Management Instrumentation (Windows 管理工具)
5 k. n9 X0 C8 v+ W4 P4 c- l   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 4 m+ f; [% l  u6 C* }
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。; o0 t8 x) B& i, L0 C, u% Q6 v4 V
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 5 W' X$ ?6 p5 _5 g9 Z( K, u1 g! `
0 ]7 E+ X5 Z% m) ]
--------------------------------------------------------------------------------6 S" h2 e& d+ E9 c$ n7 ]" ?
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面1 W$ Z; d* K+ I& ~3 Q+ Z. p
" P9 P; O0 U4 V7 B8 ~
--------------------------------------------------------------------------------
- e, H% e( i. I% [3 w. X) B8 j① 初始化 COM 接口:0 M3 `7 B# |3 K! o, ]" |3 C
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。/ C2 f. p  s# u+ q2 m& R- X' V: \- V
  这两个函数在 #include <comdef.h> 里面定义。
$ y0 Y4 ?1 o% D! E4 r9 s6 h
( D# s# n1 @5 J& P) x6 i, @! }② 获取访问 WMI 权限:4 N7 D! P, i/ g4 R
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);$ M- {* r6 l* Z
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
4 j, M: L9 m8 H1 D) T& V, f3 y; o/ B% G2 P5 G1 H
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:+ x: C5 \0 q. l# G- L, B9 S
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。: S5 G2 v, ~9 m: f" n

5 b/ \/ x0 y( C- G' wvoid GetWmiInfo(TStrings *lpList, WideString wsClass), g- K4 i4 ~9 Y
{, e# V7 l  ~6 R7 e& T4 }4 Y
  IWbemLocator *pWbemLocator = NULL;; u8 t' y% I* c$ b/ [
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
  Y/ }& w# r: d9 k   {% _! f  \6 t# U
    IWbemServices *pWbemServices = NULL;+ ^; W8 h+ @, A7 n# I( Q$ e* l, R
    WideString wsNamespace = (L"root\\cimv2");
7 }- j% f1 Y# o& W2 Z. k% [$ e; J  P     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
& S& Z  B6 h6 X# C1 v( x      {
2 i9 ]- Q( p! e& B# L* b2 V        IEnumWbemClassObject *pEnumClassObject = NULL;
" r2 I; t2 @+ }- j/ n& ]- e7 N        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
8 T6 K2 K, E# {- h$ D  n% ~        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)/ k3 W. F. s( y1 b+ I; B
        {
' E( m. P/ z4 M$ C2 J3 H& s$ K           IWbemClassObject *pClassObject = NULL;
* t* d1 H: S$ n: F& [           ULONG uCount = 1, uReturned;  m, h% x3 s: t4 E0 Q7 i5 J4 g" l0 M
          if(pEnumClassObject->Reset() == S_OK); ^* z6 r* H) e, W, T! B/ ]3 B
           {
0 K) \. Z) Q7 {$ }              int iEnumIdx = 0;
* S. t4 W  A; D              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
% g* P+ R& B( V  _! y; v8 Y; K               {' l: g9 p' z- u" W7 A
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
& b! P! t' u% ]* B5 {& t- c. v; W* E
                SAFEARRAY *pvNames = NULL;' h! E; H: s, B/ m6 {6 R+ H- Q
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
3 l3 b6 v7 Y2 L                  {
6 T- M" `7 W. E. `                    long vbl, vbu;+ a; ~0 b- \. W- m9 w
                   SafeArrayGetLBound(pvNames, 1, &vbl);
$ W" |/ V5 x  r2 U$ v& @. N                    SafeArrayGetUBound(pvNames, 1, &vbu);
. m4 t; z  {- R1 P6 f& U3 k                    for(long idx=vbl; idx<=vbu; idx++)
4 \: r4 h  c" B7 t                     {
; X* g) R  H; f; K1 \                       long aidx = idx;
2 E$ B" e7 u7 w8 d                       wchar_t *wsName = 0;
) |7 k6 d1 k/ R% m                       VARIANT vValue;% k4 F. B# Y5 u- e4 ]$ c5 Z+ B3 {
                      VariantInit(&vValue);3 s% i6 n! ^' b3 X
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
5 g# i. r1 m9 f9 N4 ?8 u" B+ d8 X" f* L% f( Q6 b. e& f4 l  H
                      BSTR bs = SysAllocString(wsName);
: E% b$ ?, B- V. D9 Z, s5 [) F8 b; X5 e) ]                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
2 w5 I6 V% {9 ?# }                       SysFreeString(bs);
6 o8 j7 M! ?: I* g. e3 D
0 G  t, y2 K# h: Z8 n' k                       if(hRes == S_OK)2 U8 }& C" j0 W5 m8 @
                       {
0 U3 Q" s& e: U/ t                          AnsiString s;
0 g/ {& h& n+ P2 p, N6 c- e                          Variant v = *(Variant*)&vValue;
/ f6 l. k4 B: R# D( C" e4 r9 x                          if(v.IsArray()). Q% }* X( v' F/ F. ?
                          {
6 m7 F# y3 c6 ?: k# A* `                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)! }3 @) k: D: r# ~# T
                             {
8 ?, ]* q5 K" E. ^- }" m+ D) b                                Variant a = v.GetElement(i);# ?* S& [7 }) r# r$ k: g2 ]
                               if(!s.IsEmpty())
& x) K( e/ T4 K7 v7 K/ G) D                                  s+=", ";
; `% v6 \$ T! n7 M. Z                                s+=VarToStr(a);
) \: K: q7 e" S; U" p6 j8 q                              }
! b8 ~! Q/ }& U( Y  v                           }
* T0 p$ d) D* ^1 y  V# i; J                          else- w! F/ @" ]' J5 M' `: m
                          {
. O$ v# ?" W6 T8 E                             s = VarToStr(v);
. w: \- X6 ?7 A) O+ W                           }
# d% Z3 t6 O. ]2 o: l# \  q                          lpList->Add(AnsiString(wsName)+"="+s);9 t: c, W' b6 ~4 ~7 q2 B' P
                       }
# z- N6 S! s, G1 Z  @* V, F
" p! z/ M" g; r3 T% c. j" N5 W6 C+ U4 N                       VariantClear(&vValue);
. ]& `5 T9 `3 T. }7 Y                       SysFreeString(wsName);/ @- b2 I, e; ?9 E/ i' g) U# {
                    }
+ c3 N& T& L4 c6 T+ {9 A                  }
. H* r2 k6 k% u, m' N. m! K; U- j                 if(pvNames)SafeArrayDestroy(pvNames);
" u4 b3 I$ E) @                 iEnumIdx++;  _1 I8 s9 I) y8 I4 l' q. b% H5 @4 d0 L
              }
( [. ~: H/ A% B            }) @: @+ i7 V( Y  [! J( t
          if(pClassObject)pClassObject->Release();/ a4 G/ F: I, S) S7 L0 w$ Y; B
        }- d# n2 U8 I9 B
       if(pEnumClassObject)pEnumClassObject->Release();
0 d9 _9 q" U2 Z      }) F, a# P6 o  m/ d) ~
    if(pWbemServices)pWbemServices->Release();% E1 Q, p% B4 b4 U1 R
  }! j" U' y$ Q4 p  ]
  if(pWbemLocator)pWbemLocator->Release();
( @3 p# w, B& H2 c  X8 r8 u}
( m& Y0 V3 n8 A% i. _//---------------------------------------------------------------------------
; |& h  [& ?. {& e3 Q" }  {# J1 G. V. j8 s
// 通过 WIN32_bios 获取 BIOS 信息:
$ ^6 }7 S5 p% _* Tvoid __fastcall TForm1::Button1Click(TObject *Sender)
, ^, _* N8 u* @{
4 Q+ q0 D2 T% x5 E% X1 U6 x, T    Memo1->Lines->Add("================== [WIN32_bios] =================");
) ^8 k/ r0 c; g! _$ j    GetWmiInfo(Memo1->Lines, "WIN32_bios");
+ w/ |" c: b! p- |" [    Memo1->Lines->Add("");
' N; r! T4 e0 W+ W. l5 O}3 D  Y4 @# V7 B) A

8 i8 E3 u8 w' V1 J--------------------------------------------------------------------------------
( i4 _4 Q  c( Y2 V# ^! E* \2 N$ {; \  l  i+ m8 b  s1 q- e
WMI 可以访问的信息类型有:
# _  i1 `" b( a. w( ~, s/ S   Win32_1394Controller" ^& S7 q8 q3 ~  ^& d% z
  Win32_BaseBoard
6 o! g# v& a7 \: ^' u8 g   Win32_Battery
/ Z. N) U! V' [6 P6 I- Y9 q   Win32_BIOS
/ p+ i. e' ~5 l7 N% B$ S   Win32_Bus
' ]( I5 y1 f" x# P& P$ H   Win32_CacheMemory& u: v' V7 f: K0 q
  Win32_CDROMDrive
1 n% R( _( Z+ |4 Y" W   Win32_CurrentProbe( @' s" w$ S" Z  X: C7 G* X$ H
  Win32_DesktopMonitor4 A2 H6 `. A8 d
  Win32_DeviceMemoryAddress. v( ^) \1 Q: M+ o5 B
  Win32_DiskDrive3 t, s+ ?  v4 l0 ~1 S8 m. U. k
  Win32_DisplayConfiguration
5 [9 X/ P- u; b! v' V8 j   Win32_DisplayControllerConfiguration; j/ i4 h+ m. @6 |" y
  Win32_DMAChannel8 T* S( M7 Y# B
  Win32_Fan
& F; ?0 Y5 y" C- t" _   Win32_FloppyController% x  a# x1 [  \" S  G! z  K
  Win32_FloppyDrive! s7 P. b7 D/ f) y% t5 s5 @& |- q
  Win32_HeatPipe  L1 B, p, N4 \- A" j/ l
  Win32_IDEController8 I; M! f, I& u' s1 c
  Win32_InfraredDevice
  W6 P/ W4 B% x, m0 ?# |   Win32_IRQResource/ j2 i- R3 ?1 K: ^
  Win32_Keyboard, O$ L' K# Q  Q
  Win32_MemoryArray
6 Q+ h9 P4 _  [0 [3 h3 a& `8 @   Win32_MemoryDevice
6 p, s7 U* ~. j" L6 t. B4 _   Win32_MotherboardDevice: F, J8 P; j, n
  Win32_NetworkAdapter( U9 q* Q7 H0 s2 E6 L+ g
  Win32_NetworkAdapterConfiguration+ k3 F' K% Y  F2 w/ p
  Win32_OnBoardDevice: j9 K) L1 F+ ^7 y0 q
  Win32_ParallelPort' T, u/ _5 _- v  L  V
  Win32_PCMCIAController- B: N) F9 C2 m+ `- R6 @
  Win32_PhysicalMemory
- u- [6 u. |& _- {5 Z8 @2 @5 P' c5 V   Win32_PhysicalMemoryArray/ U3 ~  x! S5 y5 R2 \# X8 y5 h
  Win32_PnPEntity6 j$ H8 g* e6 J/ r
  Win32_PointingDevice
# g2 a! |* H; ^3 ?# C( S8 J   Win32_PortableBattery
& j9 L2 D. R+ I  j   Win32_PortConnector# B4 `: y8 {; Y$ @6 m2 L+ ?
  Win32_PortResource7 U* L+ v  O- n, ^
  Win32_POTSModem
! J7 M* Y% f- r' \* I  }+ v   Win32_PowerManagementEvent1 m; Z& Q1 p- n
  Win32_Printer
- z' D7 G8 R1 ^+ \8 h/ f- x   Win32_PrinterConfiguration
: D. W6 Q/ L1 @7 J   Win32_PrintJob
1 F! D: V, R( w5 A   Win32_Processor
" ^# v. V! k8 N4 O   Win32_Refrigeration
1 k7 s. |  g* a3 \7 C! x+ w   Win32_SerialPort
$ Z" G; h# P1 x   Win32_SerialPortConfiguration
$ O2 r* S# j; x& m) e" c# M( e  D   Win32_SMBIOSMemory) Y" }3 k+ u6 Q
  Win32_SoundDevice0 x8 X$ t. T  h9 ?8 ?
  Win32_SystemEnclosure
7 W! {2 ~8 p- e' [- `9 {+ c   Win32_SystemMemoryResource
6 t& O6 l" U2 O  q0 l   Win32_SystemSlot
5 C1 y+ [" M+ y- z   Win32_TapeDrive7 l1 W- q) s0 ]/ v; R' T
  Win32_TemperatureProbe- K& r* ]2 S  e: d: \! J$ G
  Win32_UninterruptiblePowerSupply
: F3 n# _! _8 ~- K; K( I   Win32_USBController
5 {$ r, i$ v) B: H8 ~0 q   Win32_VideoConfiguration- W" _: {! Y, m: G, O1 G- w5 S
  Win32_VideoController  b0 R6 f( [* ^  {
  Win32_VoltageProbe2 u( Z: H( Z; _  W+ u) ~
( _6 X1 X. s# q/ g
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-3 09:19 , Processed in 0.020786 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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