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

[收藏]关于用WMI获取系统信息——编程实现

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^:
% t* U3 P, X/ Q4 ?. F0 s0 A# K  P  --------------------------------------------------------------------------------
6 v6 b- l/ e& w1 s9 T  #define _WIN32_DCOM
& W7 y1 h( ?% x- b0 V  #include <iostream>
0 _, C/ z; V6 ?% v) I9 `8 t' f  using namespace std ;
: T% H" V: E! ^9 d, [( s- v, @& n  #include <windows.h>
3 e: N/ X+ l5 Z  #include <comdef.h> % a, X3 j7 I$ T0 a' }1 l' @
  #include <wbemcli.h>
: [1 X! W" n* }  
- }( @- K) M$ t  #pragma comment(lib, "Wbemuuid")
* v; u& B5 D5 Q9 {4 J  
' c4 r' ?3 x6 I! D* q% `  int main(int argc,char**argv)
* w# O8 P& e9 f# p! w& X5 u  {
5 g# [. X: ?+ i( ^$ q8 G7 S  HRESULT hres ; # g/ x$ N1 B8 ^2 m
  * b; m* k+ A! v7 `/ M6 _! h& s
  // Initialize COM.
$ h" F) a0 q' s: M1 `, R  hres=CoInitializeEx(0,COINIT_MULTITHREADED); ( w# V; x1 Q" E
  if(FAILED(hres)) , V' n% b  A) }5 a. N
  {
0 }$ a3 b2 S& \* T7 W  cout<<"Failed to initialize COM library. Error code = 0x" / p6 J; Y$ a  T& n# i
  <<hex<<hres<<endl ;
2 e# U3 ]$ p% {0 r0 i; A( j  return 1 ;
) }, |& \; R5 [/ t  // Program has failed. / I7 v  P$ r% H% |! |
  }
