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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
; _/ w# {! G: C3 i* O/ q! E& B0 L* f1 o7 D' L3 P

* f6 B# u' H9 W% J6 y. G--------------------------------------------------------------------------------
8 M" ], C, R. }3 b2 ~WMI: Windows Management Instrumentation (Windows 管理工具)5 U7 A( k. t7 ]2 G  _
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
7 I2 n1 M3 q; o   利用这个工具可以管理本地或客户端系统中几乎所有的信息。  Y+ O: F, M; z( T4 J
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
0 a4 e. X$ ^$ J- E% K
! P' L1 S# p" a--------------------------------------------------------------------------------2 C5 l; Y! e1 R. g. G$ c
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面4 V7 K2 A  q- B7 k. g! d- ~

$ h4 @' X$ O& ?# e--------------------------------------------------------------------------------# Q$ c' L5 O" C4 O
① 初始化 COM 接口:9 z+ w* W+ q- c/ l
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
# \! B# Z9 O  G& ?' \   这两个函数在 #include <comdef.h> 里面定义。
. Z( c+ G3 b. X5 u8 t
* v3 u! N( r& E$ s# \/ {+ c② 获取访问 WMI 权限:
; o% {7 w  w* \; s* m0 d   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);1 \2 w1 s$ h/ M( E0 d6 @) n
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。! N  |1 v* r. u, `& [$ ^
$ {1 R# \& @8 \+ V  p: y( R& H
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
4 @+ r$ l8 p' t3 F) V9 U( O   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。7 r* @; ?, w3 p7 A1 D; R3 S
2 T' o  ?: p9 z3 `! Y
void GetWmiInfo(TStrings *lpList, WideString wsClass)
9 n# Y/ ?& U5 ]" D/ o8 ^: `{) p# W+ A0 _5 \% n! v( K
  IWbemLocator *pWbemLocator = NULL;$ A, X/ W# U: i* u2 q4 }: C* S
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)# K! e, @! e* z1 ~( B& a/ M! ?$ B
  {& z* Y  C8 V- a, G0 [5 D/ l
    IWbemServices *pWbemServices = NULL;# C' C1 M' c- q, T+ m' F4 n! W
    WideString wsNamespace = (L"root\\cimv2");
* v- j$ t& K& v0 v) }6 \2 v     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)3 V6 Y0 f/ h! U- N
     {
4 s) G) S0 n  T1 X        IEnumWbemClassObject *pEnumClassObject = NULL;9 R  {* s* \& i9 G$ ]& h* j
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;" ?, ~$ c/ P) t6 _( G, ]! a
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
. V. f) }8 ]3 o3 |2 W! \+ P" P" M8 T$ C         {% R! C- |0 c3 `3 }, S
          IWbemClassObject *pClassObject = NULL;
* L+ f" E! T7 _7 G* H( q5 K           ULONG uCount = 1, uReturned;  q* o+ Y5 }& W4 u5 N" \! n
          if(pEnumClassObject->Reset() == S_OK)
" b8 V" W$ q' O8 s            {8 E1 R* w4 w& i: a$ h
             int iEnumIdx = 0;1 [! i2 Q. _( g0 _: W1 b
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
  s8 q7 y6 w6 t/ g: w               {
( G9 \2 y" P8 f/ @( F% K                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
& p. R5 O7 x" o' Z$ O  K" \" c6 o; \& t
( D8 l  E1 S& N( ^3 x; g8 p  t                 SAFEARRAY *pvNames = NULL;. W& m& ?1 z! t
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)$ \" F# I/ A3 n  M
                 {& a6 x. G# Z2 p% `% \$ D, b
                   long vbl, vbu;6 [' y4 u0 T& }7 I/ h
                   SafeArrayGetLBound(pvNames, 1, &vbl);1 o, N6 x/ b& ?- m$ P7 q" I
                   SafeArrayGetUBound(pvNames, 1, &vbu);/ |7 H. W- h' p* \. |% {
                   for(long idx=vbl; idx<=vbu; idx++)
" ^- H3 Y) I" `' f                     {) ~5 j$ a+ V7 q; z) f% V+ b& _* M6 h
                      long aidx = idx;
- @1 d* L" m4 o, ?" h* ~                       wchar_t *wsName = 0;
2 x9 ]0 V5 ]4 P7 k6 q* @                       VARIANT vValue;
8 Y" o/ p  @- Y2 [6 W# j) B. L6 k                       VariantInit(&vValue);
2 M+ `& ?' Q& T7 E0 d                       SafeArrayGetElement(pvNames, &aidx, &wsName);
8 {( @4 Q  K, I" C
) {" Q/ p1 O- N7 Y! \                       BSTR bs = SysAllocString(wsName);* }2 ~0 [- o! \% q) p
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);6 C4 c0 w0 r: ^$ R, O
                      SysFreeString(bs);* U6 ~; i* @% [: V% n9 x3 M7 M) Q+ A
, q5 j; o$ W$ k5 r. C
                      if(hRes == S_OK)7 C; D' l. E7 G- z) x% _" a# ^
                       {
, N0 {$ ^: f, T0 C6 m( n                          AnsiString s;- [" c# X. s$ M1 I7 U
                         Variant v = *(Variant*)&vValue;
3 N% w4 @" ~* D: U0 V; g2 S2 g                          if(v.IsArray())
, K5 ]; l% A  V' M5 b% }- O8 ?0 y( h2 p                           {
. I0 K+ Q: G- v1 W                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)3 T0 U- r- \. z8 H" o2 e
                             {
2 Z) z5 R8 Y- T0 S) W7 `                                Variant a = v.GetElement(i);
/ i$ ?9 |" K. a8 W$ n0 D                                if(!s.IsEmpty())
  b4 u6 {! o9 w. L1 ?7 R                                  s+=", ";) U; j. i' s. o
                               s+=VarToStr(a);! u& h, Q( Y0 u
                             }7 |9 }3 G5 ~/ y: j& i. K
                          }4 H& i9 J3 d, [% D4 s2 V$ [
                         else$ [  Z& x: X& W8 M  [( y
                          {
; [2 F! a+ q  x8 K( y9 U- {                             s = VarToStr(v);
$ ]! N2 j0 J, c                           }
$ ^# i6 U5 L, F0 `$ }0 i, L+ |                          lpList->Add(AnsiString(wsName)+"="+s);
( q) V% b+ m% S0 Z/ j* r0 V; e. ]                        }( K7 @" G& [4 x0 e
: a* {4 U7 J5 T( L3 a
                      VariantClear(&vValue);# @; [8 F& |- x
                      SysFreeString(wsName);# b- r# s: E2 a+ C8 `! `
                    }
1 y* _4 \6 l( F% ]' u- ]( Q                  }
& b& d5 ]6 A+ g, m                 if(pvNames)SafeArrayDestroy(pvNames);
5 E; m, @+ ?$ O3 i* Q  z                 iEnumIdx++;- U( h4 @) ^2 Q* K' P- D" V2 `( m3 B
              }
% ~" s7 w2 s# H8 `            }
9 \) H3 M0 l5 m/ Q" y4 G" v+ t           if(pClassObject)pClassObject->Release();9 r# B" M1 q' H) y# q1 _
        }: m/ N5 q$ g( i( o) b+ ]
       if(pEnumClassObject)pEnumClassObject->Release();" e9 ?( m, N3 ^: l& k
     }" c) y7 E/ A' o  a0 a- T8 i
    if(pWbemServices)pWbemServices->Release();
