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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^: 1 V# h/ V1 @  E. Y0 n
  --------------------------------------------------------------------------------
0 ]" P3 D, O! T% l1 G1 ^  q3 q( `  #define _WIN32_DCOM
3 a6 s0 F9 F  e  #include <iostream> / o) Y; l6 O: Q9 O& Z. O
  using namespace std ;
6 l! {' w6 Y. w$ h$ ]7 v6 d  #include <windows.h> 8 z9 w! U) ?" y% J" C
  #include <comdef.h> 1 u- \+ p0 n3 X+ o, m( C1 t2 x8 q& m/ W
  #include <wbemcli.h> 1 `& i8 b% m4 F% q7 h
  
) f8 j/ t, K# V; z* b% t: L4 r& Z- ?  #pragma comment(lib, "Wbemuuid") % ~# @5 \+ O* D/ a" l' a
  
9 W' B; q! t" w$ c; C$ R7 K5 ^  int main(int argc,char**argv)
$ W; q; n% {- a  { & }. d" U2 m7 b. h; a7 q
  HRESULT hres ;
9 @5 ]& R' Z7 i$ c  * E. N# x1 T+ F, `
  // Initialize COM.
$ W) L! u* s7 |4 v( n  hres=CoInitializeEx(0,COINIT_MULTITHREADED);
- I" L4 W. y& e; v5 G# H4 r  if(FAILED(hres)) 5 Q# u9 @1 y$ C: \& l
  {
8 i, S- D; i3 C  cout<<"Failed to initialize COM library. Error code = 0x"
9 B- l1 O% c$ x/ K  S. y0 T  <<hex<<hres<<endl ; ! k% x. E) K- t9 q1 g- H$ K+ g% |/ s
  return 1 ; ) X% L3 a, `5 a& _( J
  // Program has failed. 2 Z2 s2 z3 M1 g- f0 r' Q
  } " m  k' t1 |3 l3 ?
  
0 q0 e! q9 W! i  // Initialize
2 C! ^& W! u8 q. [' X! ~5 I- l' u  hres=CoInitializeSecurity( 5 S& q. w# h% F+ t- v: s, x( N
  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT, ( z+ C' j! u& X. H: R+ h
  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
/ k# t! ]4 b0 Y8 y, X8 j  
2 O4 i  @/ ^! P  , n  z1 ]1 r" q2 n8 X( W* Y
  if(FAILED(hres))
2 [$ d8 ], m) k! p! @  {
' [6 g0 L6 Q/ z  cout<<"Failed to initialize security. Error code = 0x"
( [& G" Q: X& S( N1 G6 ?, p- L  <<hex<<hres<<endl ;
. K2 ]& P! e: l; C/ @7 J3 U  CoUninitialize();   j0 s% S& k* {
  return 1 ;
# D; r: V. S& S  // Program has failed.
) f! W9 P& t4 u" ^8 a) p* W  }
: k* @$ ^  s& Z( ]6 f  ; n; r: h% j" ?* Y$ W
  // Obtain the initial locator to Windows Management on a particular host computer. - ~. }! t$ ^% B. \8 ^
  IWbemLocator*pLoc=0 ; 0 \* y7 }( q; a1 j
  
1 V3 ]3 p) o2 ^2 {0 {, g  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER, ' X. r$ I& z! P# G+ K2 Y
  IID_IWbemLocator,(LPVOID*)&pLoc);
  N1 j1 }1 W" t; x* S9 P  ! Q. a1 D& S$ F+ ^' b6 l$ w
  if(FAILED(hres))
6 {  x$ n- G+ B$ B* @2 c. w8 ~  { ! G' e: I' [4 c& h
  cout<<"Failed to create IWbemLocator object. Err code = 0x"
/ T: r; E' Q9 s+ t. ~1 J  <<hex<<hres<<endl ;
1 W, p1 p$ I$ N+ z: t1 P4 m  CoUninitialize();
5 o) J( Q9 }5 O& G  return 1 ; ( I6 S" t; z2 l4 H
  // Program has failed.
. U9 W* q  f# c4 T9 i2 t! E5 P$ c  } # y3 U& i- r; D) V$ s4 Y9 Y7 y
  5 w7 M: |3 x( D/ M/ k9 g. |2 k
  IWbemServices*pSvc=0 ; 8 \! i' I8 y6 G3 ~& q
  
" c9 x) N" b1 ^- Z8 X% i: I! V  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc
  i8 S6 K. R! b4 g3 a$ C* F  // to make IWbemServices calls. 0 b  P1 K" h2 d0 ?( F! z  _9 @9 R
  5 E4 r, e4 W( ^0 I! K. U
  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"), 9 \& k  a: w) S" p# C+ _
  NULL,NULL,0,NULL,0,0,&pSvc); ) k8 y: |4 w, O& [( O7 w
  
1 _5 T, N( X& M2 N  if(FAILED(hres)) % X, I9 m. [* V! U: f5 O
  {
+ j& S7 R' N' G3 k" [* s, U  cout<<"Could not connect. Error code = 0x"
- |. j) V8 a+ `  <<hex<<hres<<endl ;   ^6 y' G- h9 J! {6 w  ~! [$ k  w
  pLoc->Release();