0 B- m5 K3 m) A  
: W; o9 B$ V* s% z# b" J& x8 w  // Initialize
5 n& k6 p+ H) G2 A  hres=CoInitializeSecurity(
7 U- U$ N7 ^8 E1 D, u, @3 m  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,
1 b& L' h' q3 m0 z6 |1 |  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
% p8 D' k1 D& ?( e5 G3 x    f6 X, g8 w2 P' I8 z( L" ]% _
  
( B1 ~# O/ [9 d% \% h* a; i* P  if(FAILED(hres))
7 l% q9 O+ F- Q  _4 J  { # k" `4 U0 s/ ]
  cout<<"Failed to initialize security. Error code = 0x" ; @3 E8 w# X2 k
  <<hex<<hres<<endl ; 1 F! A, R  y$ ~! ^, i
  CoUninitialize();
  j- J  E" b$ m. x  N$ u. I6 s  return 1 ;
% Y# F3 j9 _) ]5 ]$ {% c  // Program has failed. 1 T2 h* u5 D0 ?, a
  } . i" Z$ D2 U3 m$ L' N$ M* V
  
. g) `) l' v: {) K  // Obtain the initial locator to Windows Management on a particular host computer.
6 _' J, T' V8 j& C& F) H& R0 t  IWbemLocator*pLoc=0 ;
. H& w- p" w" \9 ^2 T  L! y4 |8 t  8 y* K; P( m- n/ C1 s% c  _( K% {5 b
  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER, 3 q9 V9 C: O, n' a- n. y
  IID_IWbemLocator,(LPVOID*)&pLoc);
# N2 f/ z* G6 b' w' l  
! ?2 @8 Z, {: z  x9 F! O  if(FAILED(hres)) 8 K. \* p: O: B. ?2 x; k, y* h# Q+ e
  { * E# b) A+ K6 t2 l5 Y: I
  cout<<"Failed to create IWbemLocator object. Err code = 0x"
3 ^* g+ s' Q& @5 A- q  x  <<hex<<hres<<endl ; 0 ]5 |1 k( t* n1 ]# J( i, L8 S
  CoUninitialize(); % i3 E8 [1 j4 P1 d6 G
  return 1 ; 5 y% E6 {+ d' J. c1 w+ K
  // Program has failed.
) }9 n+ K' N: o# O2 P$ k+ V2 t7 a  }   A1 K7 }  L4 v; u( E
  0 F& I& ]& Q9 D
  IWbemServices*pSvc=0 ; , F. K  N8 z. D1 ^$ V& H
  & \6 O+ Y9 o6 f2 P* R
  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc : |) ^# P1 z+ d5 \, V' T
  // to make IWbemServices calls.
3 P6 b2 n7 P: d& v( L1 |! }4 @% S  * e( R5 M/ `7 i$ B" N6 R) [
  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"), ; q) f  ^% B+ n7 h
  NULL,NULL,0,NULL,0,0,&pSvc); ' w: n- k! a2 O9 I* r) G8 V) @
  
1 |9 V0 F  N; D- k1 H5 v6 F) S  if(FAILED(hres)) " G/ E2 ?) u: t- w% m
  {
3 Q9 Q1 v: W' C8 T' X  cout<<"Could not connect. Error code = 0x" ) H5 O% v/ M' r3 N# u& Q' k9 B( O" X
  <<hex<<hres<<endl ; 5 Y# r. B2 n% p- W- f5 q; q5 U
  pLoc->Release();
' F: t0 P9 l0 I7 o4 }6 U" Z, W  CoUninitialize();
) y# {1 e, A& d$ @2 K  return 1 ;
2 W2 C7 O& A5 t# V# g; o  // Program has failed. . f2 M9 b. R$ y* g+ L8 o; |
  } 3 i  s3 N5 u/ w' w1 O$ v
    i5 v$ c- i  ~/ @  z, f
  cout<<"Connected to WMI"<<endl ; 5 `2 w8 d! L& Q+ a* L- e" q- @
  
. ~! G8 T, s3 J2 w; u; u' z, q  // Set the IWbemServices proxy so that impersonation of the user (client) occurs. 1 }9 {# I8 U4 _8 X2 a) ~+ C( E
  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,
4 _4 y0 e/ P+ h' I  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE); ) X: N5 T! z9 Y+ l; M
  2 Q6 t! G' p& N6 m! O; J! o
  if(FAILED(hres)) & P1 O2 u6 x; `/ E
  {
; ^; w6 f4 _! R/ h, Q0 F  cout<<"Could not set proxy blanket. Error code = 0x"
. c. V8 K* l9 Y( q' b  <<hex<<hres<<endl ;
7 j' z- d8 S, D0 S  pSvc->Release(); % j" l! M+ u; ?2 s. H& ^- [8 ~
  pLoc->Release(); " `+ L& H8 R5 B0 H5 r( Z
  CoUninitialize(); + _7 X7 W1 {( r' \
  return 1 ;
; R, k) J+ A4 @  P  // Program has failed.
& w" y' c" @  n5 J9 j4 n% T/ H  }
& v1 X) W" [  D3 }6 f  . R; e# }1 R3 v
  
7 m' f5 S0 Z: G, S6 N2 \  // Use the IWbemServices pointer to make requests of WMI.
! L7 F. D: S# B' e  // Make requests here:
7 f, B  z7 y) _/ j. M  8 F- [* |/ R& v# X& e+ w% n0 f
  // For example, query for print queues that have more than 10 jobs
+ w9 t* E6 v) \- e4 e+ q0 z  IEnumWbemClassObject*pEnumerator=NULL ;
/ @! m7 s+ n6 z$ U  hres=pSvc->ExecQuery(
. Y; Q0 A" R  g" G  bstr_t("WQL"),
: c3 U* c1 a; ]8 D  bstr_t("SELECT * from Win32_BIOS"),
8 `; a6 _3 e+ t+ g3 A7 p  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY, , k8 B; `6 H5 f6 C
  NULL, / y6 H, v4 C9 }' P, [9 }2 Q  g. O
  &pEnumerator); 9 U3 O+ |$ S- p
  ; d1 U* R  m0 a' x1 \8 }# r
  if(FAILED(hres))
3 d0 Q$ U: I) k  {
1 G7 e* U) c2 R; ?! M' }: ~  cout<<"Query for print queues failed. Error code = 0x" 5 ^) ~0 d+ Z# h/ T
  <<hex<<hres<<endl ;
$ V& D: S! D# v; m! W0 Y  pSvc->Release();
/ K$ Q3 ?- G1 y& o% H$ Q  pLoc->Release();
1 A( F7 n6 Y, L+ J4 S  CoUninitialize();
% i. N1 {2 c! p5 f; m2 |  return 1 ; # k* R4 G3 F/ S" T
  // Program has failed. 5 A5 i) ^9 x+ r
  }
# Z5 m7 ]3 B% x$ a# d( w" k0 ^  else - E8 h2 m, {! b% C  v& C% Q. m4 C
  {
- x0 s' A; m; O5 }9 m  IWbemClassObject*pInstance=NULL ; 5 h5 l. j! x; d& ]3 O+ V$ j7 X' M
  ULONG dwCount ; * n: C7 y# V8 g7 A- i
  while(pEnumerator->Next(
3 W' C; i& ]/ @7 l2 w/ S% Q; x  WBEM_INFINITE, ' W, N) ~& q. j4 V. c1 S4 C9 b
  1, 0 g" @3 ^4 o, w, q* @
  &pInstance, : l) D3 x' o; S% n' A
  &dwCount)==S_OK)
