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

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

[复制链接]
发表于 2005-5-22 17:04:00 | 显示全部楼层 |阅读模式
  Victor Chen, (C++ 爱好者)
- K# c# n% x' Y" Q
# g8 \' w. p& J4 T
, A4 J5 w; A& b9 a2 {( R$ b* _--------------------------------------------------------------------------------$ U2 p. a, S0 S3 A  B! m
WMI: Windows Management Instrumentation (Windows 管理工具)
5 ?8 |% s, O7 @7 y. K) @+ z. L   通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 : W) R; q2 Z8 m; G% t5 A5 e. F
  利用这个工具可以管理本地或客户端系统中几乎所有的信息。
. C% N1 ~$ f# m  |/ J  _   很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 . m9 H" V0 T5 c8 d, ]7 ~8 f

6 v- n( Y* {. b6 O- O--------------------------------------------------------------------------------8 }1 o" f+ h0 N6 k" h& a' ?$ e) U0 R$ s
BCB 的 WMI 库文件 wbemuuid.lib 由本站提供, 包含在本页下面的程序源码下载里面
# S7 L4 B4 J8 S+ @9 y  w) s# e+ x2 [
--------------------------------------------------------------------------------
) l1 i& u- H: ~& [① 初始化 COM 接口:
; T: C- n+ z# z2 x/ P4 e2 l) v   访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。
  [. c7 `, d: K, @   这两个函数在 #include <comdef.h> 里面定义。3 l/ T2 o. F  K$ V
  }, F1 g7 s  m( ~
② 获取访问 WMI 权限:. t5 E/ e4 {$ O/ G& D
  CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
1 N8 `& M* g6 i1 P! D  a0 @1 j. ^) j% D) K   如果这个函数返回 S_OK 获取权限成功, 否则为失败。
: }: |( W% D9 S( K" A8 I. N0 _5 M
③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:
3 }" e. P& B$ }. e9 K# F   这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include <wbemidl.h> 里定义。2 _! _' J9 a# _) M7 {$ S

1 \8 s* |% w& X& l1 Fvoid GetWmiInfo(TStrings *lpList, WideString wsClass)
2 Z- p% R5 }' C, f: Y{
7 `1 q8 b! N  e. W+ w6 v  IWbemLocator *pWbemLocator = NULL;$ t, a& q) |, r& \& I, T% `/ w
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
1 i) I! M2 c5 Q, A3 U8 q; r   {
0 C- t( y" u/ ?0 e1 `     IWbemServices *pWbemServices = NULL;
1 \6 \& d, \7 s8 K5 h3 A     WideString wsNamespace = (L"root\\cimv2");" u+ U# }: ~+ S/ r& J7 {; a# ?$ Z6 s4 L( _
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)1 V3 \7 T& B7 F, S
     {
* T. h$ B8 f0 L  d        IEnumWbemClassObject *pEnumClassObject = NULL;3 J$ J9 ~, H9 y/ z+ L
       WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;1 g' u1 J3 Q: _* s6 ^  k
       if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
3 K" I5 z1 R  S% N+ ?+ e         {
& m5 [0 J# {( z9 |! A# X$ \. e           IWbemClassObject *pClassObject = NULL;
" H8 S) {. Q$ l           ULONG uCount = 1, uReturned;
; r7 P! r- t4 N0 m8 h           if(pEnumClassObject->Reset() == S_OK)
9 n% v8 Q( H& \8 x: A            {8 C/ r' ~0 C3 u+ \, E5 U: U  m% g, z
             int iEnumIdx = 0;0 B- `* ]; b/ p: J( }, k
             while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
# Z: K- ^  }6 [2 B               {& v6 f2 g  F! B9 P" k
                lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");* Y) o7 \  [2 T; B* \
6 x3 O! H9 f6 Q' l3 K8 H/ ^. m
                SAFEARRAY *pvNames = NULL;0 V4 N" W8 H& _: Y; K/ R
                if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)  W" u- p: K% G  r$ u
                 {
# w* y3 {9 f3 I1 L                    long vbl, vbu;
$ T" K/ @/ u6 I                    SafeArrayGetLBound(pvNames, 1, &vbl);
0 o8 s0 Q! z8 c                    SafeArrayGetUBound(pvNames, 1, &vbu);
1 O# m& h9 W% R6 X                    for(long idx=vbl; idx<=vbu; idx++)1 S' J# l& X7 J) p+ E, z
                    {7 W' o- `/ v6 N$ Z- L
                      long aidx = idx;
' @  k# j' I- M9 Y0 h$ h' l: [                       wchar_t *wsName = 0;/ L& K- f: V* o) c
                      VARIANT vValue;* k" G. B! s& x! w- b/ V' b4 m' ~
                      VariantInit(&vValue);
: N; F8 U7 i$ a4 u, r" ^4 Z                       SafeArrayGetElement(pvNames, &aidx, &wsName);
# s$ {$ |! Y) X  Y" r. t& Q8 |5 g/ z
                      BSTR bs = SysAllocString(wsName);! A! i& n3 o. \3 u) }- S. f
                      HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);* n3 r) c! _' J3 O& D0 y, }
                      SysFreeString(bs);
1 h# R. I* q) V# b; \7 `0 l- F
" H( E4 y" {2 ~4 S                       if(hRes == S_OK)) T* {+ N  n8 C
                       {0 l$ V( i9 R) ?: Q$ O
                         AnsiString s;0 \: @& }2 u) L* ]
                         Variant v = *(Variant*)&vValue;) W) U: x) H" a& w7 K! T
                         if(v.IsArray())+ F2 O$ }1 c( w: E
                          {
  Z! y3 e2 B9 M1 l% m                             for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)' ~% P+ u- n! ?5 I0 U
                             {* ^* f" |% g6 p4 u" \
                               Variant a = v.GetElement(i);! r! Z; ~9 I  r- [
                               if(!s.IsEmpty())+ Q! L1 @% {& Q+ p. l1 V
                                 s+=", ";8 x/ G* ]3 @9 I! H( z
                               s+=VarToStr(a);1 n7 |7 ]. G: z! C
                             }0 Q/ e3 n9 a1 C. s% M
                          }# u8 y& u3 [$ K2 c. m% a- ?3 F
                         else
( B: v& E5 e0 X2 x8 W                           {& c' z9 J. V  S$ b) e3 R' c
                            s = VarToStr(v);
: E# p9 s4 |- B3 K9 ^                           }
! I, }# m$ u8 \! F                          lpList->Add(AnsiString(wsName)+"="+s);
; M8 ]% `5 D5 I2 u0 ~; b- s                        }
) D7 e0 A* o8 X# K0 y) G1 `: G# l  g
                      VariantClear(&vValue);
0 j% z/ m1 x: U) @: o                       SysFreeString(wsName);# x8 y8 J. [8 M: ~
                    }$ H  `* }4 f4 m4 a6 y8 W! e3 q
                 }9 S9 \- G/ @/ y' \
                if(pvNames)SafeArrayDestroy(pvNames);
; ]* a; ~. u3 w" s# i" |; P! Q8 f                 iEnumIdx++;0 @1 `7 C8 ?" L* \" B- B' z* u
              }