* C( ]" l8 Z8 `) n" i- I6 l   }
3 h( O( f$ P, j5 p9 g" N  if(pWbemLocator)pWbemLocator->Release();  b( K; b% @- ?9 _2 j
}  Z5 A+ V" i' N1 Q4 x1 b
//---------------------------------------------------------------------------
7 A9 @3 B7 S' G% S% q# R2 h6 S
5 ~$ O0 A$ M; e/ c// 通过 WIN32_bios 获取 BIOS 信息:% t3 H) d3 R5 T& U3 V  y
void __fastcall TForm1::Button1Click(TObject *Sender)% I2 b, v7 e4 Y
{8 ?/ e* ?  E, `6 I3 o7 {
   Memo1->Lines->Add("================== [WIN32_bios] =================");/ M% g% x* r& J: Z$ i
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
7 q8 }& P( H; N) G9 B* O9 t    Memo1->Lines->Add("");0 n  T8 y  B6 _3 ]
}
- }2 _' m% J* [9 y. C% M1 V% u" t# l5 k/ w" f
--------------------------------------------------------------------------------3 B0 c- m4 J+ L  r7 e$ b" v

' d* W8 R; c' h, ^! f( z5 [WMI 可以访问的信息类型有:
9 E1 {3 @& p* f% X8 K   Win32_1394Controller
2 p  o: U9 }  u/ P1 G- f; v   Win32_BaseBoard& B: M3 f/ \8 U9 g
  Win32_Battery
5 u; l: H6 T2 ^. V) _9 J: s   Win32_BIOS
  T  [! c- `; `  u% y   Win32_Bus" W+ w2 Z% W  A7 [% u2 x/ X
  Win32_CacheMemory
+ N$ t- j- x0 Y( U8 F   Win32_CDROMDrive- e9 q" U$ {7 [0 R' h+ A3 t
  Win32_CurrentProbe
7 p: ]+ k5 d% M3 P4 z1 U  w   Win32_DesktopMonitor
0 u; a% T/ Q/ M   Win32_DeviceMemoryAddress! K9 `( D: A9 P& a9 ]  I: p
  Win32_DiskDrive
2 A# i: H3 b" ~4 R8 e) ]: o( D! r   Win32_DisplayConfiguration2 }+ a$ b# m" _9 s; {: g
  Win32_DisplayControllerConfiguration8 w3 C. ?% {# S0 D$ b( O
  Win32_DMAChannel
8 H4 W7 O. T  x7 q' h. [4 C7 m   Win32_Fan
& W0 |! V- d  K2 s, r: c- r   Win32_FloppyController
9 |5 v) T/ |1 G% r' M* ~* w4 }/ t   Win32_FloppyDrive& s/ }) A1 M6 W4 u0 c
  Win32_HeatPipe" i5 C  f+ j$ g/ E6 v
  Win32_IDEController# q  L8 b9 B+ F$ i# {. O0 b
  Win32_InfraredDevice
  A- e  M! y9 j) r* ~   Win32_IRQResource
6 m0 [/ Y$ W; y4 ~: T& z" s' o   Win32_Keyboard; m" m0 s2 k* a7 @  }
  Win32_MemoryArray
2 K) ]- B4 B! b( R   Win32_MemoryDevice
8 u) g% l3 |1 b6 n: p# I   Win32_MotherboardDevice2 s% ?0 D# b) P9 H9 f
  Win32_NetworkAdapter6 t: u' m; [. r3 X# p
  Win32_NetworkAdapterConfiguration