- C) V( \+ }! V4 [9 N$ @/ _  { 0 k  p  ~, [5 A7 J. n
  SAFEARRAY*pvNames=NULL ; . Y% h; U: S8 F: i4 c1 C
  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK) 6 w: q# g% @: M+ ?% l" l  U( }
  {
% T2 c# c  r: [, C" V  long vbl,vbu ; # w6 A9 G8 M7 J: H
  SafeArrayGetLBound(pvNames,1,&vbl);
* H$ \9 s  Z' _5 R6 |6 {. u  SafeArrayGetUBound(pvNames,1,&vbu); 4 x% U6 f1 u5 B  a6 \5 }
  for(long idx=vbl;idx<=vbu;idx++) / P6 ^+ ?5 c& ?9 Z- U* @, t
  {   V  B$ S; F' y
  long aidx=idx ;
5 h0 o, G$ T5 F$ Q  wchar_t *wsName=0 ; ) U7 _0 a) `% ]3 G* k: a! W
  VARIANT vValue ;
3 q3 p& i  s/ J( d& I4 P  VariantInit(&vValue); / E+ x3 ]% a4 R5 R: K( [
  
; |0 [' Q+ W* a  SafeArrayGetElement(pvNames,&aidx,&wsName); 5 ]/ \0 A! A, h% M7 V: |3 a
  ' C8 ^) N9 J) _' C- Z: K
  BSTR bs=SysAllocString(wsName);
2 |* \( _3 k9 G% E6 }$ x" A3 d: ^9 I  hres=pInstance->Get(bs,0,&vValue,NULL,0); ( U2 ^- W$ a$ y5 A* H/ L4 |
  SysFreeString(bs); / K4 O+ F+ W, t- ?  \1 R( ?
  
5 z' h6 `: o7 A% V  
0 t- R& @( d! ?& a3 G( z  if(SUCCEEDED(hres)) 6 ]% c) s9 F; ?9 k0 d4 F( M! H3 X
  { + x/ {2 |( ^3 O6 E
  char szANSIString[MAX_PATH];
3 @0 _  v" X  E3 o$ }) k  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
, z) T( L: C4 m+ @$ |* v! }# k  szANSIString,sizeof(szANSIString),NULL,NULL); ; }( X$ ^! G7 i/ _) h. ?
  
* C1 z$ \" _4 x1 K" P5 l  cout<<szANSIString<<" : " ;
% t) F( ?0 z6 B) V* H1 X- [2 {  switch(vValue.vt)
6 V- s, x4 e. g$ K/ O, Z; Y. _( ?  {
6 i( w. q5 @; S" h  case VT_BSTR : 7 q+ ^& Z! ]4 {4 Q
  wprintf(L"%s",V_BSTR(&vValue));
: Y1 L- q# N; \' u+ `; W2 t4 R! p  break ;
* f+ C1 f# Z$ H3 n' Y  case VT_I2 : . O3 L  _3 p6 u+ D# X6 _; w$ o. H
  wprintf(L"%d",V_I2(&vValue)); / D/ O: q2 e0 \
  break ; # c# s8 W, X% o, C* B" j$ h; |
  case VT_I4 : ! _: x, N" N. M8 ?2 D
  wprintf(L"%d",V_I4(&vValue));
& m1 D! ?- n: _. |0 a8 ]) j  break ; ; Z( X8 j! V* @1 {0 j7 C
  case VT_BOOL :
" u# t$ R! a! y; ^  a4 B4 Z, L" |  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE"); 2 m9 ?2 u+ r  `. f, ?) L
  break ;
: a) u# |* _8 y( N' G1 }9 _7 G  default: ; [3 @! E. L" N" [" O" a
  /*WCHAR tmp[100]; ) ]9 E4 e# p5 M: P$ t! Q* B" T$ t
  wcscpy(tmp, V_BSTR(&vValue)); % G' ~7 k* G5 M$ {& u1 A2 `
  char tmp1[MAX_PATH];
" ]& w. n% E7 _* e  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1, 7 g0 z' E1 w4 i6 Z
  tmp1,sizeof(tmp1),NULL,NULL);
" {% R0 ?4 n, O- q1 `  
1 s6 C5 e7 Z) d. V- E; W# [4 v% N  cout<<tmp1;*/
4 O& a4 C. f+ T  break; 8 c9 w+ _+ J, Q. w
  }
0 V: |3 M; G+ J/ ~  cout<<endl ;
/ L% t( n2 E8 Z6 Z& }  }
, X' I1 M6 k  w" m  E. F- L7 `: l4 I  + Y: Y" i1 ]1 u# R' E
  SysFreeString(wsName);
) Y$ T" a2 ]& Q- |  } 5 c- C# u8 J' H8 o6 S
  
( E! R7 W5 i  N; g! q( {" o  } ( }1 H9 J' a* z4 w
  else
' e6 C& `  [; d3 T6 v& v& B' O  { 9 e4 J- G" R+ p
  cout<<"Query for print queues failed. Error code = 0x" 5 e+ a3 b0 |% @- S+ J
  <<hex<<hres<<endl ; * ?4 g/ d% R. |  [5 c
  pSvc->Release();
  g8 {! ]( E0 p* d- C  pLoc->Release(); 5 v3 w$ |% p3 a/ r
  CoUninitialize(); ) J9 A) u; B4 }1 q
  return 1 ;
. m9 Y- V. m8 I4 F( j+ A  // Program has failed.
1 {7 E# V; g: q$ L5 a/ D, {  }
$ B- H1 `0 V: N  if(pvNames)SafeArrayDestroy(pvNames); ( N& p# ?+ d. l% q% k0 C
  }
6 e9 s: E' h/ p7 C' v/ p, g  if(pInstance)pInstance->Release();
( y" d3 K/ F6 z# s6 e7 |  _  
7 z' I2 J) j9 |$ A& `& B  }
! y7 H- P( ^* d$ q$ t  // Cleanup
+ Q' Y' a# b1 H; ^  // ======== / g) T3 C  b. T; J0 g3 [# K
  pEnumerator->Release(); 7 Z  S9 d* M/ \# y
  pSvc->Release(); - d* v5 m$ n( [' O
  pLoc->Release(); % z. O( z4 b, `& G6 `: T/ y% M; M! w
  CoUninitialize();   A0 Q% A  `& m! o( _# b  {
  
0 L5 N3 v- H, o) h$ h! m; D/ N  return 0;
8 K; [2 U9 ~( x( H$ z' w4 p  // Program successfully completed. 8 G+ b3 V, V. Z7 F+ H3 I7 M/ \0 u
  }
8 ]  ], h- Z; I2 o  //-----------------------------------
. y2 p( M) Z5 I" }5 Z  
9 d* r& c  H* T9 `* B  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到. # B; K4 s) l$ O" ^1 K
  
4 G- C& @& m8 a( _5 b  void GetWmiInfo(TStrings *lpList, WideString wsClass)
) ], y. x; e4 g6 F7 O9 O  { * E/ A% l' r& M5 ^" M
  IWbemLocator *pWbemLocator = NULL; ' G7 ^/ ^5 d' F$ Z6 K" a* Z% m% \
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
+ [5 h0 m; f2 `  r( h5 J% L# @  { 0 m4 O4 G: r2 m3 X% q( s6 ?
  IWbemServices *pWbemServices = NULL;
! k3 l& D; S1 E$ d( Y  WideString wsNamespace = (L"root\cimv2"); 4 S* i/ O) i* E9 l! I9 v  w! Y
  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
5 E( X- b( z5 V  q  {
" s4 n& E, M1 R+ S' C3 k  IEnumWbemClassObject *pEnumClassObject = NULL;
+ }2 O$ \5 U% L( d  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
, z5 V$ Y7 d7 @' X% ~  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) : y3 o" a- `: P9 d/ G# F
  { 1 D5 ^) T; h, d% \- g
  IWbemClassObject *pClassObject = NULL; $ X; p& C/ Y& c5 F
  ULONG uCount = 1, uReturned; " D' e1 f" Z' M% M' K. Q0 M
  if(pEnumClassObject->Reset() == S_OK)
' g' w: c/ N& ~/ ?  {
9 `  D2 W( h; l  int iEnumIdx = 0; : D9 A/ O' C( \
  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
, o2 k; |& D- |! B, `3 q/ k5 t  {
& }) j; R; `/ q5 s  O' ]8 K" }- ]6 f* s. j  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------"); : M% S! S: n! j; V1 }$ A: t
  
: [( d$ Z# U( G4 B  SAFEARRAY *pvNames = NULL; $ }2 P* w0 ?3 ?6 U5 x
  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK) - J2 n9 \6 K" `6 L) b" I& F5 c
  { $ a$ u0 g! e6 z$ J; ]( k" S
  long vbl, vbu;
# Q! W- u" \! O  g0 @# }  SafeArrayGetLBound(pvNames, 1, &vbl);
: z9 {! D5 ]! b) i2 ]: E  x+ x  SafeArrayGetUBound(pvNames, 1, &vbu); + f9 w* {: {: `+ t
  for(long idx=vbl; idx<=vbu; idx++)
! e  A+ }/ T! L* S( h  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 08:57 , Processed in 0.017579 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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