& V3 \& T! d  Z" R# F3 C  CoUninitialize();
: U; S' S4 l" @" T& j  return 1 ;
# n9 v4 V& n, F  // Program has failed. 9 R6 U" I5 H, P. X4 }- o
  }
, N1 y+ n% [+ K- f/ Q9 @1 u  
. S% S- G! W; J, I/ i& x5 u8 V  cout<<"Connected to WMI"<<endl ;
1 H0 W8 l/ B2 c+ F8 i  7 \, n0 T" N9 ]
  // Set the IWbemServices proxy so that impersonation of the user (client) occurs. ) V& G5 p- J- J- {  n% I5 z; R
  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL, & ^! \2 k; \8 y$ j  W9 C0 e) k
  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
# s( u  Y- D. s9 X( ~  
" p0 Q" @  @5 u3 z' f, M) E  if(FAILED(hres)) ) `1 e% B' h1 h( S% F' \) i2 H
  { 4 V7 H$ U. \: j9 {, ^. c: L1 g4 f
  cout<<"Could not set proxy blanket. Error code = 0x" , a' ^0 }7 ]! ~
  <<hex<<hres<<endl ;
; z0 e% H( }8 q; P% R  pSvc->Release();
& s0 ^1 c6 Z# b& Q# i4 T' q7 f& X  pLoc->Release(); 2 O1 L% z0 t+ u3 [  |' d% X
  CoUninitialize();
6 M" Q" w, X2 }6 k* S  return 1 ;
9 B" Z. j# ^6 X/ i$ ~" R1 _2 Z9 z  // Program has failed.
  [" {2 w! D! Y0 D3 B  } ' }" H3 U# F6 s6 D  H
  
+ D( i$ G: A0 g; c# i8 \. q9 }3 p+ m  
6 ?7 r) {" M, o- E  // Use the IWbemServices pointer to make requests of WMI.
- R0 ~. ?5 P( P# n1 _. u. |8 c- y  // Make requests here: 4 ^3 G0 Z8 m$ @$ D3 Q
  ' l- K0 E  h0 b: O" w2 Y
  // For example, query for print queues that have more than 10 jobs
( B2 G* x, r* E% j- ^  IEnumWbemClassObject*pEnumerator=NULL ;
. {& x! n$ F8 P8 ~, w  hres=pSvc->ExecQuery( 1 X; K3 d, r/ i  N4 X  e7 r, P
  bstr_t("WQL"),
) p5 r5 }) z/ d  bstr_t("SELECT * from Win32_BIOS"),
$ Z6 X: t, c2 {0 T2 V  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
4 j+ Z1 `# l. }" j  NULL, ! @# l4 g3 ~$ K1 U$ d
  &pEnumerator);
/ c# @& C# l. ~" V3 P3 J  
# l. w6 G) z; {% p: L! P& R$ Y  O  if(FAILED(hres)) 8 G, y& z" W" M& B% X
  {
" L& |* O; J/ a1 N! v# [  cout<<"Query for print queues failed. Error code = 0x" 3 q7 s- c- ]6 @$ V2 {: B: d
  <<hex<<hres<<endl ; 3 _1 D/ A8 [$ d! Z. {
  pSvc->Release(); # k8 Q, {, G# H4 E. \  i3 P
  pLoc->Release();
0 o/ @. |5 r0 I3 q9 z  CoUninitialize();
  k/ s. [( w% U# E! y# J  return 1 ; & h: h1 [1 N" \
  // Program has failed.
% z# v: p( y3 P7 V" i8 o  }
& D# F5 `! p% \  else 9 `3 K( Q  e/ H
  { 9 {: p* E" n) A1 t5 H
  IWbemClassObject*pInstance=NULL ;
. n4 @8 V9 P% B0 R& j+ N, R$ W  ULONG dwCount ;
2 |- Z9 s+ v. J* {- z7 F; g+ E) F# K  while(pEnumerator->Next(
$ o' I, U- {4 Z  WBEM_INFINITE, 9 D( g6 i/ p, T% t; @* G6 R
  1,
, o# z  ~  N8 T! a4 r  &pInstance, + y2 w5 ]- w' r% ?) H5 `
  &dwCount)==S_OK)
5 T6 n9 T1 \, d2 c: k: J& D% }& n: n  {
3 [% A5 H$ w! |7 L  d2 P" j& X, U  SAFEARRAY*pvNames=NULL ; 3 a& }  b" z1 K% Q
  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK) 0 O" u6 N5 C% \* X$ W' F
  {
4 ]/ G. _$ `* E% `2 |- ~- n  long vbl,vbu ;
) A( `/ o) F( J; T8 U1 C  SafeArrayGetLBound(pvNames,1,&vbl); 5 @0 M( }6 H& f, [
  SafeArrayGetUBound(pvNames,1,&vbu);
/ p7 r/ G  n5 g, m  for(long idx=vbl;idx<=vbu;idx++)
% q& k+ k3 k+ b+ S- l9 T0 L7 c4 ]  { 2 ^7 z% r( K& d* T
  long aidx=idx ;
2 {% x  G2 F  n8 M$ d  wchar_t *wsName=0 ;
7 k3 b5 R1 j* z+ ]  VARIANT vValue ;
& ^$ v6 A* o) m3 A) v: n  VariantInit(&vValue);
0 N( u$ t4 S/ q6 L  # r  D2 y. C/ o
  SafeArrayGetElement(pvNames,&aidx,&wsName); . ^, {+ J, a# G
  8 L5 V/ ]' K- l6 w+ `. }
  BSTR bs=SysAllocString(wsName);
9 z" w$ o2 d. X5 G  hres=pInstance->Get(bs,0,&vValue,NULL,0); % _$ A# u: _- h! p
  SysFreeString(bs);
4 y$ h# d. ?; ]  
( c3 r% q0 H$ B  
8 C; R; Z6 L# |$ r  if(SUCCEEDED(hres))
; ^( D6 A8 o! r- Z: H& \. _  {
$ a4 _4 Z/ e- w7 J! {: t  char szANSIString[MAX_PATH];
6 [4 t. Q7 C8 M) _0 K  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1, % z, w. v5 e5 E% O: v$ A- S4 H. b3 l) v
  szANSIString,sizeof(szANSIString),NULL,NULL); / ]6 P7 O1 G; I, w6 i3 N8 u# j4 S
  
# U+ L' D; M' L* s) g9 F: N  cout<<szANSIString<<" : " ;
/ q8 e) c$ Z5 E3 \  switch(vValue.vt) % J) Q. z6 _0 k# T
  {
1 M9 {: x  _; V. o' M$ E  case VT_BSTR :
% Q1 @9 w& a  P' I! B* C  wprintf(L"%s",V_BSTR(&vValue));
. L  S9 q" Z0 `; O5 n* I  break ;
* [( b. c. X8 o5 ~  case VT_I2 :
# D0 p, {: x% b6 }  ~  wprintf(L"%d",V_I2(&vValue));
. @1 r0 s: C; l. Z4 j, Z  break ;
% X! ]2 `( o) J* c4 {: u  case VT_I4 : 6 P6 F' n; n; [( Q2 `
  wprintf(L"%d",V_I4(&vValue));
$ W. Y& z! u7 q( e+ U& ~  break ;
' q2 D6 e* Q6 R( a( F2 x  case VT_BOOL :
; m. h. U) [0 H  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE");
3 s  ^' E7 y( a! R9 }  break ; 8 d( z1 G' [. X
  default: + K) x# m. E$ C0 b3 m2 ]& q
  /*WCHAR tmp[100];
# [8 D/ O$ E  W" s  wcscpy(tmp, V_BSTR(&vValue));
  P& r/ l$ Q, w; T2 |9 w  char tmp1[MAX_PATH]; * b: n2 _9 r9 w; u4 t+ C' V. T
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1, 4 |' t* [) ]1 J
  tmp1,sizeof(tmp1),NULL,NULL);
5 e% q( J& T! S; t3 q( a5 x  ) f: c9 @9 ~- i# b2 x
  cout<<tmp1;*/ " Z& W( Q4 }5 f% t) P
  break; / _+ B/ j9 M6 w7 g
  } * x0 V2 P- G& Q9 F8 a& x
  cout<<endl ; 8 |4 X# N6 ?2 p1 [0 ^, d' }
  }
4 D) a" A/ J4 g) N' }, u  : ^" z* x: v2 d, J" e6 W1 k
  SysFreeString(wsName);
  R' o8 K$ r# g6 H  } / ?4 l6 g! e  y
  ( t+ m# Z* t. \, h$ j. _
  }
+ Y' a% W. o5 @2 Q& v4 D  else
7 y+ n7 D2 a* t4 L8 W  { 7 b! R6 H) K+ w3 e# Z
  cout<<"Query for print queues failed. Error code = 0x" * o4 V% o- ]3 n% y: J  K1 l
  <<hex<<hres<<endl ;
" V# u% r) n. y' `7 b1 e9 [# d. B  pSvc->Release();
  c2 i1 g$ W' r" R: S9 Y+ l8 c3 P  pLoc->Release();
0 s8 j7 j$ F( Q2 k0 U3 I# Q, d  CoUninitialize(); ) y' A, f! ]% k
  return 1 ; / T. i8 [( l5 i' i  P9 C
  // Program has failed. 5 Z8 \6 k9 q" Q! f1 c
  } 0 l) [! g& x2 n/ _1 D
  if(pvNames)SafeArrayDestroy(pvNames);
2 D9 p) _$ \2 W7 F' b! X( e( P  }
) z: v  m7 j/ ]5 t4 I/ ~0 G* C4 l  if(pInstance)pInstance->Release(); / t% P" r& l0 X3 e, T; T
  
: W. R8 f( W+ y) g- M4 @6 U  } 1 O% H& R! Q# \" a- r- H+ r
  // Cleanup
