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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
' p- K% O: O8 r; }) i; U/ g7 k3 j( G; o, T

8 ]1 R$ x. I1 L5 P--------------------------------------------------------------------------------
( f# x$ v) |( t7 b" {- ZWMI: Windows Management Instrumentation (Windows 管理工具)* n$ I+ ?% v0 a- G
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
+ B8 `0 Q9 E, ?. e   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
: X1 l4 g& V5 Q9 [; \7 H   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 6 f$ H  r+ J, m/ [8 n$ H; O

; n  C" e- O* @* F. X, U- U/ u$ Z--------------------------------------------------------------------------------+ D/ b5 ]) `4 e+ k9 [1 ]5 L
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面9 A" M9 I( a+ C6 \$ ~$ ?
5 I! q5 F! p: b2 Y# o
--------------------------------------------------------------------------------- U+ }  S4 S! U. I9 W
① 初始化 COM 接口:
8 G' n6 x; [* [2 y4 d. B   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
8 ?, I8 x$ d3 v2 s, q   这两个函数在 #include <comdef.h> 里面定义。3 O; T9 W+ ^8 |6 P1 f$ J

$ x+ J( r$ W8 p2 O' A: e② 获取访问 WMI 权限:! Q$ S2 E. U5 m6 S9 @9 o+ e2 M
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);8 _8 y4 J8 D, z  y8 e
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。
) }, v- d7 W; R( S( J  G7 _/ {- r& f( B' k, m: ~
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:6 N. X% s3 X; {& r- s& S' S( h) Y% w1 S" t
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。4 {1 R  j2 b# F- A% F7 I/ H0 ^! G0 w

. b, N  ]5 |* I) ^/ @. i4 @void GetWmiInfo(TStrings *lpList, WideString wsClass)# r' A1 F; V& f# d/ k4 M- W# b% j
{* S# _0 _2 a# C5 j# c/ B4 O) B8 ]
  IWbemLocator *pWbemLocator = NULL;
3 Y3 s% {/ S& S6 T% G" O4 `* A  |  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)" [3 I4 P; Q) C! f9 j
  {
/ K2 c" k$ x/ ?/ r0 J     IWbemServices *pWbemServices = NULL;
( c" o9 T) M6 d9 }1 o% q     WideString wsNamespace = (L"root\\cimv2");
* [) S6 }4 ~8 m& h" O; G" `# Z0 p     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
+ Z, b# D. J2 v$ d4 G4 C      {8 p, `! R, f! S+ n* C
       IEnumWbemClassObject *pEnumClassObject = NULL;
% f& A, a' E1 o* p$ J        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;5 P- k6 ?0 q- S2 v9 ~
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)5 G# w, ^$ n) S, i
        {
( p/ T- G) }3 \8 l           IWbemClassObject *pClassObject = NULL;, c( g% g2 c# W8 T
          ULONG uCount = 1, uReturned;6 e$ _- e2 M' D
          if(pEnumClassObject->Reset() == S_OK)
5 C8 ^9 |/ E& L$ a4 ^            {
% q' v7 S, l+ @; Q. u8 F              int iEnumIdx = 0;
" v, R  L, q( k* ~              while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
; Z( I% m- A4 z2 }/ |! R               {
, E2 n$ K1 x5 I! s7 }) P                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");( U4 F& ^3 I0 i; \$ G

# p# _; p. ]0 D% X0 c) ?( q                 SAFEARRAY *pvNames = NULL;3 z7 ~2 r' j$ k( O
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
* f; w% M9 v; O! D4 s) k2 U                  {
4 u" U) W* t1 O                    long vbl, vbu;$ M" p; }- f, P
                   SafeArrayGetLBound(pvNames, 1, &vbl);1 P, S$ q! j0 ]! a  |& e- R
                   SafeArrayGetUBound(pvNames, 1, &vbu);) J( B( E: i: B1 T# ~* a$ C" n) o
                   for(long idx=vbl; idx<=vbu; idx++)
( v4 A9 n2 p+ u/ T: v                     {
0 l8 J7 B) i" r/ B6 K                       long aidx = idx;
$ D; [1 I+ i6 p  ^! \                       wchar_t *wsName = 0;
# q: R% ^# z$ ~9 K1 ]                       VARIANT vValue;$ G. P- Y. N  P  Q: z5 n, {; \. X
                      VariantInit(&vValue);! F3 S: }* S6 I1 _
                      SafeArrayGetElement(pvNames, &aidx, &wsName);9 i# I$ E$ ]7 s
2 O; Z, d; [: M
                      BSTR bs = SysAllocString(wsName);
, C# b8 ?& u( H& u5 u4 e' J+ [7 c* ~                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
6 i2 I" e& N" g3 L                       SysFreeString(bs);
  c8 `+ @- k; _; e
3 @7 I8 C- u5 W" _                       if(hRes == S_OK)
0 \8 }0 _# w# ?# @/ u' [                        {$ i2 C; Y& V2 Z" J; o( u3 G
                         AnsiString s;
1 E- w$ w% I% I0 x/ s                          Variant v = *(Variant*)&vValue;* s6 ^- l( S% A
                         if(v.IsArray())! |7 O# c# s" z
                          {
5 z( ^3 Y# U6 |; c& G7 M                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)7 \3 Z5 K% [* l. m( p
                             {( B; Z" I# ]2 P: x  T( X6 D: N
                               Variant a = v.GetElement(i);
  v. j" a# P& m. A                                if(!s.IsEmpty())
9 g( u6 \- T- S& {1 }2 q                                  s+=", ";
* E$ f: f/ V7 o1 d! o2 q/ |; p; Z                                s+=VarToStr(a);) p% r: r) ?/ E# z* @. R5 Y) I
                             }
* t4 x: b6 B, t% `( a! [                           }2 u- f5 x& ]- O4 E
                         else5 J. J- W& L+ w) D
                          {
5 W7 {  B; f7 q6 q# R* n                             s = VarToStr(v);4 \. W% O) [/ I' C% g) t) K
                          }
2 ]( h- a1 ^7 b. O* j+ ^, t                          lpList->Add(AnsiString(wsName)+"="+s);
4 j3 f4 F  H! y& M                        }& u% `: O! \9 J4 p

- o) ^& a  D/ n* @                       VariantClear(&vValue);. k# k' v4 @3 f2 ?) L* l1 F
                      SysFreeString(wsName);
3 P  P. c0 U$ @- |                     }! V+ O+ T- t) d
                 }# a- w* ^; b8 k' E( d
                if(pvNames)SafeArrayDestroy(pvNames);- \. u5 D/ C4 i9 a) J: ]3 v
                iEnumIdx++;2 `4 x4 t* N# |. x, V
              }
9 m+ w* @9 L% n) U) H$ }            }
" ~: i) R- X  K2 o) m% z; e, w           if(pClassObject)pClassObject->Release();
+ P" m" J- m2 u$ T( e         }
' w# K/ ^; ^) Y7 z( e6 _! ~9 \        if(pEnumClassObject)pEnumClassObject->Release();
2 p( A; z0 `. N$ n. v0 D8 M) W      }
3 e) P0 [( f$ c1 u" J6 O, S     if(pWbemServices)pWbemServices->Release();5 w0 [/ m4 {3 N1 M
  }
, S5 y+ I  I4 T" K  if(pWbemLocator)pWbemLocator->Release();
( q, o8 b! V1 z, a& J) L2 i: |}! ~* n" o; `" H4 q
//---------------------------------------------------------------------------1 }$ d" O& [9 [6 N+ F

+ R/ S1 W/ L' X// 通过 WIN32_bios 获取 BIOS 信息:
! a+ I4 z6 M. m0 ]4 l' z. zvoid __fastcall TForm1::Button1Click(TObject *Sender)6 `+ x! t$ K8 P- u( m4 A
{
0 N& Q. x3 Z2 C! J/ B3 r    Memo1->Lines->Add("================== [WIN32_bios] =================");9 d& m6 F5 n- D! V
   GetWmiInfo(Memo1->Lines, "WIN32_bios");1 W* |6 j; t+ B* o9 @
   Memo1->Lines->Add("");8 d8 ^) c# H* a, e0 o4 N
}
$ Z' ]/ R! j2 ?) q3 F5 K
! E- F; Q1 ?2 `$ j3 a--------------------------------------------------------------------------------8 p* b$ X% K/ J; ?" v" o

6 H: M  Q' r% z. NWMI 可以访问的信息类型有:
6 ^# Y0 A* {, Z  m& I   Win32_1394Controller
" ~. T0 ^7 _/ l- `% ?   Win32_BaseBoard/ E8 e5 ?7 A9 v: i
  Win32_Battery
" Y# ?2 E/ s) \% l" W3 i' W" t0 y   Win32_BIOS
0 g! |4 R8 J6 w+ R7 k   Win32_Bus: w2 Z* }  W& G4 V) U
  Win32_CacheMemory0 z% ^& M4 @5 V5 N
  Win32_CDROMDrive7 ]# I  O- D% o% H  M
  Win32_CurrentProbe) ]) v4 c% L4 H7 m& P
  Win32_DesktopMonitor, D# l7 L, [$ q3 C
  Win32_DeviceMemoryAddress9 r& k& }; d! w2 K
  Win32_DiskDrive) o5 G% Z- O- T1 C: m2 Z( p
  Win32_DisplayConfiguration/ p7 U  l4 X1 N6 i  M9 G( v' t# ^
  Win32_DisplayControllerConfiguration
5 Z8 k0 T, _- y$ ]5 q; ?) i5 e   Win32_DMAChannel
# A& R6 O7 E3 j5 D1 ?$ V* G   Win32_Fan4 B$ h- p6 ]' A0 t1 {1 m
  Win32_FloppyController
) ^) I. F- B. }. j   Win32_FloppyDrive
( i" [0 |' K$ Q& \   Win32_HeatPipe- A) J  H$ \* K
  Win32_IDEController
4 V* Y7 m' N  M. e, i' d   Win32_InfraredDevice- \4 ^4 s: ~7 N7 V6 M7 \, x
  Win32_IRQResource
. I8 F; s6 Z( `' f9 v4 J: m   Win32_Keyboard5 Q, D* l+ G3 G1 B# z7 K  ~/ m
  Win32_MemoryArray
- G. I! M/ G' t2 W9 ?   Win32_MemoryDevice1 i7 r4 w) g0 R9 }0 R  C
  Win32_MotherboardDevice- i. {& d  W! u9 l
  Win32_NetworkAdapter1 H, m# p; U( M" h: Q7 S; w( }
  Win32_NetworkAdapterConfiguration) F3 p0 a8 C$ T, ?: N; S1 s
  Win32_OnBoardDevice' z- P" z; U1 j8 ~  t$ ]$ M6 B
  Win32_ParallelPort
# |. z- P2 R6 B# r5 w) T   Win32_PCMCIAController
& X3 p4 ?# q  X* S# U) G   Win32_PhysicalMemory  H* a. ~# }5 H, Q$ C1 s! ?
  Win32_PhysicalMemoryArray& `  f: Z+ s2 ]0 P$ b4 R
  Win32_PnPEntity
' M5 L- u: D  t" E   Win32_PointingDevice# Q. @3 j2 Q6 z: h' p5 r
  Win32_PortableBattery
3 ~. V3 q0 u9 s" B! ^) l  |) N* C! |   Win32_PortConnector; h& S% b% T- ]! m/ X. K! L
  Win32_PortResource
) T; j% }) U6 R5 C* p( R   Win32_POTSModem
+ }3 O! U8 z* ]* J/ a5 p  ^8 H' C   Win32_PowerManagementEvent. l% d3 x' O2 L" X$ K+ v5 W
  Win32_Printer