. V* j' @# y/ d: E0 j, z) s* M            }
* {* f9 b! P. X, _           if(pClassObject)pClassObject->Release();
0 p+ F1 ?% H! S+ l9 J         }
( T" B- o9 m; t5 a: ^$ U; |# J" y/ H        if(pEnumClassObject)pEnumClassObject->Release();
; ]$ B# a7 C. B      }9 _1 w8 P% d. _/ [" \
    if(pWbemServices)pWbemServices->Release();
5 e$ h6 _3 O# C) [- y; q4 c   }/ F1 q1 B" O) D6 k8 d, X% d
  if(pWbemLocator)pWbemLocator->Release();
+ p. [% v1 K" ^0 ^; i9 v}' `- Y( Z$ |6 ^
//---------------------------------------------------------------------------
& e( N, B- W( U" M3 H7 R5 K. y; h! s; c8 F( K6 `: L  y! P
// 通过 WIN32_bios 获取 BIOS 信息:' |# @* P# @0 N" y# F7 W- }
void __fastcall TForm1::Button1Click(TObject *Sender)
3 I' I3 r+ r8 R* H{
2 p3 R$ |! s5 e+ J: l# E    Memo1->Lines->Add("================== [WIN32_bios] =================");3 }8 a6 \$ Q8 u' r) s
   GetWmiInfo(Memo1->Lines, "WIN32_bios");0 R" S( y8 Z# U
   Memo1->Lines->Add("");
& N; [" d& `1 _: G}) k' }, j0 A: p

/ d$ U- I4 y. @--------------------------------------------------------------------------------
7 @7 p6 K7 V7 k: [, h6 ^& }% R. W! N5 K! B: T
WMI 可以访问的信息类型有:
7 e# s8 S. N* R   Win32_1394Controller# L+ t) p3 [8 [
  Win32_BaseBoard9 L) X) R% n* w+ K0 g
  Win32_Battery3 H' |% R- A4 C, y, m0 D
  Win32_BIOS# r3 V9 h4 f  f' B8 l
  Win32_Bus0 L2 `  p* E% L* Z' j7 j9 w
  Win32_CacheMemory# ]" c7 F4 S, x2 \
  Win32_CDROMDrive
4 F5 C8 @, Z% R# T5 Q& K- \   Win32_CurrentProbe( S1 i) i+ Q" ], Y: Y  |' {
  Win32_DesktopMonitor
4 f' Q! u2 f$ G; B! H4 o( l  |   Win32_DeviceMemoryAddress9 {7 s' [/ [4 O; T! p: L) M
  Win32_DiskDrive: T5 |$ G) H4 o2 h& v( X& d* a
  Win32_DisplayConfiguration7 Y& K+ X' f) p* `
  Win32_DisplayControllerConfiguration5 r- a) G5 b, t+ E$ ~1 ]# N
  Win32_DMAChannel
