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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^:
: e5 b& u7 C0 r! _( [  --------------------------------------------------------------------------------
8 z7 @: a4 T7 v7 A' A0 e  #define _WIN32_DCOM , t( ^& p! l% `8 M# ]6 L8 R3 J
  #include <iostream> 6 q* {4 x# e# ^6 y8 x4 T
  using namespace std ; ! |9 c/ {3 [/ X/ ^: u
  #include <windows.h> # a0 p9 O: |, w2 X* a
  #include <comdef.h> / v$ W# ?8 \/ g, V' R
  #include <wbemcli.h> , Y9 B* `+ ]3 y. s! ?  D
  & t2 N% u0 A  w5 [& S) |
  #pragma comment(lib, "Wbemuuid")
( e) W, ^1 H- P  0 j+ ~8 u6 c& X' N: Y( b: D+ Z
  int main(int argc,char**argv)
( s2 e$ Z! ^3 Q, m% x  {
4 g. l5 `9 Y. X! O  HRESULT hres ;
( ^) u- Y& E9 ?$ C) x8 B8 D  ) A" f1 _: e. D$ v$ G" F$ f9 _
  // Initialize COM.
+ b; n. C5 W( V# _8 u3 }  hres=CoInitializeEx(0,COINIT_MULTITHREADED); 5 ]( k* _8 }$ r: d
  if(FAILED(hres))
9 t. G6 N$ D: ?8 b% q, j  { 1 x. O* S0 {* k/ R) j1 p
  cout<<"Failed to initialize COM library. Error code = 0x"
/ u6 ~8 S$ F" E* I: b  <<hex<<hres<<endl ; ; D, ]3 ?4 l( C
  return 1 ;
7 }# M8 ?8 o$ E7 T" \  // Program has failed.
' _/ C/ `4 u4 T8 \# b  }
  y+ ]7 m4 h/ B; U! Y7 s  
0 H- u2 A, V) t$ Y/ {  // Initialize
/ u* `1 J) I7 f3 ]* _( H  hres=CoInitializeSecurity( $ n+ u* R0 ~" K. u' a" B# u; q
  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,
5 m* W; k, ~- ]8 ]6 K. B  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
, n9 G" l* q# s: d8 P$ q$ g  2 u5 z. F' t) S( c$ K
  7 s$ l: n; A9 }% G1 i. b
  if(FAILED(hres)) % @7 e, W! b# ?( R/ G
  {
8 t2 y" ~+ q3 d) E4 ]& s# L  cout<<"Failed to initialize security. Error code = 0x"
6 y( q% Z# S8 D9 p1 i  <<hex<<hres<<endl ;
) y& x' V9 b4 d% X  CoUninitialize();
4 ~5 Z  [. I$ v$ E8 v) k* I8 ]  return 1 ;
# I. B2 s! s, C, N/ V1 y4 x  // Program has failed.
) V( y1 ^0 h' ~- z  }
5 P* c. I0 g: o& u- B  
6 _, A/ a8 p; y! y! z6 j+ O  // Obtain the initial locator to Windows Management on a particular host computer.
# z2 u: n  F3 V4 w6 a- j1 o  IWbemLocator*pLoc=0 ; : \6 R8 \. a. E' H- G1 `/ ~' d! w
  4 I1 S; A8 t) s  A0 f: z
  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,   d& s4 U, Y6 p3 @7 W: s
  IID_IWbemLocator,(LPVOID*)&pLoc);
9 ~  v) {/ y) V. m+ h" P  ; l4 A0 u  z0 I. j& r5 P
  if(FAILED(hres)) / S* i4 T+ v: l2 k' A
  { ' @# t! {- o, k- g2 }' p. }
  cout<<"Failed to create IWbemLocator object. Err code = 0x"
( \3 D9 F. K; e  <<hex<<hres<<endl ; / u8 T# }4 Y, l9 B" v; |
  CoUninitialize(); * D6 x5 G% V( L/ m" G+ P
  return 1 ; / @  L- D1 v5 Z/ r& }* }- \4 q
  // Program has failed. 9 T2 A$ z) \) {; e+ v% `0 a1 A% B
  }
. `2 `5 b5 B% X7 K9 R* ~" ^  / w8 o2 t+ A, Z, O
  IWbemServices*pSvc=0 ;
2 F5 W. [! \/ F# F7 n  2 L: e2 `2 h# z9 M
  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc : t4 G% @$ [$ Y8 P
  // to make IWbemServices calls. . ^& H4 `$ @% R1 ?
  
& y  S7 V3 h* s+ I% q6 o# m; q  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"),
7 q) L* {7 Q( }( b! G1 D! o2 a0 @  NULL,NULL,0,NULL,0,0,&pSvc); 4 L1 Z. ]2 q$ K0 @6 e: n
  
2 d+ i$ k. n# d$ Z8 B  if(FAILED(hres)) * N( f' d8 |7 d2 y" ?
  { : l( s! a1 Q, }- E/ A
  cout<<"Could not connect. Error code = 0x" 2 j0 T' X3 `- x0 W$ S9 d2 @
  <<hex<<hres<<endl ;
. X" e9 u7 p- b( Q  pLoc->Release();
3 q- u/ g. K4 Q+ H+ m. G! l5 \5 Q  CoUninitialize();
7 p% D; w  L4 \; z# e7 G, ]  return 1 ;
& `3 y! ^5 I( Z+ p. c3 r, O  // Program has failed. $ V* }- ]( r3 ~2 C8 `* ?
  }
. q. b! W! y: j" x  4 l* A3 [( q- e# ?6 B
  cout<<"Connected to WMI"<<endl ;
; |9 W3 `4 D1 k$ l$ A( ?  
: [( E" A: v! o  // Set the IWbemServices proxy so that impersonation of the user (client) occurs. . C  O3 g8 d" v& U
  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL, + l" @  l3 E, ]5 l0 S) L1 \+ ~
  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
7 U- D( V9 S0 M  4 J) [* x/ m0 N2 Z. X" m$ E& _" G
  if(FAILED(hres))
5 T/ {( T% J4 E+ T  {
( C. X/ Q9 n; B, Z/ i: B# t$ ]% c5 L  cout<<"Could not set proxy blanket. Error code = 0x" ' o  f% F2 \( D: P/ r
  <<hex<<hres<<endl ;
8 t+ v& y' t% |% H$ D7 f; X  pSvc->Release(); % E% u* r% f- G. l7 f# z
  pLoc->Release(); 4 m) ]/ a- p5 B& c& [5 A# H0 d1 ^
  CoUninitialize();
9 z. e& b9 @( v4 h  return 1 ; $ e5 d; c+ b' ?3 _  f7 G& j
  // Program has failed.
- b) h5 j: l1 r& ?& x  } 6 ]; t# ]2 y5 a0 D( C
    J) S6 r5 g4 Q6 ]
  ) c6 m+ o4 L2 G
  // Use the IWbemServices pointer to make requests of WMI.
8 n$ y% {2 A# y3 x  g/ [  // Make requests here:
: R9 y+ }# I) h2 k- C: N  L8 ]  # Z* f( `# W' @4 _& X5 b$ h6 e, V! G
  // For example, query for print queues that have more than 10 jobs 9 X8 \4 ]" D: ]) H0 G/ ?3 U
  IEnumWbemClassObject*pEnumerator=NULL ;
4 A. z$ D' p" J0 {+ _& K  hres=pSvc->ExecQuery( ( t9 {+ K6 W; R
  bstr_t("WQL"), 7 E1 R' b3 }& O
  bstr_t("SELECT * from Win32_BIOS"), 6 ]. _8 V; F/ h& f
  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY, ; X# I$ |; r8 E2 a- d
  NULL,
. k" t0 o; z3 C; i; G2 ~9 ^+ @! B  &pEnumerator);
: a7 @" l- N( F' J    g& z( _. P5 r6 i4 l1 |) u4 V
  if(FAILED(hres)) 1 l) p/ c( M; i+ _7 }& t
  {
# ^' B5 N0 V$ y  ?* S1 Q  cout<<"Query for print queues failed. Error code = 0x"
/ v& _+ O4 _" t- M0 u  <<hex<<hres<<endl ;
( n) a1 \, ?( |6 y7 t# u5 Z& ^  r5 G  pSvc->Release();   a: {+ u  |, W
  pLoc->Release();
! ?8 R% o! y1 v" n# ~. n  CoUninitialize(); 7 G( t4 N5 b7 {# N
  return 1 ;
+ f4 G, Q( q( U8 o6 c6 E$ z# ?  // Program has failed.
0 ]' \) ]5 d' P" M  }
3 S- _5 [% m9 ]2 \2 }% P0 q# r  else ' S. `  Y1 l2 j
  {
8 I" Z7 o+ N& `( B4 a' d  IWbemClassObject*pInstance=NULL ; 1 ]  p& A8 y/ f5 z
  ULONG dwCount ;
( T/ o7 g& V1 |8 f  while(pEnumerator->Next( / c+ ~8 j, P6 ^7 R9 T5 I
  WBEM_INFINITE, % v" U# H. M) x. v% h/ @
  1,
3 m3 k0 o* O% F1 f) H4 w/ r6 B  &pInstance, 1 a2 r/ @; ^, n7 t4 f  ~
  &dwCount)==S_OK) % P: `9 J. W' g+ i3 Q8 |' f
  { ! s6 N. `7 g! p1 N- X* f
  SAFEARRAY*pvNames=NULL ; 4 d$ u8 i7 t! _& ~# y
  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK) % T) ?5 m# a6 [, y# Q9 g3 U8 i
  {
, E* w; u, V% `2 v- z) D- m  long vbl,vbu ; - D* s1 P6 G# y. K9 \5 ^; Z( x
  SafeArrayGetLBound(pvNames,1,&vbl);
) P+ y6 a/ B; B8 X  SafeArrayGetUBound(pvNames,1,&vbu); : X- g% y9 P( P) C6 G- i  T
  for(long idx=vbl;idx<=vbu;idx++) # B: ?9 ^8 P8 Q0 e
  { 3 F5 w% T; C8 _6 |2 [
  long aidx=idx ;
0 m% b* n+ P0 M, r  wchar_t *wsName=0 ; , _% J# S% t6 q8 z7 D
  VARIANT vValue ; * y+ H; c, k$ Q
  VariantInit(&vValue); 6 X0 D& k% o2 G" E2 N4 P
  . v# x+ T. T* q- t8 Q: B6 V: k6 ?
  SafeArrayGetElement(pvNames,&aidx,&wsName);
1 a( e8 r9 ^7 v/ D' Q  
4 ~% z' u* E" h8 U) E* w$ z2 M  BSTR bs=SysAllocString(wsName); 9 b. y: \+ {) d1 s! c  J; Z
  hres=pInstance->Get(bs,0,&vValue,NULL,0);
5 C( C/ Q" B  [  SysFreeString(bs);
( t3 K; y# w+ w, V/ `  6 v6 ?2 z% k: m
  
! `, L5 \  p" u) ~8 W4 t  if(SUCCEEDED(hres)) 9 |1 \4 G, G. [" O
  {
! `! \# {9 S. \- @, @. q9 N  char szANSIString[MAX_PATH];
1 x$ j2 e: `& R% F  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
7 X/ w- ]0 S3 O+ H3 \+ _  szANSIString,sizeof(szANSIString),NULL,NULL);
. j( U+ O) t# g! P  8 b7 d  ~; l* f0 v, A) c+ `
  cout<<szANSIString<<" : " ;
+ q  N0 {2 S: X* k  switch(vValue.vt)
- {* Q$ U( ~+ J4 ]8 F) g  j" p$ y  {
9 |& \: |) X3 }  case VT_BSTR :
1 a$ n0 o. Y2 U. n: D2 F# G  wprintf(L"%s",V_BSTR(&vValue)); # Z% z) [+ a, Q6 G5 s8 M4 `  z; @
  break ; * E3 }& d/ o% F  x) Y
  case VT_I2 : - r% i0 y) y/ ^
  wprintf(L"%d",V_I2(&vValue));
