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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
: i- `! r7 O" U4 y7 k
8 ]  b9 a! `" y' K9 q. E# m% Z7 X
) L) r, V# H/ C+ Q--------------------------------------------------------------------------------- I! R7 e& c: h& D3 g6 `# q( L
WMI: Windows Management Instrumentation (Windows 管理工具)
" f( O0 k7 F3 ?" I) a$ N, L1 ]   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 ; N, k8 Y; b+ @4 x% F; [& G" b# i  w
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
* }0 R: P4 B& {0 I5 O   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 + v1 f9 I- v  J6 Q3 K$ m4 t% S
# L! J1 w3 o7 Z1 V9 d" M. {. I( A4 Q
--------------------------------------------------------------------------------
7 w# ~. a. Q) `+ h. D" D9 I: TBCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面; @2 J7 m7 f. t* W$ f- F' [/ b
% z" K# i8 S$ ]8 S  s9 X7 D6 C8 \
--------------------------------------------------------------------------------
$ G. r5 j  ?/ v( p* J& Z5 `/ A① 初始化 COM 接口:
7 Z$ F( {, a8 r; [. x5 }   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
+ \& ?0 N. c8 @8 D' I   这两个函数在 #include <comdef.h> 里面定义。
6 u, \. n# V) ^! F+ \
' g+ X% A2 v  d3 Z5 a② 获取访问 WMI 权限:
6 @8 q& ?9 [, x! g2 q9 I   CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);' Y8 s$ j; F& J0 o4 q0 n% O
  如果这个函数返回 S_OK 获取权限成功, 否则为失败。, x  X2 Q# ]7 H
4 L- j% U# [8 `; ]4 Y, `
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
. Q6 k/ ^7 r" [6 d% A1 u* R5 K   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。
# x" `: `5 D: z/ f. w$ [# s
3 Q7 Y; @( _5 z) O/ ^# n; a$ |void GetWmiInfo(TStrings *lpList, WideString wsClass). |2 I2 l- w9 h
{
3 |2 N: g9 F6 F. K: D- w  IWbemLocator *pWbemLocator = NULL;
! n: d6 e' ?! I' g8 V; l  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
; g5 R! n0 i1 G0 ], h   {- I4 ~8 ~* r( t% L% J) H
    IWbemServices *pWbemServices = NULL;9 ~( v4 \, D# I& n; r7 \; g( Z
    WideString wsNamespace = (L"root\\cimv2");' Q6 M1 E! q/ q' R
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
0 |% t- [) @$ {4 d$ G" A9 }+ D/ `      {: x/ F: m' [( M2 X
       IEnumWbemClassObject *pEnumClassObject = NULL;0 e9 u& O' V: U- I2 Z, K
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
; F7 o0 g7 E# q8 F, i% E        if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
, ^9 u& I( W' |) G7 J         {
# s* }0 Z* `- }, G           IWbemClassObject *pClassObject = NULL;2 E( G0 T) {0 I
          ULONG uCount = 1, uReturned;
3 K1 ?0 {- a( d% h) W           if(pEnumClassObject->Reset() == S_OK)
# ]; [0 ^) P0 F6 `6 w" n8 E/ N7 t8 `            {7 `2 C# d) Y, s# R
             int iEnumIdx = 0;: j) T! h: g1 ~! \% [+ [
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)' V* \0 O) P, ?
              {
+ y5 `7 o! t/ i- h- P                 lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
1 Z, ]  k$ H. P0 _
$ @: H8 Y; f7 v( R                 SAFEARRAY *pvNames = NULL;, }7 V7 C& D' l5 a! @+ ^
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
1 @" d# F1 H9 l# z                  {
/ P) j1 O; b7 Q+ l+ l                    long vbl, vbu;
2 k0 p  v. o$ F3 q2 ~+ y3 K% g1 g6 V                    SafeArrayGetLBound(pvNames, 1, &vbl);+ B5 T; p. |: K" N
                   SafeArrayGetUBound(pvNames, 1, &vbu);
/ x. U9 s( ^- a" B+ T& G4 i                    for(long idx=vbl; idx<=vbu; idx++)! Z5 C% Y* ^# p3 A5 Q6 `( j
                    {
( A( z7 m1 g9 V! I- p9 r, {4 X                       long aidx = idx;
$ e" [8 t' t0 ]9 l. s                       wchar_t *wsName = 0;7 |* W9 l" \1 Y* M; r
                      VARIANT vValue;
* {% n# y3 |+ Q& t- Q. z' }3 W" Q* K                       VariantInit(&vValue);
" H8 E: J2 v" \6 y: n                       SafeArrayGetElement(pvNames, &aidx, &wsName);5 d: M6 [% L# D' n0 o
5 u1 M* _# K$ z. e3 Z7 I5 M
                      BSTR bs = SysAllocString(wsName);
0 U8 l% L, Q, G  p* H) F                       HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);) r" s' [2 A) i" J1 K- A" l( a
                      SysFreeString(bs);* w- _5 K$ ]; n: p& r1 m" ^3 o

! l  N# ^( L/ a' l9 q                       if(hRes == S_OK)
* P! X2 R, ^( b* N                        {! |4 k2 w' n$ F% }1 B% }4 Z
                         AnsiString s;' {1 ^* Y) F; a# J6 t& e: z5 j
                         Variant v = *(Variant*)&vValue;
! W5 V5 W3 z$ q7 l                          if(v.IsArray())
! [4 E# ]! C  j  i9 v4 Y9 S: U; b                           {$ F* R9 ?; [, @6 _# X
                            for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)) L- }. Z: M& }+ T/ C! B
                             {
  |( u/ n3 K2 c                                Variant a = v.GetElement(i);
% y# A' y: V7 y% G' A7 ^7 @* N- R                                if(!s.IsEmpty())
* Z2 |% d% q+ W. C; G8 A# p                                  s+=", ";
/ V* C1 g# A9 p) F                                s+=VarToStr(a);8 h$ Z6 W" f7 T4 z7 F$ m
                             }9 z' [7 ?7 Z, e# q
                          }3 n. r' G; y9 j3 V+ V9 P
                         else
8 c. l% ^1 N2 \# o                           {4 X8 E* |6 a3 t; u. h
                            s = VarToStr(v);
" P1 o! t, S: v4 _" m1 u& F                           }) q  U& I$ `) `+ h& |" \' A
                         lpList->Add(AnsiString(wsName)+"="+s);; Q) I* F! @9 I$ p+ U
                       }4 _3 L7 @  C) u$ @5 f* i

/ ]5 I8 Q" e1 L3 K8 ]5 M3 j# _                       VariantClear(&vValue);
( Q# H3 l& k, }5 n+ Q                       SysFreeString(wsName);
5 W, g7 @/ r% v6 k, o* v: R" b& n/ M                     }. @) F. J; b- \9 {* D
                 }
0 x' V6 K( C) E# I                 if(pvNames)SafeArrayDestroy(pvNames);
8 w$ z. \5 A/ q' J! e                 iEnumIdx++;
( [$ q- Y2 L, t2 C               }
9 ^# O1 q7 |8 A" e$ r+ Y            }; }7 j, R& ?+ I' O
          if(pClassObject)pClassObject->Release();
! w5 w7 M6 B5 y8 i5 F* x# J         }
+ q5 z0 |" O9 B6 o: L& F$ G        if(pEnumClassObject)pEnumClassObject->Release();
: R' ]9 y% g( G  O      }
) t  X& g% [  z# g% O: s     if(pWbemServices)pWbemServices->Release();; P+ @4 k( `& a' l! L
  }! s9 A6 T1 Z9 ~% i
  if(pWbemLocator)pWbemLocator->Release();9 M' }- p  z' F+ r; M' x7 @- T
}
! F) M5 c9 n1 H//---------------------------------------------------------------------------
; \# v( k4 O7 {- m/ e) q2 V3 Y6 C/ K- j* ]# V# M
// 通过 WIN32_bios 获取 BIOS 信息:
. P3 J1 f) ]( Q7 c1 w8 X- [void __fastcall TForm1::Button1Click(TObject *Sender)
; o) u7 q; ~9 ~& p' }4 h  v4 ]{9 p/ b9 U9 V) p* x! t) Q% G9 k
   Memo1->Lines->Add("================== [WIN32_bios] =================");
0 S& o! ^3 V: K    GetWmiInfo(Memo1->Lines, "WIN32_bios");
, O# ^& F) Q+ N& W    Memo1->Lines->Add("");
( J- I4 y! l0 Z+ D$ |7 x( W( u}$ b) C- m9 b+ ?. A: K
- l9 S* ]  k+ M4 Q; r( p
--------------------------------------------------------------------------------7 Y6 Q+ w2 l2 C7 d% E2 v; T( l

/ A9 V8 R% t' c" A. RWMI 可以访问的信息类型有:9 d- n4 m& L4 Q) Y
  Win32_1394Controller
: b: |$ |9 V8 h) |   Win32_BaseBoard
0 y* w; A5 ?8 w$ C3 {7 E4 z" v   Win32_Battery# Z; d9 e" C  M
  Win32_BIOS
9 W* ~2 f* v! j, a   Win32_Bus
- p. u# r: l, [  v; r% v3 O   Win32_CacheMemory  k, x9 k: q. b6 }1 C/ o
  Win32_CDROMDrive
: L# H- C7 a2 ~# P2 B6 X  \   Win32_CurrentProbe& ^4 I( n: F/ }; L- i
  Win32_DesktopMonitor; H: Q1 z8 o; z
  Win32_DeviceMemoryAddress: d4 v! B+ ^, M, ^; x
  Win32_DiskDrive
2 M' l: Q' [/ g* b0 |8 W3 U$ [+ A   Win32_DisplayConfiguration
/ \9 R8 r7 {. k( x" ^' i   Win32_DisplayControllerConfiguration4 p9 a: Q6 s9 p4 q8 N& v, @+ p
  Win32_DMAChannel; ?6 G4 u# y$ p/ H
  Win32_Fan
; J% q5 y2 `9 n7 \   Win32_FloppyController
6 C4 R1 e$ V5 p2 U# `   Win32_FloppyDrive
) E8 f! a, E4 R: S   Win32_HeatPipe
! \7 b' i  x2 n! _# I   Win32_IDEController$ @3 z5 p7 T; {
  Win32_InfraredDevice
* ~6 r, D- D( u8 K; s   Win32_IRQResource
: F  W+ c7 |+ I8 F2 c% ]* K   Win32_Keyboard
) s/ X, n& W& Z* a! b! f2 C" b   Win32_MemoryArray/ Q" ?) r3 ~1 w7 s+ N0 c, r$ d
  Win32_MemoryDevice
2 {. [5 `, s% Y( d& F; b# a, K   Win32_MotherboardDevice. k' r7 R3 q! f
  Win32_NetworkAdapter2 |% {4 }* V) X, v
  Win32_NetworkAdapterConfiguration
& U/ y7 j" @/ `$ Y5 L! l   Win32_OnBoardDevice
8 k/ I2 V2 {7 ^- ~9 d   Win32_ParallelPort' M! r; h4 k# n7 S7 [; f# [
  Win32_PCMCIAController
  f7 X7 l! Q. r   Win32_PhysicalMemory% x9 r! ~; @4 g/ y" z. @: R( p
  Win32_PhysicalMemoryArray
$ [% h! |# J* x3 l1 U/ m+ P* M   Win32_PnPEntity
$ ^/ W6 `* d9 G* F4 ]; J& r0 _   Win32_PointingDevice
/ d7 ?% k, ?9 t; z. A: @   Win32_PortableBattery$ m4 N3 {! k, [* V- W7 [2 t
  Win32_PortConnector
, z) L- _; v2 y   Win32_PortResource  O9 j8 q5 P5 _$ D& j
  Win32_POTSModem: q3 _- P$ m& h/ y
  Win32_PowerManagementEvent4 J1 R3 G  E. X6 ^7 L: Z
  Win32_Printer
6 A8 v7 [! P9 g1 r9 f   Win32_PrinterConfiguration7 \) }* Q5 p1 ?
  Win32_PrintJob
5 h" K4 |( J2 H: ^6 N   Win32_Processor7 A" d& |( @, t" N0 X! E
  Win32_Refrigeration- A8 k3 z- j( Q/ [  ?8 S( j7 Z
  Win32_SerialPort
* R# m. j  a0 G& z3 l   Win32_SerialPortConfiguration
7 H# O' D6 h  }5 i$ S! v   Win32_SMBIOSMemory
. [1 L" ?/ r3 e! m9 E4 `) O8 C   Win32_SoundDevice
  C& |! L* n2 K3 F   Win32_SystemEnclosure
4 F+ K5 N; \+ w) E6 A' c1 G   Win32_SystemMemoryResource2 S) c" `4 _9 b: ~
  Win32_SystemSlot4 \  C4 k, T- P  _
  Win32_TapeDrive0 A9 Z( C8 {& e* |
  Win32_TemperatureProbe
9 B# V( ?* a! \. v( \   Win32_UninterruptiblePowerSupply3 y; c3 ~9 f' y. a  ?
  Win32_USBController- K! O; M( _6 D: t+ @- U: ]2 c
  Win32_VideoConfiguration
1 c8 k# e) }; d! Z   Win32_VideoController
8 X) z" J5 E' G$ @   Win32_VoltageProbe" Q3 G! F" d# `7 C
, t- X7 U- v1 w" Z/ p2 D
以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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