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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)& o7 K8 Q3 L/ n
  G8 a' G' ~9 Y2 V3 [- ^
+ w; o+ m5 C& H
--------------------------------------------------------------------------------
7 e( x% w- r- X( W5 F" J; |WMI: Windows Management Instrumentation (Windows 管理工具)* u4 V3 s" y9 T- q
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
% m" R9 m4 C- a  ^3 d   利用这个工具可以管理本地或客户端系统中几乎所有的信息。: @: L' C, ?8 l) F- y
  很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 , x& y7 L' i2 z* w% L5 a
6 p( w, j* y) f' ~% x, c9 }0 k- N
--------------------------------------------------------------------------------+ n: J0 K) s9 U/ w: b* q, B
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面& p$ {1 A6 B- i& [. t4 K9 X( N7 U9 D' r
  ~2 s( ^$ ?" Y7 Z+ U' i& E9 N+ Z
--------------------------------------------------------------------------------
3 s$ F: k0 b+ W① 初始化 COM 接口:* [2 }/ O, Y" X
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
6 B+ G" g; |& |8 S9 [- \  Z" T   这两个函数在 #include <comdef.h> 里面定义。
$ ]# x* a/ f+ I  ^  q* ^+ s  j& k% T: v0 b, \# C
② 获取访问 WMI 权限:
& m- @- X7 L; Q6 s   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);2 z' q) O4 Q$ ?+ `3 R
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
3 f" {9 I" g( u1 ]4 @' Z/ _* B& K
! Z+ ~+ k4 Y* b' x③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
( }% @& f7 M7 Z' F   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。2 C/ i) Z$ u) a) g9 e2 q

/ A/ p% i, e) x, O4 \3 S5 h' Dvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
* K: \+ z8 l% H' |{
! Y! O8 M1 S1 \% V! }% g4 R  IWbemLocator *pWbemLocator = NULL;& M3 N- t; P( T/ g2 l# x
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
1 w$ u/ z* f6 G8 _3 ~, u) F   {
) K2 y8 b0 y% F     IWbemServices *pWbemServices = NULL;
& B9 L! j+ R/ j7 {7 r     WideString wsNamespace = (L"root\\cimv2");
: H, p: a1 u- w% G/ e     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
& T0 R, b# g3 J# E7 o      {
7 o2 [; K, Z6 p2 X# X. Q" |; M* d        IEnumWbemClassObject *pEnumClassObject = NULL;+ {: p) j* r; ?5 a
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;& P$ v0 q4 a4 ]3 j+ }& H
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)3 ?: i3 V1 \, z& y! A0 R! ]0 E5 L
        {5 Y7 b+ x1 D3 `2 X, `
          IWbemClassObject *pClassObject = NULL;3 k8 O3 e7 L9 f6 h- [& ^  Y1 C
          ULONG uCount = 1, uReturned;
2 \0 s8 Y. o* h           if(pEnumClassObject->Reset() == S_OK)
) a/ j8 J- |8 D8 }; o+ d, b* ?6 X            {
4 y9 t4 e. Q0 ^7 ]" g* T6 Z              int iEnumIdx = 0;
; y: f/ c" C. z+ d              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
: n( l( i3 F6 ?) Z  B9 Z               {
- ^" o) v: F% S' |; F                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");* a5 ?0 {: v' a
9 X# U2 i# O1 p8 d% W! T' {! j, X- h. [
                SAFEARRAY *pvNames = NULL;
, Y7 r& ?  w5 ]7 \: P                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
2 V  ?: ]! W% o3 [& Y                  {: \2 g! f& v/ W/ I5 i
                   long vbl, vbu;
. E% ~6 O" l& Y0 [                    SafeArrayGetLBound(pvNames, 1, &vbl);
$ B, Y/ [% z$ p# ^$ L9 A$ h                    SafeArrayGetUBound(pvNames, 1, &vbu);. @( r. y" R5 E6 i% o: n/ I6 b4 e
                   for(long idx=vbl; idx<=vbu; idx++)
7 X# O$ I1 t* l$ \: m                     {
. B$ |# Y4 ?, i7 x! C                       long aidx = idx;
% x6 s6 o7 }* h8 y' b                       wchar_t *wsName = 0;
- u1 _; z  E0 z# x/ Y+ m( h% @                       VARIANT vValue;7 o2 x; r5 D5 q0 m7 T
                      VariantInit(&vValue);
0 d$ t0 M; N( p; X% t                       SafeArrayGetElement(pvNames, &aidx, &wsName);
1 Q! S" n) L9 F" ?
  m/ n* T. Z$ U& o: P6 u" ]% w2 s                       BSTR bs = SysAllocString(wsName);. S2 K/ V, @4 k+ @+ E) r4 v
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);6 u5 j: a+ m: K, R
                      SysFreeString(bs);
3 a3 _* V6 q# c. I1 m: H$ R0 [/ r$ H) p3 N( {; k, n- [) z
                      if(hRes == S_OK)8 D" b1 n$ R$ b. c% }% }6 y% l1 m4 }
                       {
$ @2 k3 r4 A) x                          AnsiString s;
  a$ y. E: ?$ y* l4 H# a                          Variant v = *(Variant*)&vValue;
  Z( u5 q& D7 [                          if(v.IsArray())  I+ h$ j. I2 v% D# z3 l4 r
                          {$ L/ G& G1 D3 x/ M! u
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
' ?. v2 T" b1 T; y                              {4 _2 }" J# g. l1 k
                               Variant a = v.GetElement(i);
. i& X( Y2 p# c- b4 V" ~1 a% l                                if(!s.IsEmpty())/ k% |; ]  r/ H1 c/ ~  ?
                                 s+=", ";
( P0 @1 L  m6 ?; I- F& _6 D                                s+=VarToStr(a);
* l% E/ U6 p) o' ~- j1 [; b# K/ q                              }
; e4 D: m, z4 b* Z                           }
- L+ C6 B. |/ k! @9 e                          else: }6 K# ^4 g9 M  b5 @
                          {" o2 q* p2 ^" f8 J! J3 l
                            s = VarToStr(v);
, Z' k4 L8 |4 y: A  \' I                           }2 ^% L7 r7 O$ L/ f! X: J
                         lpList->Add(AnsiString(wsName)+"="+s);
* u' ~7 j# p" l' c- {' W                        }
4 D7 j4 E  _8 @0 k$ K$ }0 c  J( [, L7 c' c4 D  ?: r- Q
                      VariantClear(&vValue);
2 }& X) S9 n7 f2 e/ |% L                       SysFreeString(wsName);
7 P- Y9 h. N: N6 u& _9 o% [6 V                     }
% @3 U, A6 }4 c                  }. U5 H, ~. z$ x* ?& @' B9 z
                if(pvNames)SafeArrayDestroy(pvNames);! a& f  t9 q( V' C
                iEnumIdx++;* ^9 T$ m: O% A/ |5 Z
              }; N$ N$ `+ H8 V" h8 ~8 b
           }
& k7 R4 c9 g& E% i  g. f! o           if(pClassObject)pClassObject->Release();
5 n6 |7 j6 `! v' ^0 V2 K* j( u( d         }  m/ ]! L+ ]: Y. j0 X
       if(pEnumClassObject)pEnumClassObject->Release();
. M* _$ ?' q5 P4 v4 B4 ^+ U8 @+ H      }
$ f1 b1 s& p3 G. |2 `4 O; E     if(pWbemServices)pWbemServices->Release();% D7 u1 o  g$ L$ g2 n
  }( B( P$ b0 n9 ^6 F
  if(pWbemLocator)pWbemLocator->Release();" i! A' b) t+ F
}
. S$ k$ S: \. l) Z+ g& P//---------------------------------------------------------------------------
+ Q$ B. z5 A, p6 M0 Y
5 b5 g3 |, Q( \: {4 ^, A1 d1 B// 通过 WIN32_bios 获取 BIOS 信息:) W) b6 q6 G  {8 Q1 l% V
void __fastcall TForm1::Button1Click(TObject *Sender)
7 \6 n/ |, H- }, G- P$ [! H{
4 }, P& Y% N* I3 }  y    Memo1->Lines->Add("================== [WIN32_bios] =================");! o+ k  r4 i3 h+ `2 v
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
2 y! j) V) y( n' ^# P( x    Memo1->Lines->Add("");
4 |" z' u" G% N1 B}; o' x  k" F3 L% R; p: ]8 B
' q& r0 v$ A  M/ J- Z
--------------------------------------------------------------------------------1 q$ n% I0 b. o- O
6 H5 z% B" P* r, r+ l0 c
WMI 可以访问的信息类型有:8 |5 p  \8 T8 O) F3 k8 G
  Win32_1394Controller
