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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
4 l# g8 p8 ~$ q: F) j0 N. p# W9 }! `3 f  P+ T
/ p/ N3 q3 ~, X5 O5 d
--------------------------------------------------------------------------------5 X3 a' H5 Q$ ~+ z' E* Q. r" \
WMI: Windows Management Instrumentation (Windows 管理工具)! \- g, w/ r$ R# m8 I* g
  通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 % @- C0 G3 B* D+ O
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
) j0 D& g- C: [$ f! N2 ^   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。
6 _7 r( T9 @% M5 ~# s8 O9 K& `7 G; q' s2 A5 S4 Y
--------------------------------------------------------------------------------. C3 J( B& i  M4 g
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面! e  h& i9 i3 N+ m$ e! \$ T2 ~
; l1 w. z: C4 w6 ^2 I  p
--------------------------------------------------------------------------------
* E; z  E5 N* o3 o' R( M① 初始化 COM 接口:! H# [' F# c9 u) Q' W, D
  访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
# w' v1 K5 W, y   这两个函数在 #include <comdef.h> 里面定义。. \) W! C4 f. l

4 u$ A7 ]# i7 z% Z# W4 L0 p② 获取访问 WMI 权限:* T0 Y) q3 `9 S+ H8 ~2 {" P* n$ \
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);, y2 x! g3 u7 ^0 ~: m) Z$ t
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。' u+ |6 V* p' `3 m

8 x+ `4 y* E: |' j# B5 D③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:0 n  w* D- W+ g! z
  这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
5 ]1 ?' j/ y$ w1 f) G& R, j. t9 }5 q4 O( j& a8 f
void GetWmiInfo(TStrings *lpList, WideString wsClass)
# \: _$ S- n4 {" G8 b{
" f4 Y; f: G% k3 t  IWbemLocator *pWbemLocator = NULL;2 l2 B- e5 x" I
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
- u# ~1 \" ^3 Y1 V   {" Y; G1 j0 v" I
    IWbemServices *pWbemServices = NULL;
4 k: }+ I" d' k0 E     WideString wsNamespace = (L"root\\cimv2");
6 ~$ B2 N/ [  D. A/ d$ \     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)( @' A; I1 H5 Q4 `
     {/ f) ?: z: G* [
       IEnumWbemClassObject *pEnumClassObject = NULL;
) B8 e: P  v/ w1 g        WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;; F; k# x+ v& S8 Y. o
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
$ e' [3 M. M/ H0 C         {8 h# Q" [5 z! V7 F6 ~. L
          IWbemClassObject *pClassObject = NULL;% C- t$ q6 ?- I
          ULONG uCount = 1, uReturned;( W1 q- k5 [5 C6 k0 f
          if(pEnumClassObject->Reset() == S_OK)
' \* i+ z# \7 u% L- F            {1 n$ J' Y, H) w4 H: Y8 y" ~8 T
             int iEnumIdx = 0;2 p9 x9 V: i3 ?( U3 U9 r& U7 u# K% s
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
2 [' j- u* J5 T' e' I0 v               {
+ W+ x( @3 i1 J) K+ k                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
! M- b  P5 A; G
: p) q- Z/ @. d                 SAFEARRAY *pvNames = NULL;
6 W6 Y3 b0 v3 \1 ~9 s2 M! m                 if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
" t7 B0 R5 \5 i1 H                  {
% E6 B6 N- G) A9 w$ ~2 R2 ]/ q, v3 O                    long vbl, vbu;
. q. t8 v% q  o% H7 i                    SafeArrayGetLBound(pvNames, 1, &vbl);/ P+ O" w  S0 g0 L
                   SafeArrayGetUBound(pvNames, 1, &vbu);6 A. R  ?2 |8 X5 \, G2 r. ^; u
                   for(long idx=vbl; idx<=vbu; idx++)4 Y0 L( l0 t/ A+ h
                    {' a( D* ]. q" ~, L1 o# J$ P
                      long aidx = idx;
  n5 m' n! |, }( C, y                       wchar_t *wsName = 0;
  N8 @& Q1 {: u: S; \" Q  T1 Z7 I                       VARIANT vValue;
; d* i& A- J+ \2 o) T                       VariantInit(&vValue);& T+ X- W$ D: S4 w  E
                      SafeArrayGetElement(pvNames, &aidx, &wsName);
9 x1 n$ k  J$ l- A. ~' l/ k: [2 D2 c2 q& I0 e% P! T/ y1 Y" J
                      BSTR bs = SysAllocString(wsName);9 [# _, l* k, r) n
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);  s/ [6 Q, C0 l$ L
                      SysFreeString(bs);
) @; E3 Q8 h2 ?7 Y8 U
" t; o6 ~/ {. i$ u5 [2 ^$ `                       if(hRes == S_OK)
' @8 w, @) ~4 g# I                        {0 a9 j3 _3 F  V6 H
                         AnsiString s;" x6 v1 V: A5 r! b- n' c
                         Variant v = *(Variant*)&vValue;
) f3 ^# w* h/ F7 |$ H$ L/ h                          if(v.IsArray())
$ h/ E( x0 c5 S; ?+ \1 z. J                           {3 j4 E2 d9 S* D/ k( t
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
9 A+ U/ t' U. F! g, r6 {# Y; W                              {
3 t! v' [3 v7 O& E5 S                                Variant a = v.GetElement(i);
1 V  q9 F2 ]- u* }9 l! n                                if(!s.IsEmpty())% }- |, d. \1 x- h% ?9 c+ q
                                 s+=", ";: L% n$ [: T4 B& ]
                               s+=VarToStr(a);7 }4 E# G# ?( G" q$ |! d3 o9 }$ C$ M
                             }
