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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^:
$ _! e! s- z; G8 G: A% P  --------------------------------------------------------------------------------
. q/ u1 J- L) e! y/ o- ?  #define _WIN32_DCOM ' L, v% O! X* d4 Y3 y
  #include <iostream> 7 M, ?/ D6 w5 k0 }; ]8 W
  using namespace std ;
2 _3 D0 O$ X- U# T2 }4 B6 L4 B9 c  #include <windows.h>   h0 t1 M( `& a
  #include <comdef.h>
4 w% {. `( U: H% U6 @  #include <wbemcli.h> / Y) r$ s3 b& p2 G
  
. G  |* j: q9 I5 k# f  #pragma comment(lib, "Wbemuuid") 9 P% K7 E6 q( t2 }. m) [" W
  
. j! w& u! Q9 }! Z- Y! m: h' {  int main(int argc,char**argv) , D. Z% u. _! {9 S4 b
  {
+ Q& W2 l! K5 ]/ L6 J  C; \  HRESULT hres ; ( M2 n# {; h" X+ h; U; L' J! e( x
  
/ c& z3 y3 h& s1 S1 ]% [6 k  // Initialize COM.
- V. g8 u. O2 e3 A  ^* q  hres=CoInitializeEx(0,COINIT_MULTITHREADED); & {, n% T5 U2 b; q& n5 T) D
  if(FAILED(hres)) 6 k# o  p/ M. B
  { ' M5 w5 R9 i7 d7 ^. k. P: o
  cout<<"Failed to initialize COM library. Error code = 0x" . h' G' C0 |5 i- S
  <<hex<<hres<<endl ;
6 m5 B$ y/ ]: r' C9 U: {$ e  return 1 ; 8 i6 b. w1 E8 P# |
  // Program has failed. 1 _" z7 C$ d" l8 V
  } " v9 X4 f* j( d
  & D( j" x/ b: F" e) \  K  E0 l$ W
  // Initialize
- e* G  v2 [3 K) _  hres=CoInitializeSecurity( , h6 m- u+ {( P
  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,
( r9 O+ R, X: e0 b' B4 n  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
3 s! l# P) @( ?8 u0 L  
, B+ K; i6 a* O- }: M  
7 t  F  ]; n( s6 x+ J- S( q  if(FAILED(hres))
4 a: u9 K1 \: l* Z  { 8 y$ [5 a9 r+ w7 S! A  V) f/ t
  cout<<"Failed to initialize security. Error code = 0x" , B* i9 E' q  l! Q
  <<hex<<hres<<endl ; ! E4 R" A& m. E3 Y* X' v) K
  CoUninitialize(); 4 u% I3 g- c) t8 p. j
  return 1 ;
; S2 f. D. t9 I, Y% x  // Program has failed.   s, A8 t! L1 O1 @
  }
8 j- v6 @# q% E" r  
  B$ J3 B6 Z% n- ^9 `/ f  // Obtain the initial locator to Windows Management on a particular host computer. 2 O1 z& {% L  L6 e5 O& l
  IWbemLocator*pLoc=0 ;
2 F8 S9 P$ e2 V5 d: s  
& m. R7 h4 J& \/ P; C% l  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,
: o/ J2 l' b! c  IID_IWbemLocator,(LPVOID*)&pLoc); # m9 E. d% n2 }& e, T7 Y* K/ k1 y. [
  . _$ E% }8 c2 Z" M. r7 C
  if(FAILED(hres))