0 Z% ?* ]& z7 m  h) K, @  r' a   Win32_PrinterConfiguration2 k  N# h* j" ]7 i4 Z' B, H
  Win32_PrintJob0 I1 v$ D* x$ ?
  Win32_Processor
$ ^0 I$ Y, c% s5 D: F) S9 w   Win32_Refrigeration
8 z; O+ ^1 k0 B) g) Y( |! i   Win32_SerialPort- R+ F3 ]/ z' L) W+ l1 ^
  Win32_SerialPortConfiguration0 m7 Y3 H. P! V5 N
  Win32_SMBIOSMemory
% d9 B1 p' v. A# J$ E3 E, g   Win32_SoundDevice- y! h3 ]9 c9 L( ~
  Win32_SystemEnclosure
( s1 e6 _- H* c+ r2 w' m; h) i# W   Win32_SystemMemoryResource
4 `$ z* E7 K5 V6 F   Win32_SystemSlot
# J) X; Q8 o: r+ J2 {7 A) n3 ]   Win32_TapeDrive3 ]" Z: x$ ]* t2 v0 T: c
  Win32_TemperatureProbe
/ u9 \1 p7 g, P& J8 j   Win32_UninterruptiblePowerSupply
8 V$ n! `2 v3 C2 H   Win32_USBController3 Y: q& I; P1 U- ]5 [' D$ S$ V
  Win32_VideoConfiguration4 V6 b+ O) R/ ]& T4 m- z4 C' x' a( M$ ]
  Win32_VideoController
, Q, S* J" |9 W, A6 |   Win32_VoltageProbe
/ L. c  g$ H9 b  p1 X' U' ^0 s7 _( p: L! L- U0 ^. H% o. P
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-13 11:18 , Processed in 0.020050 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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