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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^: 1 ?  _2 n. x3 s
  --------------------------------------------------------------------------------" `$ u% n- C& m5 l) o* s+ z6 ^1 ]
  #define _WIN32_DCOM
' C; S' f& E% c+ v- P  #include <iostream>
( I* _4 z4 E  I* M+ a" N. m  using namespace std ; . T; s) b8 Z+ m. T+ M2 n
  #include <windows.h>
+ F0 ?  a: D4 W1 I, T+ e* g4 P  #include <comdef.h>
& G; i% A  M4 I' M, N  #include <wbemcli.h> 4 x5 E1 E! e; T) R  |  }
  * a0 P$ S. L: t* M9 z, Q
  #pragma comment(lib, "Wbemuuid") 4 z) T) {6 m4 `# c# D6 ~  t$ K& e
  8 n+ ?  u; v+ Y' I( d: [9 N: w
  int main(int argc,char**argv) ! T: R$ H/ W) P! r: L' D+ T
  { 8 d1 A' S. n+ x
  HRESULT hres ; 0 f" K! k7 ~" g" l
  , p' k! R7 I4 `2 A% g; b
  // Initialize COM.
4 \1 J( O4 h6 b: R5 x, v9 e7 ~  hres=CoInitializeEx(0,COINIT_MULTITHREADED); 5 e  L2 d% G9 j  J
  if(FAILED(hres)) ( \, X3 P& d; K) `6 ^
  { ( u4 e- r6 u/ u1 D6 b2 r3 T- R
  cout<<"Failed to initialize COM library. Error code = 0x"
; W6 q& ?! c( J! V8 Y  <<hex<<hres<<endl ;
8 e- s5 e8 A4 k1 K& u  return 1 ;
/ f/ E. ^2 H) u+ Y' m  // Program has failed. ! l- |+ a. R! d- l2 d( D9 d
  }
- a! x2 r4 n0 \4 e  J  8 k' T1 e8 n/ p* R3 I4 D5 Q
  // Initialize ) K* S! |' A9 u7 l7 [/ R
  hres=CoInitializeSecurity(
+ Z" a! B# a: ^; e: }$ z  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,
; E5 E( p+ K$ |1 i* s+ s% H  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL); $ ]8 h2 r8 F: z9 R. y
  * o3 y9 q" s+ D& M" z
  
7 `$ l* D5 J' F9 }7 X  if(FAILED(hres))
+ T7 h7 [( ?2 G- c- b2 M  { 7 t7 u8 [( }5 e' ~# g" \
  cout<<"Failed to initialize security. Error code = 0x" # c& L0 Z* U5 u, l7 W  @; y* q+ s
  <<hex<<hres<<endl ;
& g1 ~$ A) D' F6 Z( H$ p  CoUninitialize(); : T4 T8 J- f. l7 H+ N: ^
  return 1 ;
4 x" C0 f/ H: I/ N, Q  // Program has failed. 8 W7 ?+ B  o0 @5 o* W7 d# g3 m
  } & \# B: W( s; C6 f
  7 k8 v, C4 X+ k
  // Obtain the initial locator to Windows Management on a particular host computer. : `  P5 Q- B  r$ P5 f+ |
  IWbemLocator*pLoc=0 ;
8 @2 ?* C8 u% n5 ~) Z  1 d8 o7 c3 R6 a# |' {
  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER, % U2 K& D2 I  q( d
  IID_IWbemLocator,(LPVOID*)&pLoc);   r  u* v  I5 S- A/ |6 q
  
# v0 c* `$ f1 m  if(FAILED(hres)) 9 W' p5 i$ k8 |1 `# a6 S0 |! i
  {
$ j  \: P# S% l4 K  cout<<"Failed to create IWbemLocator object. Err code = 0x"
1 v4 g* o# }0 E5 k! O7 e% J; R  <<hex<<hres<<endl ;
2 q6 X& p  p7 k: e$ X" p6 b  CoUninitialize(); ; i8 F* O" V- G
  return 1 ;
4 R% L6 V4 o3 |4 a! @* K0 X! f  // Program has failed. 3 U7 `1 Y( E4 x+ M
  } ; ^, o3 {: m: b7 D: b
  
+ X& J. {- J2 v8 z) V: W- y2 U  IWbemServices*pSvc=0 ; ( W, I5 R; ~8 d. z5 g' k5 a2 |, Q" f
  
* x; K6 |; ]4 F( c  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc
9 m6 u  \% h+ Z' t3 Y; n8 l  // to make IWbemServices calls.
" {( V7 w' B. O) H+ u  ( f1 `1 r- u8 c5 D& P8 L( \# g8 T
  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"),
' [& u# `0 {9 l! U+ c* E  NULL,NULL,0,NULL,0,0,&pSvc);
( \, o  d# }9 m; y% D' r! D  
2 ^9 U' y- l: K7 B  if(FAILED(hres))
4 `! d+ Z. n0 ^  C0 \% M  {
* q' K2 Z# s& i) m. a  cout<<"Could not connect. Error code = 0x" % b7 r& O# S+ _
  <<hex<<hres<<endl ; % Z- ~+ }, D2 o' [5 U* B( f) M1 ~
  pLoc->Release();
% V7 x; _9 J" z! K5 G1 }3 k: Y1 J  CoUninitialize();
8 o2 H# K2 [6 F  m/ Z& _  return 1 ;
/ o) x: Q: M$ g+ [  // Program has failed. - ]! F3 B2 @* m' G4 H
  }
  o6 v- x3 L0 N2 T3 v% D) {( ?* i! J  
# m9 j1 V  ^7 ]# ?8 `9 ]( }# D  cout<<"Connected to WMI"<<endl ;   T, H1 r# R; Y* F& Y$ w& U
  
5 s, A7 I9 v$ B, D4 l  // Set the IWbemServices proxy so that impersonation of the user (client) occurs.
# z! Y+ x% N  T3 n  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL, + @6 y. y) H0 Y. e( c
  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
9 n7 M3 Y+ ?) x! I" [! s8 M  3 w" H  ]" c- D1 F) a
  if(FAILED(hres))
* N: P' a) ]$ ^" T1 l  { ' o/ i: F2 @7 J9 _- n2 X. `
  cout<<"Could not set proxy blanket. Error code = 0x"
8 R  n7 k0 @+ @( r# h# s/ q  <<hex<<hres<<endl ; 2 ~7 F8 f  ~) B+ ~2 m: ?
  pSvc->Release(); 2 t# b+ [: Q7 Y, h/ b5 p' k
  pLoc->Release(); # ~8 d- u9 b) ?/ V  A& b
  CoUninitialize();
& L( |7 t1 f) o: [) i2 R6 ?  ]2 z  return 1 ; ' m  D  _8 ~8 g- r9 ~8 l! Z
  // Program has failed.
% L9 k# B6 f: M% p1 \& d4 a- P  } # a5 G. E- e  T: [
  ' E7 m. b' r* [& k1 F- b
  
+ x9 i4 F2 H8 M& p- A  // Use the IWbemServices pointer to make requests of WMI.
' c% g6 @. L' D6 o0 p0 Z  // Make requests here:
# o9 x" @% |2 _- e& X. Y  5 c# M+ a2 f+ v4 i, ~) w
  // For example, query for print queues that have more than 10 jobs
8 m7 {# I4 V$ ]4 u4 g% F1 K/ W  IEnumWbemClassObject*pEnumerator=NULL ;
& [* s! L' w1 q# m, Y  hres=pSvc->ExecQuery(
$ z7 ^" e6 @! z1 e+ h  bstr_t("WQL"),
4 D/ r) F! R* ?, f4 h  bstr_t("SELECT * from Win32_BIOS"), + a& a* ~7 B# ^0 i) w
  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
$ q/ a* }% j; H  ^. [" G9 e  NULL,
6 L- F; `+ ^% i9 K! [, T- n  &pEnumerator);
( R* ]3 G7 g0 W( o  B3 Q  
) H2 F! S' P1 Y7 }2 r7 \  if(FAILED(hres)) $ @5 V8 ~8 e5 J0 j6 z% z3 V
  {
. g- h' @! a9 g1 G  cout<<"Query for print queues failed. Error code = 0x"   [+ A' b2 D/ g+ m& \
  <<hex<<hres<<endl ;
0 N( D2 I5 _* u# u, t  pSvc->Release();
- ^' }$ d1 o6 e$ ]4 H5 P2 G$ c  pLoc->Release();
* L9 Z) k2 p% \4 E# l! W  CoUninitialize(); $ q; F- s5 t, ~% J# \2 a
  return 1 ;
% r( y! M/ x- F$ \1 d  // Program has failed.
" U+ X5 v0 U! W# l3 ~6 ^' m- c4 `  } 8 o: J, P+ F" O* t4 t
  else : w) U4 e0 O, g$ K8 b0 z
  { : w4 W9 R6 G% ^8 p2 D9 m  g; j
  IWbemClassObject*pInstance=NULL ;
) O1 I. x8 S! n$ e  n  ULONG dwCount ;
; w8 m7 ~3 v* V8 R  while(pEnumerator->Next( 2 X' g5 a1 E7 W
  WBEM_INFINITE, % O/ n! M% c8 p2 `$ Z! o, ?7 a% N
  1,
2 T- \; u! R) X3 z- F) C  &pInstance,
* U/ r# u/ E8 C9 {& {- t  &dwCount)==S_OK) ! T7 ]' D) J# l% \
  {
" p, ~- R  U2 z. ?; y2 O" {* Y% |  SAFEARRAY*pvNames=NULL ; 9 u7 E, r) V) D( I) p
  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK)
8 _- C- q: Q# j. W3 \8 R" e% p  { 0 Y! @  u1 y, A2 U' @; Z9 |
  long vbl,vbu ;
# U0 W3 m( ^4 \9 i9 E3 B  SafeArrayGetLBound(pvNames,1,&vbl);
+ S/ ]: ]- F& I7 O  SafeArrayGetUBound(pvNames,1,&vbu);
! B) `6 u4 s# S4 d  for(long idx=vbl;idx<=vbu;idx++)
& b% x, G" _) J7 j  Y0 J4 ]3 z  { ' c% s! V0 o8 U8 J" U) A
  long aidx=idx ; : w- M2 O' m# n- u& g9 M! b4 ]
  wchar_t *wsName=0 ;
; g* i6 v2 h9 _& p0 v  VARIANT vValue ; 9 F; ^7 J7 m6 Z  ]0 p5 l; a
  VariantInit(&vValue);
' G: f7 p5 ]5 ~  8 q7 b/ w3 ]6 o& E
  SafeArrayGetElement(pvNames,&aidx,&wsName);
( H: [% N0 w3 S    |8 N- ~( M, Q. T: I+ D1 e2 ^$ ?$ Z+ W
  BSTR bs=SysAllocString(wsName);
- k/ o3 p5 [6 Q' V+ N  hres=pInstance->Get(bs,0,&vValue,NULL,0); 9 y9 b! l# R: }
  SysFreeString(bs); $ h& @$ T4 U4 }/ i& h' e
  8 u- ^+ n4 _. v
  5 A; e' q! T) X7 P
  if(SUCCEEDED(hres))
! J9 s" u2 V7 z. Y) H  {
6 o* B; F- d" _; N3 [7 d  char szANSIString[MAX_PATH];
& H5 q8 O4 k0 Y. \6 j6 a8 ^+ z  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
; u# j- Y0 k$ |  szANSIString,sizeof(szANSIString),NULL,NULL); 1 _+ J& U; [' S3 X+ {
  
8 ?) H5 o: r- b7 W, H* }  cout<<szANSIString<<" : " ; & |' ~# ]+ T+ f" ^' l8 T3 x/ \9 a
  switch(vValue.vt) , ^/ C4 u; t* f
  {
" V: h' l7 Y; m6 a4 \! U  case VT_BSTR : " Z& a- V' {) D& g: L4 N
  wprintf(L"%s",V_BSTR(&vValue)); 8 f9 g9 d( f+ R6 e+ `, p; S5 S
  break ; . M  _+ T  i- l8 x+ g, y+ w/ L/ |" ~
  case VT_I2 :
7 |, N  @0 }* C$ u  wprintf(L"%d",V_I2(&vValue)); ' |* t8 t( F5 m7 J- R) _
  break ;
: j0 S! A9 Y9 K; |  case VT_I4 : / b7 v) J% z% i, ?
  wprintf(L"%d",V_I4(&vValue));
$ W4 T/ B: g- T2 C# s  break ;
: ?8 V" _" c% f9 b  [3 s; b  case VT_BOOL :
9 m6 `/ c8 \6 O! }5 H! Q  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE"); 4 Y4 l$ E3 }" f. {! ?
  break ; 9 i7 [: x/ r$ W' g: j* R! X
  default:
, F3 `$ O% E# `  /*WCHAR tmp[100]; / p+ N7 O  T# k5 F
  wcscpy(tmp, V_BSTR(&vValue)); 3 |0 M8 v9 y% o6 E- @! ]  p& z8 P
  char tmp1[MAX_PATH];   k7 C$ u; q+ w" k+ f; |
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1,
* I# W2 N+ t# @" w$ \* H  tmp1,sizeof(tmp1),NULL,NULL); 1 P! W* {3 A! {
  
2 U- x# F" b' b7 C, [- Y  cout<<tmp1;*/
1 J0 L% B( R) A; ~/ j6 q+ X1 v# P  break; 4 X$ b" G8 b! m9 ~6 B& {
  } 7 O# e3 D0 Q$ |: d, m4 v4 L
  cout<<endl ;
' D* A( u7 ^5 S' {  } ' k( J( D. H9 A5 B2 f: L! i. `# e
  
0 Q3 x/ i  J# y" O5 h/ \- c  SysFreeString(wsName);
4 U; k9 u8 h0 W% T* h  } " Z  K- l4 N5 E+ f! }" o
  
8 T# c; ]! o' Y9 ~: V! X, t  }
5 o0 E; o: d. v9 r  else : {& W) v( ^# S# J
  { ' s9 C5 S, Q% y1 V
  cout<<"Query for print queues failed. Error code = 0x"
: u# S  n# I2 Y  <<hex<<hres<<endl ; * a+ n, ^7 @( o( m6 Z, i
  pSvc->Release(); 5 S( F' E6 y$ G4 _
  pLoc->Release(); . v" X- o* ?( T9 e# D" C7 y6 J
  CoUninitialize();
# h' ~1 s4 K( }  return 1 ; & L2 r- l- k. r1 W  A; @$ k0 d
  // Program has failed. 8 ~6 a( j* O" R- m3 P+ [
  }
2 C; B0 n! Z7 O& N1 H! k  if(pvNames)SafeArrayDestroy(pvNames);
' U0 E0 e5 R' a% k' d0 r1 F4 V  } - y! e; d  b. S& ]: _
  if(pInstance)pInstance->Release(); - D! ^* c2 E6 i- @
  
) ]" x6 O- K$ Q9 g- Q  I  } 6 K/ w) r! x  g0 W' L
  // Cleanup
5 J8 @3 r7 B" `# I  // ========
% Y8 a" E6 N  k' B) g  pEnumerator->Release();
5 b9 f  M! d1 A7 U, U  pSvc->Release();   q$ V' z1 w3 o/ \' f, W" ^, i
  pLoc->Release();
. ^- ^& e5 c' I" Q  ]  CoUninitialize(); ! y- E5 C4 h! h, _/ L3 J
  
  }/ x- ]+ m: I7 W# J7 `: K* E4 H  return 0; 7 V6 H6 K/ X" X2 |5 H/ f/ p
  // Program successfully completed. ' R) X+ Q* `! }& P$ N7 s
  }
  ^: m- J/ Q! ^* q, `  //-----------------------------------
. {1 P2 t6 Y, o5 Q  # h& F8 w. H! z' w+ t3 k
  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到. 5 J, L3 `+ F! G: y4 _/ \# u& T+ s) U
  . K# t1 Z! _# D0 E* y: w
  void GetWmiInfo(TStrings *lpList, WideString wsClass) / C, m3 I0 w* o: y& G8 ^
  { + V$ O% n5 O" [, A6 z4 ^
  IWbemLocator *pWbemLocator = NULL; 4 k" G1 `$ }+ k8 \
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK) - q1 h9 }) a" B( |- `- Q! j
  {
" J# t9 P3 J6 k  f  IWbemServices *pWbemServices = NULL;
/ x! z8 d5 Q$ `: m  WideString wsNamespace = (L"root\cimv2");
1 L9 f  f) V/ z2 @+ i) v" T  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
4 u4 e* z+ g  t4 ]- V  {
  t1 ?6 ~: W% r* J  IEnumWbemClassObject *pEnumClassObject = NULL; " x4 ^, x  f7 y( p) M
  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
: R" r; `% C! v  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
! Q$ y" X# A: m8 u4 x: ^" S  { , S: c+ X; Y! b9 o3 v  Q
  IWbemClassObject *pClassObject = NULL; & b1 J" f/ B. U9 \( P6 Q5 P' a
  ULONG uCount = 1, uReturned;
0 I. h/ \& P: H, a* Q  if(pEnumClassObject->Reset() == S_OK)
! E0 W7 ~# D  P  {
: @! l; E5 {4 D- a; V  int iEnumIdx = 0;
- }  x+ [5 J" d0 j& B  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK) 3 q8 R" L) _+ `" a, h
  {
) c" D* P+ ?, j$ m9 |) g" S/ n$ d  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
7 \0 L4 n/ l$ x6 H/ b& ?$ e7 g, a  
3 D5 t3 o& h7 o  d0 d  SAFEARRAY *pvNames = NULL;
3 f6 L7 m" I7 b  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
4 J3 q, g( }2 Z/ j8 y, q  {
) _% x1 c7 g3 K% u  long vbl, vbu; 5 ?2 Y6 U3 Z1 g0 `4 p* [9 m
  SafeArrayGetLBound(pvNames, 1, &vbl);
1 d* \" }: H! F7 W' R+ |" H  SafeArrayGetUBound(pvNames, 1, &vbu); 8 f1 Z% B( _: N6 o1 T% K: Q
  for(long idx=vbl; idx<=vbu; idx++)
: Z! N7 ]; O6 l7 n& u  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-13 08:29 , Processed in 0.019067 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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