! y( ]  C5 z5 \. q) i  { # S( q# E" B% e
  cout<<"Failed to create IWbemLocator object. Err code = 0x" " Z+ K3 a- v+ ?+ c9 d
  <<hex<<hres<<endl ; 2 p$ h# {! P/ e, a" W. d% v
  CoUninitialize();
# d7 S* B( O4 b! S5 V  return 1 ;
5 u. R9 L5 _0 l) L' K& W& N! J- r: ^  // Program has failed.   _' b* j8 O7 [& c' @
  } ! j2 t7 q' l! H- j& a) R
  6 G/ _% F# N5 Q1 r3 K3 }9 X
  IWbemServices*pSvc=0 ;
) E8 h0 z( Z; j5 }( k  
) X+ |$ D! ~1 a; C) }* T- G  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc
( d2 o: J4 M9 s7 T) A9 |  // to make IWbemServices calls.
0 n% X7 J8 l$ x% ]) H$ h  
( R+ ?  x! U0 Q1 ]: Q  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"),
+ s- J) W2 L1 v* @- t/ h  NULL,NULL,0,NULL,0,0,&pSvc); 1 ^# n0 I5 d! j' u" L, M
  9 I* c/ R  m# C! n$ r2 r7 c+ J# |
  if(FAILED(hres)) : Y$ A  T3 c  f! W3 z0 {' a
  {
: x2 E) V1 N; J0 e3 y  @. @  cout<<"Could not connect. Error code = 0x" $ _- h! ?( E: k; w8 q9 U8 U' \
  <<hex<<hres<<endl ;
% V0 u( ~! @; P/ {9 @  pLoc->Release();
0 d" P' H$ O  e; s' q" y$ t  CoUninitialize(); ( X& g2 w4 i: h- b
  return 1 ;
2 G; [+ ~$ q$ L& e& z8 U2 |' H$ l  // Program has failed. 0 R8 j- T! J2 c9 c/ Q6 O: ?
  }
! t% h0 O" z6 E( R% h  
5 L5 V* G$ d7 ]) f9 w7 J- Q% b  cout<<"Connected to WMI"<<endl ; # u: w8 o+ ~8 e# m: }
  
0 {, E* b) v1 G, p6 w$ ?  // Set the IWbemServices proxy so that impersonation of the user (client) occurs.
$ T2 ~8 Q' G6 I; B9 S" x! Y  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,
* Q/ Q% t2 G, U/ G5 O( T( b7 g. V  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE); $ E# c' d# w5 B, A9 @9 W, _
  , n9 h5 T# n: M6 ~
  if(FAILED(hres))
7 @0 N( t8 l* {% p9 h  {
6 v1 g6 R6 x$ f4 `& k7 u6 D+ ~  cout<<"Could not set proxy blanket. Error code = 0x" # K0 S* u+ S2 i5 V6 F: y8 i: x
  <<hex<<hres<<endl ; 9 ?/ I  y, w- W8 Y
  pSvc->Release(); 8 O+ U( g" b! R% E9 a
  pLoc->Release(); : K6 t8 v1 E9 J3 v; h
  CoUninitialize();
1 s. L2 D! \2 J% @1 g! P  return 1 ;
% r+ B& i" D% H  // Program has failed.
1 U9 X# L/ H; U3 x- h  }
/ J: x( t( J9 ?3 D6 n' m  
0 \2 ]/ i/ m# L# {) t  , V( {" M. r; t: s$ y% }7 S
  // Use the IWbemServices pointer to make requests of WMI. * e1 z; [8 u$ E) d: D
  // Make requests here: ' C/ g0 k5 P/ P% D8 |0 o
  8 g6 f6 t5 q! B% `
  // For example, query for print queues that have more than 10 jobs
/ k" M! ~0 p5 L  IEnumWbemClassObject*pEnumerator=NULL ;
' t" t$ M2 y7 j* g2 C9 I6 t( S* t  hres=pSvc->ExecQuery(
6 Q7 ]) Q( L8 n1 |  bstr_t("WQL"),
$ Y$ m8 r& V  P+ y' K  bstr_t("SELECT * from Win32_BIOS"), $ C+ ?$ v9 @' r1 f* F* G! y
  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,   }, P5 B+ @0 t! o0 N! V/ T
  NULL,
% q9 k4 p) K4 }' b7 }% a  &pEnumerator); $ l: _7 k( r1 g) r  \% t# ]+ X
  3 ]9 T" Q  ?  O$ W
  if(FAILED(hres))
6 X4 @4 N5 G" |+ w$ R3 s, S  { - s& G( ~: P' h& K/ y  ^
  cout<<"Query for print queues failed. Error code = 0x"
; N9 U: x2 D2 j) `  <<hex<<hres<<endl ; 7 p$ H6 Z- C; Q$ f) F6 @
  pSvc->Release();
7 x% Z+ @; x; g5 _  pLoc->Release(); " g# j/ R7 |) H: h* m) C
  CoUninitialize(); ' Y" s, d" q6 O& t9 T
  return 1 ; & M( R4 N0 ], P0 W/ [* D! b
  // Program has failed.
- y8 w# ]' p" U: f  } 4 E6 b  E7 [0 b, ?
  else ' c: A" Z$ D4 N6 u7 N" Q
  {
- V: Z9 _: z! q( x7 u: r5 J  IWbemClassObject*pInstance=NULL ; 7 R3 q2 y7 e4 w* ?! B
  ULONG dwCount ; / T7 }% y& s1 E% S3 n0 O
  while(pEnumerator->Next(
4 \3 N% U& K8 ?* w  WBEM_INFINITE, 7 P2 y) G5 u7 T
  1, / G+ w. o6 `) \8 g0 q7 |# {
  &pInstance, $ U. i; V- t  l: z" O  b( r
  &dwCount)==S_OK) 9 ^: U! s# j7 U3 \$ M2 \+ j
  { + [6 @# d. }/ ^% `3 q( D# a
  SAFEARRAY*pvNames=NULL ;
1 U" r4 {' `2 t5 d) U, }+ m  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK)
$ e6 n3 {6 |! z; J: q# m& n  { 5 x2 P3 h  T9 m. k2 M' S2 U% F
  long vbl,vbu ; 3 T% |' x& C' S
  SafeArrayGetLBound(pvNames,1,&vbl);
2 k& Q; Y  Y) T0 K: i  SafeArrayGetUBound(pvNames,1,&vbu); - r- r4 {& o$ x$ P5 r' |$ P4 w
  for(long idx=vbl;idx<=vbu;idx++) 9 B4 I+ h7 B+ S  F- E
  { * }: B7 _! x# [* E4 l
  long aidx=idx ; , V6 V1 z, d9 T3 M/ Y! V  o0 u+ B
  wchar_t *wsName=0 ;
5 N) y3 G; ?) O3 V: M: `  VARIANT vValue ;
7 I1 o, e, G" w" f  VariantInit(&vValue); 8 J8 E: D8 O: ?* p
  8 ]# R/ r- q. g3 w' l) J
  SafeArrayGetElement(pvNames,&aidx,&wsName);
% o0 L- r9 A+ D+ K) l9 j7 ?1 \& K  
' ^  z  U5 q8 a! z& n. M  BSTR bs=SysAllocString(wsName); . N# J/ G8 Z% M- K9 Q' j
  hres=pInstance->Get(bs,0,&vValue,NULL,0);
9 C5 N' g7 e5 \3 e6 ], c% c5 M  SysFreeString(bs);
+ b5 E2 h8 k- U" x  
+ h) T, y! d  ]/ ~& Z  
& e8 x( h7 R1 o, M, c  if(SUCCEEDED(hres)) ! C. {6 @* P- G. s
  {
$ j1 u* D* r5 A7 f  char szANSIString[MAX_PATH];
7 ]0 h+ i6 x( h$ j  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
7 K9 b3 S! Q/ i9 a0 h  szANSIString,sizeof(szANSIString),NULL,NULL);
9 S" E. J& [" D6 T  " Y7 ^- X6 M  `- V% P  d% Z
  cout<<szANSIString<<" : " ; - p5 {1 ~& _9 N' w: g. I
  switch(vValue.vt) 5 ^; \% ~; r& d/ k% N
  { 9 R! I8 d  [; k4 ~7 Z, V& l
  case VT_BSTR :
7 w2 L% s* m- i$ K# o) s  wprintf(L"%s",V_BSTR(&vValue)); 3 U' c' D$ N9 N
  break ; - E7 l1 h0 m* o
  case VT_I2 : / T; N0 ~0 l) Q8 S8 X- S% f
  wprintf(L"%d",V_I2(&vValue)); ) O" z+ V" b) f
  break ;
3 C9 }1 t4 ~( V( g" @6 Q" Y% i  case VT_I4 : 1 E# }! v* U' [1 F. L( D
  wprintf(L"%d",V_I4(&vValue));
% z  B- I& I( i$ d1 k  break ;
% T' T. m# u0 ]6 T8 k  case VT_BOOL :
9 F0 T5 }. }/ a% W  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE");
7 I& t4 p5 R( f2 I) J  break ; 1 m0 }' A* A% t) O
  default:
$ U$ p6 W8 X# [: n+ A  /*WCHAR tmp[100];
5 w3 K) A9 J8 V6 C1 K6 o$ J1 [  wcscpy(tmp, V_BSTR(&vValue)); 2 {9 c! o4 H/ I0 Y3 {0 b
  char tmp1[MAX_PATH]; . \  p5 m& M" Z1 F3 q6 r
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1,
% E% o! W# N' e/ }) z  tmp1,sizeof(tmp1),NULL,NULL);
7 \$ u* T) G4 A  ) x. i) ?8 O* P. i8 m7 a. u" v
  cout<<tmp1;*/
6 J7 E  V& u0 r* B- S. _  break; ! V3 n; i7 G2 x
  } $ S& U! W% B( f8 H
  cout<<endl ;
4 g# x( w' x2 h" `7 o  } , |# u% v+ ~2 R6 ^) y
  & f! j! a) _) u& J
  SysFreeString(wsName); ( t/ d  P. g# p+ \5 h- v# {: i
  }
1 m1 G( H  E3 q3 f( w  
7 u* F0 d: z- P8 n8 _& b$ `5 U  } 2 \' }1 x! j5 N% c0 j
  else
1 t# m8 m" g2 b' Q- x; [  { 5 M5 x" d& ?# C1 E- Y
  cout<<"Query for print queues failed. Error code = 0x" % u3 b  q  Q5 s, [& d+ }/ V# B
  <<hex<<hres<<endl ;
1 }8 B2 ~, [5 e0 n+ @  pSvc->Release();
' ~3 t0 \6 i7 [3 \8 r  pLoc->Release(); # f3 _  ~% N6 q5 k; U1 C" B
  CoUninitialize(); 8 F( y4 ^3 s# {5 ]1 o  u
  return 1 ; & K! e. j. A& r7 v' T
  // Program has failed. + @5 F  m3 ~- g" S1 J
  }
% O+ |1 M- `3 n: q9 w- e  if(pvNames)SafeArrayDestroy(pvNames);
( R1 r; V+ i: O2 c: z- }# x  } 7 Y1 }" i& _- O) `! C' J2 ~
  if(pInstance)pInstance->Release(); , q! k4 M1 O5 F! b6 K* w
  
, n" Q; V" l' R' w  } , A& w; D7 [2 \, n, |
  // Cleanup
" o& N$ M7 g! Z) G  // ========
* J* A7 s7 e1 R( Q: o# e  pEnumerator->Release();
2 k' p( ^2 d0 L1 l  pSvc->Release();
  A8 h! d( S4 `) W  pLoc->Release();
" ?% O  v' J* X4 _  CoUninitialize(); + y8 l9 q6 u* j' W2 ]/ }4 C/ Z
  
3 ?0 p  c4 ~( P8 ^" \! B4 h  return 0;
" S2 G+ }8 b$ h: s$ x  h% q  // Program successfully completed.
4 M0 ?6 N( L$ Z* F  }
7 l4 r# x, D8 G; ?) N$ q3 H6 r+ G  //-----------------------------------* o( |3 K1 K1 H; b
  
/ a8 r. _5 p) D1 M  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到.
) l: @: x& t! q0 [9 L/ c; n  
# e* G" G  l1 z' S3 c5 e1 G  void GetWmiInfo(TStrings *lpList, WideString wsClass) ! X( Z3 A; Q" |; d/ r
  {
! d9 U- b, j6 J/ g' R  IWbemLocator *pWbemLocator = NULL; 0 }1 b& {, C9 ?, Z1 @& b
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK) ; K9 l+ [5 _/ z6 Q! ?0 x9 Z
  {
% d( @8 N2 r3 F$ A) B) E" ]  IWbemServices *pWbemServices = NULL;   a  ?* D$ Y6 c2 p
  WideString wsNamespace = (L"root\cimv2");
4 s' H+ u; C4 g. }& b* k  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK) ! B2 `1 p) \  I2 [' |) D4 `# C
  {
- Z+ e$ w4 V  x2 w/ J  IEnumWbemClassObject *pEnumClassObject = NULL;
2 \4 B# s4 L+ _8 W1 l' B  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass; 8 ?: b) I3 ?$ a  r
  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) 6 m3 x; p. Y2 S7 v' O7 M
  { 5 r' C' {! C- X+ S' d, d' b* d: ~
  IWbemClassObject *pClassObject = NULL;
, q1 ~0 I% ?1 j, N+ ?  ULONG uCount = 1, uReturned;
. y: U6 U& r$ g8 T+ Y( v& T  if(pEnumClassObject->Reset() == S_OK) 2 y% O) O. x* }) R7 v; G
  {
$ ]  K% n' H; k5 _1 Y  int iEnumIdx = 0;
, }* Q5 u+ u8 Y. Y  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK) " N; t; D- c1 N- f6 m+ I
  { 2 @9 n* N; y! V* ]+ r$ I
  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------"); 9 e% t' z4 |8 ?6 e
  
8 }6 X; @6 v: `/ _, ~4 H  SAFEARRAY *pvNames = NULL; 1 c' s0 ~. [8 Y* Y/ q, G3 \! ^5 I0 L
  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
7 Z0 |6 B# _. O6 _( o, \4 h$ H  {
5 [4 ?. Q3 h: s1 M- c, g  long vbl, vbu;
& t3 [, l$ }* q5 P! U  SafeArrayGetLBound(pvNames, 1, &vbl);
7 ^9 o+ `! H( Q' @; G  SafeArrayGetUBound(pvNames, 1, &vbu); 0 }5 ~) o1 j" M3 a- s- _
  for(long idx=vbl; idx<=vbu; idx++)
( T/ y# ~  g) _7 k* k5 v1 f" O  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 20:10 , Processed in 0.019053 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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