0 G, M& k% ~9 n4 T% m6 y! g   Win32_Fan
; t3 z; H, D/ w* Z* h+ T   Win32_FloppyController6 |7 o) A2 n+ I4 A
  Win32_FloppyDrive/ v' [/ Y" |1 T# L& H
  Win32_HeatPipe- N' r$ r0 v/ w
  Win32_IDEController
% }+ E9 b7 ?0 I3 Z   Win32_InfraredDevice. R  Q, c% {) a/ E
  Win32_IRQResource
2 M* l$ y. P  n6 @+ q" U, a   Win32_Keyboard
9 Z4 y9 G& V  }+ t% {   Win32_MemoryArray$ w% e* U/ O# Q6 N
  Win32_MemoryDevice
# s' `3 u: @# M   Win32_MotherboardDevice; h" T& Z  c" `' V/ x) a, h
  Win32_NetworkAdapter' v2 B0 O: A7 O$ z8 k# }7 r! G
  Win32_NetworkAdapterConfiguration
8 H( g9 E$ |4 A1 Z! z   Win32_OnBoardDevice
) ~; _* H; j) h% y& `( o$ H) s7 n: E   Win32_ParallelPort
9 ]' Y% V! j3 U   Win32_PCMCIAController3 M+ O0 g. O+ |* g' H0 [: D
  Win32_PhysicalMemory8 C4 [$ C3 T/ `, t) ^( r
  Win32_PhysicalMemoryArray
) i. a" H# Q' e5 ?$ P   Win32_PnPEntity; Q" U0 P, J, m6 O5 M
  Win32_PointingDevice
+ S. {. X6 R, z5 L4 \   Win32_PortableBattery$ c7 E( M' y1 p' P5 V6 Z( k
  Win32_PortConnector9 X8 a% W: [. l. |) t
  Win32_PortResource3 l, n( V9 A- K& h
  Win32_POTSModem
& X' l* {- A4 X0 s- h% _+ X7 z   Win32_PowerManagementEvent8 E# S9 L' c; a2 P% b0 \8 b
  Win32_Printer2 Y; e+ s6 G7 \" Z& q8 v
  Win32_PrinterConfiguration+ K' y4 D$ \2 Y6 ~) L5 C* l5 }
  Win32_PrintJob
7 d) {: I" w2 Y. c$ ?" I! _/ g& n   Win32_Processor
# Z1 P8 Y/ R# t# i   Win32_Refrigeration
1 s! R0 J$ `9 `7 I8 G: w   Win32_SerialPort" Z8 k4 S3 u+ B& @3 u4 z. I$ v
  Win32_SerialPortConfiguration
0 w2 f1 J! U8 r. d- _3 X$ _   Win32_SMBIOSMemory4 x% c' P* P( g7 @6 }* [/ N
  Win32_SoundDevice
4 j7 t  ?# T7 Y7 X+ ~/ v% x   Win32_SystemEnclosure$ ]% Z" h/ d0 m
  Win32_SystemMemoryResource
2 m0 S5 S% {6 o! K! c, k$ G% {9 t6 H   Win32_SystemSlot
# w1 i" C; y8 I- o& N   Win32_TapeDrive  f4 F! o+ w) B; n
  Win32_TemperatureProbe
* X- x2 [3 J% e. E+ G! h   Win32_UninterruptiblePowerSupply3 N# d2 Y# m- M! _
  Win32_USBController
+ d% A5 k6 Y. H! x! n   Win32_VideoConfiguration! f; U( P% J7 I# P; C+ y
  Win32_VideoController
7 x  ~- t& ]8 Q3 O# a. l5 W# ~   Win32_VoltageProbe2 m) A+ ]' R0 M! X

$ @- M& ?% a( g$ q4 S7 e* k以上类型(字符串值)通过前面写的函数 GetWmiInfo 可以得到相应的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-1-21 05:16 , Processed in 0.019276 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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