' f9 q: [( G7 z4 R9 }) W& W5 q- j  break ;
' \4 S9 V& |9 z5 m. K  case VT_I4 :
* _6 g! _- q7 Z  wprintf(L"%d",V_I4(&vValue)); 4 b. {2 q3 L# a+ o! ?0 ?
  break ;
+ d  g0 Y0 ]6 j9 t+ L  case VT_BOOL :
2 [9 {$ f3 ~! ~" |  I* X8 s0 q  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE");
) y. Y0 G0 c4 V3 I& X1 n  break ;
( ]( I3 t$ D' v% W6 Z# H! N, h" ^! R  default: 9 N( _, ~' V* n. C: K( V- T
  /*WCHAR tmp[100];
# R5 f/ t$ i1 _$ o, b/ D6 ^  wcscpy(tmp, V_BSTR(&vValue));
. S5 X, l0 j. c7 v0 q5 Q9 h% {  char tmp1[MAX_PATH]; ' D) m3 P1 o, ]. p% T
  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1, ' Q7 w2 ]$ E) F) J
  tmp1,sizeof(tmp1),NULL,NULL);
" J+ n2 t2 o7 P' ]* f  
6 c8 E- G* ?# S% V  cout<<tmp1;*/ ! a3 x; Y' Z/ {  ]
  break; & ~) {' L) c# Q
  }
$ n3 R7 z) u5 N4 a% V4 G" N  I) k4 ~  cout<<endl ;
( d+ C- J0 h4 k! x' D0 f) s  } 3 |( G+ c* `0 H+ _3 C
  
: f6 V1 v* v. _7 |  a  SysFreeString(wsName); 3 Q' c6 _$ R: V( |
  } 3 N: r; N: x: ^3 |* n. \
  ) S$ H9 y" x' O8 s9 l* h
  } / s- H; r# P9 [# g, a) G
  else 1 U0 M: g* a; L6 Z1 x
  { 1 i6 s4 ?, M/ D+ Y. \; V1 q
  cout<<"Query for print queues failed. Error code = 0x" , n$ ~5 v) T+ V# {0 B# v
  <<hex<<hres<<endl ; - o( \1 q  ^' k
  pSvc->Release();
8 r) S: _, L- P+ l$ g& e$ J  pLoc->Release(); 3 g' l4 p# V8 ~, ]6 b* D
  CoUninitialize(); 4 A1 @7 {$ ^: @8 F9 k3 a7 I
  return 1 ; & U7 c5 j$ N3 G& k7 Z
  // Program has failed.
; X& c. ~+ d1 U2 t  B/ w% v/ b  } % n6 S; b$ D( f$ f" @$ d3 L
  if(pvNames)SafeArrayDestroy(pvNames); ) @9 |) G+ ]/ \4 \  v( X
  } 8 h, Z" J  O: V4 |
  if(pInstance)pInstance->Release(); 3 Y- c- ?6 A" n$ ?; j5 {
  " I# G. u3 K% |/ c
  } ' u% O. Q- G' _% y, K" S. p2 b
  // Cleanup