" i$ z8 }6 T/ k- M5 i; J  // ========
" z! M% g2 Z3 p9 x5 p  pEnumerator->Release();
! |  `$ Q) o) ?# z, J# d6 W% m  pSvc->Release(); - C! d; [9 v4 |0 R/ w2 J
  pLoc->Release(); 9 _" \2 W7 @, P* i% y% Z
  CoUninitialize(); 8 I* U7 c, C3 R* D0 c" o
  4 p1 K0 m! ~7 p- s
  return 0;
0 K4 J7 s  p/ b1 @3 R  // Program successfully completed.
" v6 q! @9 f; ~/ g5 d) j  } ; L1 G2 S0 r0 v7 P" b% u3 a
  //-----------------------------------; l% U! F6 B5 V$ e6 N0 ?  f4 L0 j
  
7 H3 Y$ H9 w1 o  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到. 0 N! }9 x/ f' H' r
    y$ R5 U( m$ y% e1 f
  void GetWmiInfo(TStrings *lpList, WideString wsClass) 7 G& z; v, N9 l. m) U
  {
4 X$ [$ v: F4 b8 A: ^& ~- o1 [  IWbemLocator *pWbemLocator = NULL; 6 `& d% x# l8 W. W# m7 M
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
/ I0 P1 |) V5 o/ q$ P  { 9 v' H" w  s* v9 y" P# E( U
  IWbemServices *pWbemServices = NULL; : [7 r4 c9 ~6 e* {7 C
  WideString wsNamespace = (L"root\cimv2"); # }# ~( {# q/ D
  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
! ^* k% P( s0 o3 R, [  {
0 u6 c) T' |& @. A  IEnumWbemClassObject *pEnumClassObject = NULL;
: y! ?4 j7 r. A1 d' N) G  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass; ; u& e1 B3 c$ j0 k0 h
  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) * a$ W. f5 M' W2 @
  {
* @' k5 k0 v! l$ q* K  IWbemClassObject *pClassObject = NULL; " K4 l* ^4 e! K3 m4 ?3 r2 s" n1 \
  ULONG uCount = 1, uReturned; " ^7 c2 D. m+ X- ]0 M# y9 b
  if(pEnumClassObject->Reset() == S_OK)
1 P# v9 W2 [# f6 I3 S9 q  {
: r  c+ ?4 n" E9 W, t6 I. h  int iEnumIdx = 0; 9 P) T7 a9 R, c: D  T" j
  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK) ' O$ J* a/ g/ b3 J5 h
  { 3 t3 J1 S+ |3 E; A  a" i5 e
  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------"); " h, \# e" p$ N; j
  . X$ `/ F1 f# Q, D8 l( {
  SAFEARRAY *pvNames = NULL; 9 W& B  E2 d5 H! M2 v: E
  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
* x" Q" b( @& F9 ?3 m, O  {
- n6 n6 s& l; O  long vbl, vbu;   @6 Y. R' |( j+ g
  SafeArrayGetLBound(pvNames, 1, &vbl);
. z2 D7 g9 c6 z8 A# ~2 ^: `1 l  SafeArrayGetUBound(pvNames, 1, &vbu);
) Q+ N& k$ F+ t+ n  for(long idx=vbl; idx<=vbu; idx++) 3 ?! W) X/ @' L- d) o( p
  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 06:38 , Processed in 0.035034 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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