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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
9 S0 U8 [7 _3 N$ e; t* O' C# K" `7 k& C

; a5 M1 \3 ]: M+ S0 S) i--------------------------------------------------------------------------------9 P9 a6 j- Q1 x5 l: E
WMI: Windows Management Instrumentation (Windows 管理工具)# [' n" R! d  C0 B8 x* y7 ]$ C
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。
; M6 Q7 |& N+ h- s! {2 y5 V   利用这个工具可以管理本地或客户端系统中几乎所有的信息。
$ w7 o- Y: J2 A) x( h- ^' K   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
' I7 S- \7 J/ e1 L1 ?2 M6 F" [; b, ^+ r5 ?$ c1 I( l% U
--------------------------------------------------------------------------------3 o: r# Q' y6 ~7 w. z
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
! L" q& u8 o+ |' z9 v) C! u* b! @' ^5 Q
--------------------------------------------------------------------------------
" E! @! L0 b/ x' q" i; _! z① 初始化 COM 接口:3 R6 m+ V# I9 x4 j5 b/ C1 L
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
- R* N/ |* {; a$ x% B0 \* [   这两个函数在 #include <comdef.h> 里面定义。# j! W3 {* x% Q9 d7 |% I$ \/ o

2 @) B+ p# `. b3 E' t: a9 a6 t② 获取访问 WMI 权限:$ N. D+ R6 f( Y" l9 K
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
+ m6 S3 ]  w+ [3 N/ j) Y+ R   如果这个函数返回 S_OK 获取权限成功, 否则为失败。0 j6 P% o. g+ Z3 x$ M9 ^' O
1 P3 R* s: E. p& P2 e8 b+ m' e+ k
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:$ I' h5 i' v# r5 g) N
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。& R$ W, B+ }/ Y% M+ Q
# z. n9 j0 E+ [* q/ L
void GetWmiInfo(TStrings *lpList, WideString wsClass)& L% [' Q3 O4 _0 q; l$ o
{% D6 S% d2 C  O# ]3 }! F- I
  IWbemLocator *pWbemLocator = NULL;
1 [" n: ]& n1 m4 l1 t  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)  L8 q! _% c" P5 S8 \# m+ V
  {
, v% j+ X% a- ?3 m# g6 R3 s. I/ ^     IWbemServices *pWbemServices = NULL;
2 D9 r' C$ i7 ?! A) P5 h! S     WideString wsNamespace = (L"root\\cimv2");+ W( t+ Q0 K% D9 m' r8 O9 z
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)8 p+ P1 O" ~. g+ R' w+ }! m) X# \' a, z
     {" h# |- [' i  Y7 m7 \+ H
       IEnumWbemClassObject *pEnumClassObject = NULL;
2 q( u4 s' T# n: k* w! d        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
0 ?! N( ?+ o* g        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
5 \; j; C' {: ]+ N         {1 g" P, k% b" s! D! d: `. C
          IWbemClassObject *pClassObject = NULL;
! B# `6 c3 e& {( _0 F. Y7 M7 V           ULONG uCount = 1, uReturned;
! E! Y5 _! o( M* U* O           if(pEnumClassObject->Reset() == S_OK)
4 B3 Q5 Q; ^$ n6 D- s$ T            {/ [, H$ j8 u8 t0 }3 u: c/ w2 H/ l
             int iEnumIdx = 0;9 I+ h" r2 F0 S. j- h) I
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)5 b! A5 x( Q* I1 i9 j) o" M$ _4 Y
              {
: Y2 N( o; C; G/ A( ]                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");1 F* @6 ~6 W% B$ D# o2 H

6 a. J( \$ d4 G9 S                 SAFEARRAY *pvNames = NULL;8 D) Q% A" Y. u% i
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)& k/ J2 z( j* I7 r, h5 Z5 T
                 {- O$ b) Q) j: J
                   long vbl, vbu;& S9 N5 N" @' k7 X! }. l6 q, V
                   SafeArrayGetLBound(pvNames, 1, &vbl);
+ E( k9 z7 J+ C6 ~) h' i3 a. k                    SafeArrayGetUBound(pvNames, 1, &vbu);
5 u% v* S- b2 l  l                    for(long idx=vbl; idx<=vbu; idx++)
) w: u3 t! Q( m3 L                     {
, a& U( W" Z3 Y$ @4 {" D/ j                       long aidx = idx;) Q. p. D5 b, ?. b: P
                      wchar_t *wsName = 0;
% K; _# \6 I& a8 H" q! ^                       VARIANT vValue;
) A! z& g: k- H0 ^                       VariantInit(&vValue);
% l$ E' s; |- Y: d- M                       SafeArrayGetElement(pvNames, &aidx, &wsName);
; i8 G1 M' ~3 D9 K, |# x
& c* k. K5 J6 ]# E1 ?, x. s8 I                       BSTR bs = SysAllocString(wsName);6 M+ p# {$ Y* M, M& C5 C
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
0 R1 Z& s/ ?+ n! s0 m1 q                       SysFreeString(bs);3 F1 H8 N$ [; r% \3 O! B& S
5 ^" }& j/ d2 e
                      if(hRes == S_OK); n! h& W3 L( ~$ N5 |
                       {5 X) W. _7 T& p
                         AnsiString s;
: E; j' Y, E% G0 H                          Variant v = *(Variant*)&vValue;
& D8 u# U3 |% H                          if(v.IsArray())) h, H4 `& Y' r* s0 j  j
                          {' R6 {. ~# |! j7 u* J/ @: @: _3 b7 T$ ?
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)9 k1 ^6 W% u: }  t; c0 ^; a6 C
                             {# I- u2 p1 T1 i* ~1 _
                               Variant a = v.GetElement(i);
" r, ?5 `" P: t3 d                                if(!s.IsEmpty())4 D4 M% m. M8 V( R% {/ d5 ~+ e' U% R/ z
                                 s+=", ";7 V: m- S: x  s1 T# Y) w
                               s+=VarToStr(a);
( G* [7 a! p) k  y                              }
+ x/ t% d; y0 ~                           }
0 I+ F8 T/ b3 Z# S/ B                          else/ k4 k+ \6 Q- p. W. C/ m; S
                          {
; j: J3 k- S. O* L4 P/ W( f& ~                             s = VarToStr(v);9 H7 k/ T- n$ W8 a2 X
                          }& n/ H, W3 U8 T  E; H
                         lpList->Add(AnsiString(wsName)+"="+s);, M) @% U3 h6 r+ v; ^( V0 W% W$ Y. r
                       }9 N0 g/ S$ X: A/ W* A; j
1 s2 D7 g" ~& l; a' B% ]
                      VariantClear(&vValue);
- J+ `# [5 u7 N& \$ z! k. X- v                       SysFreeString(wsName);7 K/ [' ^8 W  R! }4 s& s$ a
                    }5 A& ?* G( \' X
                 }) ~. B' ?) b: y! Z: l1 x
                if(pvNames)SafeArrayDestroy(pvNames);
" i( A1 M- t, a8 U& Y! e                 iEnumIdx++;
0 j" i& e+ D. J4 j$ ^1 X' S9 n               }
: n; G  v4 V$ G6 W5 m            }/ m3 c# K. g( ]- [2 p8 v6 B$ H+ G
          if(pClassObject)pClassObject->Release();
; g" H5 G/ f8 C( n, W         }: _5 H+ T. n- I7 X
       if(pEnumClassObject)pEnumClassObject->Release();
% [7 w2 Q; [$ A$ a4 |5 K+ P5 Y! p      }
/ {6 Q% u" {" E+ K     if(pWbemServices)pWbemServices->Release();
  S) A! L+ N" Y. T# U4 o8 D   }
7 |% j. ?* g- s  if(pWbemLocator)pWbemLocator->Release();4 v* f' a% J+ Z$ e. }7 v
}7 M; Y2 }; M. k, }; Z$ _
//---------------------------------------------------------------------------
8 p( ]. K/ }* \! V8 I5 t# R4 M7 P! m- n1 y! W
// 通过 WIN32_bios 获取 BIOS 信息:
  P% ^) x  u. ?; s  A1 T4 Rvoid __fastcall TForm1::Button1Click(TObject *Sender). C8 b( j% z$ [) B
{/ [) c0 `; ]/ G+ d6 Y
   Memo1->Lines->Add("================== [WIN32_bios] =================");! t& ^1 c2 C! V  v& F" Z6 W
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
/ F& P/ g  `  o    Memo1->Lines->Add("");
/ b3 ?9 m- }; r2 n}
, Q% M; r7 M8 E) T9 G1 w/ M* c) \, }( g# B& l. a4 s6 v, u2 M9 a6 m4 P
--------------------------------------------------------------------------------
) f7 X- m$ O  B0 v7 }8 T1 r) _- h* \) i  O0 I& @% v
WMI 可以访问的信息类型有:
8 W# G( I: ^( n8 H- H   Win32_1394Controller, ^7 d! m4 m; I  f! N6 d, p
  Win32_BaseBoard
0 o$ N. F' n: z% `2 J5 U   Win32_Battery
' ^6 _. N, {: T& d  O8 ~   Win32_BIOS
/ l( I- z2 S& @: i: H   Win32_Bus
( Z0 m1 |" Q6 |8 c% N1 ^   Win32_CacheMemory. V8 b+ |- q5 p! }- i
  Win32_CDROMDrive5 S8 j. }! Y! ?. C
  Win32_CurrentProbe' j- N7 Z! l7 d7 T5 ~
  Win32_DesktopMonitor
$ B: P3 X1 q5 A) K5 J( ^   Win32_DeviceMemoryAddress0 K' n7 f1 n8 K
  Win32_DiskDrive
* A& U/ x5 ?; u$ r5 E   Win32_DisplayConfiguration9 [4 M- }7 P. ?6 p3 n1 c
  Win32_DisplayControllerConfiguration& R: B) E: x9 I: y
  Win32_DMAChannel, H6 n7 C6 o1 T" g9 y- H
  Win32_Fan
! d: G3 q, \/ ]   Win32_FloppyController
" F/ h4 I" a, U   Win32_FloppyDrive1 K$ z: i9 t5 j: e: R9 P( w
  Win32_HeatPipe
9 Q( C2 ]" y: |  j$ g   Win32_IDEController
  N/ q2 |, u" N8 p: P4 M, R   Win32_InfraredDevice: r6 t; I6 [1 O% s, o
  Win32_IRQResource
; q7 j! D) I$ r5 L   Win32_Keyboard9 v& M  t* Z# i6 \5 _4 J
  Win32_MemoryArray8 ?2 z; I# }  x- y/ a6 ]
  Win32_MemoryDevice' S4 C! \# G% i1 ]! z
  Win32_MotherboardDevice1 A9 ?' x8 J, D' E! Q5 f
  Win32_NetworkAdapter
) w: S/ u# n6 t2 b+ V3 U/ E   Win32_NetworkAdapterConfiguration; P, c0 _6 `+ W0 S9 Y& `% u
  Win32_OnBoardDevice
/ T% S, Z# _1 b   Win32_ParallelPort
/ v1 W, g& i) `   Win32_PCMCIAController
  \2 l/ k$ ?2 X! f& ^   Win32_PhysicalMemory! ~/ |8 ~- B7 c( _* i! x+ `6 P9 ^# r
  Win32_PhysicalMemoryArray: X' Y  N& L+ `$ f
  Win32_PnPEntity8 W1 p4 r& ^; W! ]  M7 I
  Win32_PointingDevice9 C+ I1 ~- @7 l2 h7 L
  Win32_PortableBattery# c+ [) R8 m' p. ^6 e- b
  Win32_PortConnector  q2 h2 e5 @! ~0 W' z) e
  Win32_PortResource. C& |0 t3 q% Z! ~( E% L# o
  Win32_POTSModem# o9 |7 l! |  c. J- P
  Win32_PowerManagementEvent( L. U% B: x+ }
  Win32_Printer
2 J, @% l( a6 N$ Y# J: g8 y$ u   Win32_PrinterConfiguration) d3 n5 o# I- |# b
  Win32_PrintJob" x. Z) c' r6 `" E* k4 L% ?
  Win32_Processor
$ L. ?' V1 j( p   Win32_Refrigeration
' C# d# R+ j" N+ g8 x4 {1 l   Win32_SerialPort$ ^' k# y( g. Q( p# P5 l
  Win32_SerialPortConfiguration* O7 n+ `0 v2 A. u( c# O! w, E% |
  Win32_SMBIOSMemory! n* E# }% R( x$ b- l& ~
  Win32_SoundDevice
/ k# r( e7 L; s6 I  B1 a  k. @   Win32_SystemEnclosure0 _: l" H  r- e& r$ I1 C. z7 {
  Win32_SystemMemoryResource8 n  z0 Z& h6 x  [$ T
  Win32_SystemSlot+ }. `5 |& P+ _. e* ]
  Win32_TapeDrive
, A. ^) ]5 ~9 \- g   Win32_TemperatureProbe' T3 F: H" x3 b+ B
  Win32_UninterruptiblePowerSupply
. o( j  I7 z9 H3 z3 X6 ?3 R   Win32_USBController
7 o0 i( v' m/ m- h* L  i7 U; w$ `   Win32_VideoConfiguration
) z+ }6 S/ Y* T6 d1 I( _9 Z9 |   Win32_VideoController
; h" P- L$ g4 a* W" c) z! o* z1 r8 q   Win32_VoltageProbe( Y' J5 S2 x$ w8 E7 A6 n+ _- c
0 U  r- m" X! c
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-30 20:15 , Processed in 0.019560 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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