: K: v" o$ q8 |, z8 E# G$ P3 P  // ======== ( N, G4 }* G% P* z; P) j( w
  pEnumerator->Release(); . s5 `/ E5 c7 z! l2 J5 ?
  pSvc->Release();
' N) R+ y! B! T. @) X/ N% f5 t  pLoc->Release(); " X2 b( w6 c, o
  CoUninitialize();
  H- `9 E& z: p7 }. t3 m  F  
- m0 n  u% |2 M3 A9 v  return 0;
6 s& }" G" E/ H: i; U" H5 F- Z" n  // Program successfully completed. ( [) k8 D1 P3 M' l  X) k$ c
  } * j- z& ?- P( u8 H& }6 J2 _
  //-----------------------------------3 t6 L) o3 R% x; d4 a+ E$ t& }) \
  
) U  Z) ?" H& H  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到. 7 n# i6 f! g+ W* C( L8 G
  , `# ]. }" S7 w* ?& j; @3 h
  void GetWmiInfo(TStrings *lpList, WideString wsClass)
; U- O& b. f- W. A( D  {
* e1 N+ G  P% D$ H( x5 {6 v  IWbemLocator *pWbemLocator = NULL;
+ s: m/ j  f% B  h. x! ^  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
0 E2 i0 V( l2 c, E( I0 {, ]. I  { 9 J/ b1 f' F! M; Y3 K) }) ?
  IWbemServices *pWbemServices = NULL; * O0 q  K8 H: }5 E7 `5 i; K
  WideString wsNamespace = (L"root\cimv2"); 1 p; v4 v3 R0 J
  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