, N+ v9 l5 W( y8 G$ N                           }
/ ^# L5 h4 F( e/ b: w                          else' \$ s) k; q. O7 T
                          {
$ E, g  \2 u! f. ?. Y! K, V, S& L                             s = VarToStr(v);" L/ ~& u) I8 ~: U8 d1 T' k. o
                          }8 }, H3 C6 J3 P' b& J% U
                         lpList->Add(AnsiString(wsName)+"="+s);4 [9 G0 E8 i3 B/ Y
                       }
( K" Z" F) B. \( k& p
& {5 p0 x/ a% s0 }  c; u8 f                       VariantClear(&vValue);
8 z& S1 ?# G( G3 W4 o- v                       SysFreeString(wsName);
0 X  s0 L& ]/ D+ l                     }: r7 |* z8 m9 `2 d
                 }  y5 b8 A  U9 y' _& M/ Q2 W+ d1 F
                if(pvNames)SafeArrayDestroy(pvNames);) I  s) [( ?& p# i8 K/ N/ s% Z8 [/ T
                iEnumIdx++;0 T3 x. L! P, T% j" B& p
              }( `3 V5 |' p" V6 S% M
           }0 A$ I  B: c- x( ^* o" Q
          if(pClassObject)pClassObject->Release();, j0 f2 E6 J2 P3 {
        }3 o) h+ `! L9 a
       if(pEnumClassObject)pEnumClassObject->Release();% n" ^2 q' n8 k% y6 _
     }
6 f8 v( ~9 m% Y; P$ r6 H: @6 b     if(pWbemServices)pWbemServices->Release();
: F7 z/ S' F+ N% K6 I3 _) m   }- Y1 A, e' c$ b9 K0 @2 f
  if(pWbemLocator)pWbemLocator->Release();  y- f  R' V) O4 y; G
}
8 H9 L8 j6 k9 p0 O2 m" K//---------------------------------------------------------------------------
$ R. C3 d  @/ X$ J6 i4 z. q6 E: y* R1 s# e
// 通过 WIN32_bios 获取 BIOS 信息:
! U& ^/ U' y# _# s. G1 \: Xvoid __fastcall TForm1::Button1Click(TObject *Sender)3 Y9 f+ f! [; ^- P4 F
{
- ^! V/ }4 x: G# }    Memo1->Lines->Add("================== [WIN32_bios] =================");2 @7 ^$ Q4 f3 n
   GetWmiInfo(Memo1->Lines, "WIN32_bios");
7 M2 Q) s9 m( o. Q& r' E" _    Memo1->Lines->Add("");
* T' s' {) A" i* S. P1 C}
* F; x9 v9 [* e( ?" v3 S0 @' O- E
--------------------------------------------------------------------------------0 F9 {5 C* r8 G3 z6 q1 a# v
! V8 E; I: i& S9 I: f9 l* y
WMI 可以访问的信息类型有:2 l4 g/ K. ^. h  }" Z1 u- D! n
  Win32_1394Controller
% u" ?( l4 F8 x2 d0 n3 h   Win32_BaseBoard
. k6 Q' ?9 z; K/ m4 K& `( X. U% b   Win32_Battery
. q' k" C' D# U, P   Win32_BIOS
( H& f( B6 |/ v   Win32_Bus
" i$ R% a2 P* R   Win32_CacheMemory
  n# l8 o6 M: B6 @$ l   Win32_CDROMDrive+ C) z. b! K2 A6 _) o) X- q
  Win32_CurrentProbe
: N3 `) Z5 k+ o  w   Win32_DesktopMonitor' M  H* S8 l% Q& e' q8 b0 C" M
  Win32_DeviceMemoryAddress
; s2 y: k1 a' E2 Y( ]3 b   Win32_DiskDrive- p" r- U+ @$ u+ _& Q
  Win32_DisplayConfiguration
0 u% j" x  d" t) [; \% S4 m   Win32_DisplayControllerConfiguration
2 h5 q" y9 e5 A0 S) W. d" y   Win32_DMAChannel
6 H! Q6 ^3 i0 |% `' L, G   Win32_Fan9 R9 b- P: K6 [
  Win32_FloppyController3 v& B: E% \2 _/ D
  Win32_FloppyDrive
/ m# \3 y6 J- T( ^; f& s   Win32_HeatPipe
5 k+ Y$ C  U2 ~: W  o& H   Win32_IDEController
9 [+ o" [" E# Y( A' B   Win32_InfraredDevice
2 S  G/ ?& i2 ~& s7 `7 U1 b   Win32_IRQResource2 p/ n0 u8 \$ S
  Win32_Keyboard- d. X. f; z/ F1 @( ?
  Win32_MemoryArray4 k" Z, }/ j0 c8 ~7 l; a- K/ p& u
  Win32_MemoryDevice
1 ]8 C  B- z# ^- P5 F% `   Win32_MotherboardDevice6 |  y- M7 I# p7 F% C
  Win32_NetworkAdapter) Z; T( `( O0 F1 Y4 u" g. T! b2 F
  Win32_NetworkAdapterConfiguration6 w3 q0 G" L: s" S" h
  Win32_OnBoardDevice' E! ], Y  T' `4 _* F' ?
  Win32_ParallelPort6 }2 e1 j/ F) M0 d7 }% Z4 g
  Win32_PCMCIAController
& A+ [( e/ F/ b   Win32_PhysicalMemory
0 m4 }2 G& F# z5 }0 T2 x) Z8 t2 x   Win32_PhysicalMemoryArray
! N1 M3 G2 F' `' x   Win32_PnPEntity
; Y% a0 }" f$ K; @6 {6 A   Win32_PointingDevice1 o+ u# f8 d. U9 a
  Win32_PortableBattery
  w& R) U- [/ B" i' S. N. c% S   Win32_PortConnector
( v- w5 F$ p" X   Win32_PortResource
, w) b& u1 d& E9 G   Win32_POTSModem
7 z( \- @- f/ v% Y5 s" f   Win32_PowerManagementEvent
0 M9 t" x8 e9 W" \1 @   Win32_Printer) f  l) ~7 a7 s/ _: M4 q8 V
  Win32_PrinterConfiguration, D0 C& t- t+ E& D) H; c
  Win32_PrintJob2 J1 Z2 W. O( T! `# w& t
  Win32_Processor
& B2 ?% R: {& K; U   Win32_Refrigeration
; b" h( p, u/ [! Y; x( h   Win32_SerialPort: R  U2 Q" j: o# F/ a1 l
  Win32_SerialPortConfiguration" b) \2 x3 Q0 W8 [: Y& l3 p
  Win32_SMBIOSMemory
" D2 C: F$ I+ h* z7 ~3 W   Win32_SoundDevice1 N3 u7 w, |: q0 z$ r/ {: C6 R
  Win32_SystemEnclosure
! n8 C0 N# R0 M; _   Win32_SystemMemoryResource
8 f9 S2 A+ Z% K' n   Win32_SystemSlot$ ], f% X4 X6 J- A
  Win32_TapeDrive
" R) g7 K, D3 o5 [7 B: d   Win32_TemperatureProbe6 Y2 y# @1 C8 X% i  c# F
  Win32_UninterruptiblePowerSupply0 Z- [( C: T2 e; D3 J' \
  Win32_USBController
& ~) p) I4 B& M' k   Win32_VideoConfiguration0 R2 @0 P% P0 K& w8 R# W# {6 W& E
  Win32_VideoController/ `7 R6 q& m8 R; r: V. C8 ?
  Win32_VoltageProbe. X  C# m, c( i2 W
3 j& y: \1 O: ~) K
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-15 17:31 , Processed in 0.019121 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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