" Z7 l% u% [+ U! i   Win32_BaseBoard
5 n; M! k! Y" X* n/ {% D   Win32_Battery
* ?2 y& ^4 B( `' Q0 M! p   Win32_BIOS
, R$ H( x; j6 p8 H* Q. b& H' w   Win32_Bus
, Y0 {/ a. L# M+ z2 e   Win32_CacheMemory" b3 k+ v5 [6 \1 R- o; t: `
  Win32_CDROMDrive
: i4 M- a2 \% O7 j( L7 F5 V   Win32_CurrentProbe
! t5 N5 E8 R% j3 O: L2 |' e   Win32_DesktopMonitor
3 u3 R( ?- I5 i  h  C( S   Win32_DeviceMemoryAddress) S+ ^! o+ \2 A/ e' N
  Win32_DiskDrive; {5 m+ m, P! l6 A1 Z
  Win32_DisplayConfiguration
# o$ V5 d3 u) m. {   Win32_DisplayControllerConfiguration0 w* h1 }( w# v- o
  Win32_DMAChannel
- r9 K: h7 A, D, S' o1 s   Win32_Fan3 z/ G( y" r0 z( Q! o* {% N
  Win32_FloppyController2 i) _4 p* Q+ \
  Win32_FloppyDrive' e( b! D$ E* ~2 L  s
  Win32_HeatPipe, e# H3 R. T0 L+ f" [
  Win32_IDEController
/ `7 A+ }/ U1 H' c   Win32_InfraredDevice
. y' i2 v' U9 E& x3 J& }# e$ F   Win32_IRQResource7 y. z, ]+ }1 i- |9 M
  Win32_Keyboard
# d8 J% \( s8 i   Win32_MemoryArray
: G) |( r% _% e: y/ ?. u) E9 J   Win32_MemoryDevice
4 }1 \" P0 z7 h. R; V0 L/ b   Win32_MotherboardDevice) a3 v8 c% |3 P  ~& `& a" g6 Q1 d
  Win32_NetworkAdapter
( O8 V; |: }; O* ^( @/ c+ P   Win32_NetworkAdapterConfiguration
# Y0 P; O2 }2 f   Win32_OnBoardDevice
1 F4 P5 o' z: B, ?   Win32_ParallelPort
- @" |; g3 O# r   Win32_PCMCIAController
* c1 m$ |, r1 J2 l% L5 U3 q, j2 O* }   Win32_PhysicalMemory
' B9 g  m6 v* D# ?) m   Win32_PhysicalMemoryArray# ]7 G- g1 X& @7 ]& C& n
  Win32_PnPEntity
0 j' F$ Q3 t7 H! I   Win32_PointingDevice
9 F2 z/ l, K+ c& R# V& z) [   Win32_PortableBattery
3 \" A" {0 V% w* r4 A& B: u: v   Win32_PortConnector% E  X# A- ]# D2 k$ k" C
  Win32_PortResource$ T4 f0 B: _6 W3 g1 I
  Win32_POTSModem
8 X; L/ K! c8 }7 }  }9 ~: p   Win32_PowerManagementEvent! w! i3 G& E9 h* c+ m* K
  Win32_Printer
7 ~; b  _6 U5 \% r   Win32_PrinterConfiguration4 z0 p: p! i6 _0 a2 b
  Win32_PrintJob
2 N2 B' N% v4 L8 ]   Win32_Processor! e; i& N4 S+ [' Q
  Win32_Refrigeration0 g% I/ R3 ?4 e- G% j- S2 l
  Win32_SerialPort
" J" M( m+ C& [# s$ ]   Win32_SerialPortConfiguration8 x& k# r, W$ `/ D3 j
  Win32_SMBIOSMemory$ [: M0 a; E. R6 J) q3 P9 j& z- W
  Win32_SoundDevice
: Z7 p$ R+ d. N   Win32_SystemEnclosure
1 M& T& }/ t5 P8 O7 L, [   Win32_SystemMemoryResource, |/ f3 ^( |9 f1 v4 s/ R6 Y' e* i
  Win32_SystemSlot  P, A: w$ b% `( ]# O" _9 R- @
  Win32_TapeDrive
  M8 f& I! u) p. n   Win32_TemperatureProbe" k( A% ~/ N- J+ ^0 I  M0 W
  Win32_UninterruptiblePowerSupply
1 R* s  M# h! ~/ x* d! v( U   Win32_USBController
+ @; ?2 S/ f# U# r, R   Win32_VideoConfiguration
& ]+ A& m7 u7 S. z# e' B   Win32_VideoController
4 H2 L4 e. ]" b) L* P   Win32_VoltageProbe0 W1 u: v) e& c
# [' F+ a1 m, G% j# c2 p. f$ y
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-9 09:05 , Processed in 0.020380 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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