6 s( M- h1 J: v. c5 `6 [0 S  j  {
1 r8 ^9 J# J5 h* A3 E: M! I! F  IEnumWbemClassObject *pEnumClassObject = NULL; 2 `2 b4 h# G, a# V3 G8 `& q
  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
" D$ T3 b, ]( i& J8 [  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
' y; ^0 \$ }; k  E  { : X  S% j; f% H( |
  IWbemClassObject *pClassObject = NULL; % z5 c) {3 C6 z0 Z: L8 T* y
  ULONG uCount = 1, uReturned; 6 U  C. Q  o- _, t
  if(pEnumClassObject->Reset() == S_OK) ) `9 K0 F$ w6 f" r7 m* \4 Q/ J2 |* ~, ]
  { 9 m9 ~2 Q  {8 }  h$ C2 K- K! y
  int iEnumIdx = 0;
* c/ O& `' b% Q& p4 L/ a: m9 Z  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
# Y' I7 j2 o3 Z; D4 e  { / f- `8 T" E; D( I( p+ L7 `
  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------"); : j2 Q& ]" W7 ?% j9 L
  
. b: e' d) m) r- E( h  SAFEARRAY *pvNames = NULL; 3 o# z+ R8 h0 f3 U  A+ j0 X% {
  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK) 3 }- N7 t7 x- j: m# [
  {
/ O+ }8 V1 B8 D; {. v  long vbl, vbu;
2 a! Z5 ?, v) `  SafeArrayGetLBound(pvNames, 1, &vbl);
8 T7 k/ I5 X" n7 V  SafeArrayGetUBound(pvNames, 1, &vbu); $ U# ]. s- P) t; [1 _$ I
  for(long idx=vbl; idx<=vbu; idx++) % v/ [0 S0 A0 V- s
  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-14 01:04 , Processed in 0.017678 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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