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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
& N) g) h& u2 i1 ]" a, s0 u) j1 L) @) a; ]; ^( E

9 Z$ j( g7 E4 S5 o0 U0 l  B--------------------------------------------------------------------------------  C) p8 T+ ?3 y. h
WMI: Windows Management Instrumentation (Windows 管理工具)
8 a, x1 C+ ?1 {8 F- A% x1 U   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 " c& }9 M' _0 b$ t* }
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
" q7 \: z: T7 B& Q; T   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 5 l( A, v* @( C5 d5 v7 a9 C
# a3 m! O% d# C% B+ @* H/ y$ q
--------------------------------------------------------------------------------$ f$ e2 B4 Z* d) \
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
, p% ~! j: w3 Z6 ?  D8 j7 ?$ x' w) g% g- b' \$ A: R3 P" O
--------------------------------------------------------------------------------  C- L0 D8 N" u# j1 M, `
① 初始化 COM 接口:
9 |' \5 c. U7 s   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
2 i% V& C" m+ P6 ?4 F' K  G   这两个函数在 #include <comdef.h> 里面定义。% u0 T6 x& N+ W/ i- a

: O( M8 q* l8 u② 获取访问 WMI 权限:' [" `+ l0 C2 i' e: E- s
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
) n  _1 k1 o$ ?! j   如果这个函数返回 S_OK 获取权限成功, 否则为失败。. m( g% X2 m/ o( {. O% T) L

! a$ w4 g3 N) h, l& N1 Q③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
7 r$ p1 F8 e/ e5 M/ ^4 S   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
1 p* n2 s/ s9 h# Z( S
* n- L! N  y; Y' b9 vvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
$ P" J2 m* d2 O- s0 Y" Y  j4 R9 {{" A- v% h# J% L9 T" A; z$ D
  IWbemLocator *pWbemLocator = NULL;
# q0 q4 R/ r/ P  m) N  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)5 a! {1 Z* q8 B. R) `4 h7 {
  {
+ X% f* h7 I: l& X     IWbemServices *pWbemServices = NULL;5 e: e* Z$ U4 \4 S) C0 x" ?1 A0 P
    WideString wsNamespace = (L"root\\cimv2");
) a! n9 ]* b( B9 H( S3 [) w: a     if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK). f! E3 f. ~9 D/ @3 U8 P
     {# r  z) b. c4 `* j1 V0 f
       IEnumWbemClassObject *pEnumClassObject = NULL;$ W" e: D. U, u0 F) [
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
0 V# |' e( E; j3 j: s4 U+ |5 D0 t# o' E        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
# Q' n7 G4 \" M* D  M         {. O1 o( l" z  Y. y* Y: s
          IWbemClassObject *pClassObject = NULL;
+ ^4 c. Q' H! R1 e2 R           ULONG uCount = 1, uReturned;
( a7 S3 L9 `9 @2 M% y" m2 j4 v) @5 j           if(pEnumClassObject->Reset() == S_OK)
. H- \9 ?/ V) D/ ?6 X0 D5 C- F  b            {6 B2 ^% [+ Z: n% q1 a3 B  P
             int iEnumIdx = 0;: A+ u# x# }9 I+ [5 N0 f2 i
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)  h" {. Q0 i$ I" `4 k
              {$ t' y" x% w, H4 P* U! ?
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
0 T) {5 _1 F! z" T7 ?; @, \7 K2 ^$ f5 n) a# n
                SAFEARRAY *pvNames = NULL;: x3 v, D5 Z. ?4 w- A1 G
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
, @- w+ c" I/ G7 q5 n                  {
5 Y& h! z, G% w0 s, K! |7 r. U                    long vbl, vbu;
, h% C& _; p! E/ x0 t8 |( `                    SafeArrayGetLBound(pvNames, 1, &vbl);' Z9 F( t- R. k$ D7 N
                   SafeArrayGetUBound(pvNames, 1, &vbu);
9 m0 l; Q6 |: ~9 a3 q$ c" C                    for(long idx=vbl; idx<=vbu; idx++)
+ O9 I, i! Y3 @                     {
  r+ T' \  Z/ ~% X                       long aidx = idx;  J5 S7 e. d6 M8 [; u% {2 {# D
                      wchar_t *wsName = 0;
) {$ D5 l/ K. _8 {# l/ s# n1 M                       VARIANT vValue;) G' d6 W, o' A2 X8 S8 U
                      VariantInit(&vValue);
& P: p1 T& _% a* d                       SafeArrayGetElement(pvNames, &aidx, &wsName);/ w  [/ @4 k: ]; ], S9 @" @4 X
& P2 w3 I8 v. o; Z, _# X
                      BSTR bs = SysAllocString(wsName);) d7 [0 @4 O4 X" K- d
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
  b) m; p2 |3 `' `; r' r                       SysFreeString(bs);
1 s" f+ J/ ^4 J2 U
  d- k2 f" p1 e& w* B/ u' n! a                       if(hRes == S_OK)% M8 ?* G1 s& P& e; l& v- i1 G
                       {8 @  R# g. ?. c) ~9 G+ @! u8 \
                         AnsiString s;
5 r! T" [: E1 c5 f! t* L* S% N1 C9 p' Q* e                          Variant v = *(Variant*)&vValue;) p. D2 u; u( G: ]& C
                         if(v.IsArray())3 T! \8 X# A' h' I
                          {
0 i) W4 f; u; q6 m- C5 O0 a# a1 s                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
, w3 f6 j8 ~# C: h6 e8 c- U                              {
0 n( p! j/ n! r  G                                Variant a = v.GetElement(i);
9 u; d0 Z' m5 ~' _- x$ c. B9 R$ W                                if(!s.IsEmpty())
  X0 C+ h; l3 u& c( J1 o7 v- V( ?                                  s+=", ";1 ]' F8 h5 y3 I2 Q1 R7 |% X
                               s+=VarToStr(a);1 d: F6 [3 [0 i5 S* t3 `$ u9 V0 u8 t+ n- v
                             }, A9 v0 {/ O4 W
                          }' s' e% R% _$ X
                         else0 U6 N6 h1 L* w( F# J; o% M* J( B
                          {
1 u; r/ f; q" H% ~$ B, T                             s = VarToStr(v);7 d5 J, f% b, ^% T& [1 w8 L, |
                          }; Y! {7 }; X) o# \
                         lpList->Add(AnsiString(wsName)+"="+s);
* @: ?+ q, q- z+ {$ I1 O( Y                        }
# T4 w/ U! l5 k/ Q5 }* h1 M7 e: J$ c1 i) }
                      VariantClear(&vValue);) m, w9 D+ ^# k7 J7 E5 e$ J7 B
                      SysFreeString(wsName);  U8 c7 C0 I  A4 O; x
                    }* Y$ L( N" [- d0 m
                 }6 h4 {7 k( S! J+ X
                if(pvNames)SafeArrayDestroy(pvNames);
- u& T# F) Q3 |+ e+ ]* Z                 iEnumIdx++;
2 X5 p3 {$ X; x6 z               }* R+ b- K5 d3 X; F* r0 k7 s
           }
  |: m3 ~. C9 ]           if(pClassObject)pClassObject->Release();
/ l) T8 l7 L' z. F/ s         }' E) W: C' G  ]3 b1 ~( K+ o
       if(pEnumClassObject)pEnumClassObject->Release();
( {/ y/ l) S3 K/ b1 r1 j0 ^$ {      }+ K# A  k3 ]8 `. X
    if(pWbemServices)pWbemServices->Release();( ]8 R: q2 g# Y0 x5 V# @6 Z- _
  }
, x: ?: r+ U8 u1 J* b3 `  if(pWbemLocator)pWbemLocator->Release();7 `- k; z' R' Z2 @8 J; B
}. x/ \8 G3 G9 V2 s* K) M
//---------------------------------------------------------------------------4 }* B5 T1 }; ~% p' K/ P# Q

2 |, x* ^# ?$ N9 V// 通过 WIN32_bios 获取 BIOS 信息:$ D* A9 g3 N7 `# F) I
void __fastcall TForm1::Button1Click(TObject *Sender), g' y: C" g" V& j; u
{
) e; h! h5 `5 ~! B/ G& t! ]; X    Memo1->Lines->Add("================== [WIN32_bios] =================");
- ?0 N/ t  r' A    GetWmiInfo(Memo1->Lines, "WIN32_bios");% [8 N+ B- P$ X7 I; ?
   Memo1->Lines->Add("");. d4 D) i. P. F7 }! U
}' B5 D3 {; B. U; {6 D; v* _

  L, i- `+ T# ^: A) A! q4 Z3 M5 ~7 e--------------------------------------------------------------------------------% |( X, ~9 f( P* H0 c+ f6 Z

$ X" @; X! g! d* L1 W( `4 b5 \WMI 可以访问的信息类型有:
+ Z! S6 D& R% Y/ Z, v   Win32_1394Controller- G$ x! c0 [+ A1 }+ |) p
  Win32_BaseBoard  D: F# M& T+ Y: T1 ?" G9 h
  Win32_Battery9 `: Z' j' ~5 e  g! |6 C1 l
  Win32_BIOS1 o2 B: c4 T" {5 X- I
  Win32_Bus4 U( g1 y0 E" l
  Win32_CacheMemory
/ U/ U3 K( {# ?* s0 L4 \. D+ n   Win32_CDROMDrive* b* m/ M5 b: J
  Win32_CurrentProbe
" {3 ?+ W+ g4 V7 p: H6 ]   Win32_DesktopMonitor
0 {9 j+ `& b! K' {/ c2 V   Win32_DeviceMemoryAddress- `7 {( U3 {6 |, ^' D+ H
  Win32_DiskDrive
, o( b& |. Z# ^" G" N   Win32_DisplayConfiguration
( y( R) B9 a+ C+ ]  D   Win32_DisplayControllerConfiguration; H7 h2 j  O+ W0 G! U: ], |8 S
  Win32_DMAChannel
8 T8 `0 S# A' j5 p; D' s0 f   Win32_Fan
) u2 j- A" ~" m$ W) c" d0 O9 B4 c   Win32_FloppyController
% {* N& a! f+ W# {  [   Win32_FloppyDrive6 F7 }* S7 _2 ^5 W: L5 [$ \
  Win32_HeatPipe
9 e, X: u# Y0 z  {- @   Win32_IDEController! M0 J6 {/ a3 D# @; S' d$ |
  Win32_InfraredDevice
5 q0 |0 Z* R6 ^9 _& p: W/ }. ]; H   Win32_IRQResource( |  Q) n& S# R" z8 Q
  Win32_Keyboard0 S) M; P( o% I- p8 c# ?
  Win32_MemoryArray' Y9 N' C% l+ x0 z2 S- y' ?( d
  Win32_MemoryDevice
+ F$ g' R& |" F   Win32_MotherboardDevice8 A0 u, l# E0 t+ ^( b5 g! e
  Win32_NetworkAdapter% K" Q! Z4 ~. `
  Win32_NetworkAdapterConfiguration
; x. u" i% g( _2 J0 q- x; ]- X5 R   Win32_OnBoardDevice8 v; \1 Q+ M+ S
  Win32_ParallelPort
" K2 P1 Y7 M/ d. S8 O+ t   Win32_PCMCIAController$ p, x) Z4 D$ w: g, V. O
  Win32_PhysicalMemory
9 ~) Z* x; b1 n   Win32_PhysicalMemoryArray
. a9 O0 i- I6 A   Win32_PnPEntity
! ]4 N* H3 L* A! e8 H4 `" ]# F   Win32_PointingDevice9 I0 G  _" X2 ^& C* w
  Win32_PortableBattery
1 H+ {( f  u* O8 Z   Win32_PortConnector
! q. j+ e8 T, A6 n: V: A" V   Win32_PortResource
* t( M" s( J4 p" I   Win32_POTSModem% Y8 Y3 E- p% y4 ]. [
  Win32_PowerManagementEvent+ B) E+ z, `% L: G& J+ E
  Win32_Printer& d) e. i6 Q$ e" R. l
  Win32_PrinterConfiguration
, E" S! x. p  w   Win32_PrintJob4 q: s# J3 c) F( f" Z
  Win32_Processor, I( L, v1 ~) t$ x7 r0 Q1 L
  Win32_Refrigeration
& E0 Z0 J+ |7 b/ x$ m% m   Win32_SerialPort  p6 E1 d$ W, b& l+ L4 J* q8 M
  Win32_SerialPortConfiguration: a' R8 `$ R) B
  Win32_SMBIOSMemory8 R. y+ R/ f' i1 ]) I# [' M
  Win32_SoundDevice
6 X+ q# t0 Y1 d& Z. y  C7 `   Win32_SystemEnclosure
6 B7 a. P0 @5 C9 y* g   Win32_SystemMemoryResource
; G' [9 M% ]: N# Y# v) p   Win32_SystemSlot- o  k0 z$ q: I6 R  N0 {9 o" u9 t
  Win32_TapeDrive
  X8 _) ]% b2 [   Win32_TemperatureProbe
+ ?: m8 C) z9 V' p9 a   Win32_UninterruptiblePowerSupply6 O1 ], |# S. }4 ]9 ]& J
  Win32_USBController9 ^9 z7 D, K. E" z9 N4 o3 M* s1 \! a
  Win32_VideoConfiguration+ }/ r( m+ ]7 k' h; o
  Win32_VideoController* u' u9 ?$ c6 Z0 F+ t; R9 }
  Win32_VoltageProbe
! r5 [4 ^& y* ]  N0 r6 c( |* m9 O% u- o4 b/ W  o
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-17 10:48 , Processed in 0.028085 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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