9 Q: m: {( o8 l+ M7 Y" p   Win32_OnBoardDevice
- I7 N6 m& ^' N% v/ Z$ m% a. d   Win32_ParallelPort2 X& E9 F( \: O% U
  Win32_PCMCIAController6 L+ ]! G9 a8 ^. z' P7 m* Q$ X7 l
  Win32_PhysicalMemory
$ M, V- G7 C  i% R, g   Win32_PhysicalMemoryArray$ F* d2 o  _/ x# [  `4 K9 _
  Win32_PnPEntity
8 H3 w+ N. i4 A; g, J# a# v9 q2 F+ U   Win32_PointingDevice
. Q, e, d! O0 I   Win32_PortableBattery0 ]5 p  m) I- d- Z! p  `
  Win32_PortConnector6 V( Z7 b* F% w
  Win32_PortResource
3 w& p$ d/ ?4 ~3 I$ @% F8 R& J# x4 s   Win32_POTSModem8 W7 M! W: K/ X' K! G
  Win32_PowerManagementEvent8 c# p) L* \) [* d1 B
  Win32_Printer* I( F% W; \5 r: w8 c3 u! `
  Win32_PrinterConfiguration
5 [# P, J/ C  @   Win32_PrintJob
, h8 c( G/ _# R5 P   Win32_Processor6 }) p4 U& N% ~/ U* f- i$ X
  Win32_Refrigeration3 @8 S7 |$ j5 ]; x; ?8 J
  Win32_SerialPort
( y+ e/ e" Q+ ~# B7 j   Win32_SerialPortConfiguration
3 Q! i5 u! J- N   Win32_SMBIOSMemory/ O5 Y. y+ z0 P1 T; t
  Win32_SoundDevice% Q1 x0 P3 d* A* H6 _0 p% D
  Win32_SystemEnclosure5 l% C8 o2 {- L1 {- g, N+ [5 h. A
  Win32_SystemMemoryResource- ]. Y/ d4 ?. U$ ?+ j2 ~" @5 G
  Win32_SystemSlot' [+ C# d) K9 t$ E- E8 h* k$ w$ E
  Win32_TapeDrive: p$ [' A7 H  L8 B- m
  Win32_TemperatureProbe
2 @( q: z8 \' T5 P8 l& K) ]# A   Win32_UninterruptiblePowerSupply
: A( v2 o4 d" m5 |, ]5 O! @   Win32_USBController
5 o. G: Z# ], f0 u   Win32_VideoConfiguration
* s, k; x( g% L1 u2 J1 X1 y* j   Win32_VideoController8 q& H1 l* \" _5 i+ ~/ r/ Y: I
  Win32_VoltageProbe+ J) s& {5 J; ?, u; ]3 e

1 y8 y# `7 [# O1 c以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-22 22:04 , Processed in 0.018520 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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