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

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

[复制链接]
发表于 2006-4-16 18:40:38 | 显示全部楼层 |阅读模式
    一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对比较繁杂,用VB和C#就方便多了.这些天到MSDN上找了些资料,总算大致搞清了一些编程思路.对于那些很想知道怎么获取诸如CPUID,硬盘ID,BIOS信息以及主板信息的人来说应该有些帮助吧.试着用MSDN的例子乱写了一通,以下是通过WMI获取BIOS的例子,不对之处还请指正 ^_^:
' O$ z% k/ Q# O9 W  W/ {  --------------------------------------------------------------------------------
0 Q3 }: ^- j2 c" |7 f7 H  #define _WIN32_DCOM
6 d1 F0 _2 x1 m) v: W/ v4 |" B: G  #include <iostream> $ J( L5 @1 X1 E* w6 x4 h
  using namespace std ;
: t: l9 A3 l$ ~8 n" S, z: p  #include <windows.h> ! L- Y0 o( g1 [
  #include <comdef.h> $ B3 I+ F' W1 H
  #include <wbemcli.h>
6 W9 W* b% M: S$ u. v  
! Z+ v7 G$ y  k  #pragma comment(lib, "Wbemuuid") 2 `9 O1 P4 p& Z) w% O
  " V/ w' ~9 ~- b2 N- v
  int main(int argc,char**argv) + n2 m1 ]  }$ A, u5 z0 A4 R, M
  { % d7 h2 i+ w" E) T3 M5 p7 s" k( M# Z2 K
  HRESULT hres ; 1 _$ p: m2 U* J# C4 f# v% l2 p7 |
  7 P( }! L. H2 A" Y6 j$ n; W
  // Initialize COM. % m! h" O5 B+ N( g8 J
  hres=CoInitializeEx(0,COINIT_MULTITHREADED); # y9 m" O- t" G# G% t9 _! y
  if(FAILED(hres))
+ }7 j: t' N& q$ `+ F- c( B, A  {
) Q, K& t; c5 j4 g, }  cout<<"Failed to initialize COM library. Error code = 0x"
: O2 w' W3 W8 b/ Q4 c, ~0 N  <<hex<<hres<<endl ;
: T6 U7 |( O0 l  c+ o7 B  return 1 ;
# q# U7 a& s$ U3 L0 O! E  U  // Program has failed.
# Y  n8 j" ]* Y  K6 a+ {% [  } 8 m7 e* h# V8 P7 q6 B0 e
  
6 d4 |: C6 I3 x  // Initialize
6 C* _, r9 q( F' D& d  hres=CoInitializeSecurity(
. J* m8 Q8 L5 J- C$ }  NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT, . h& s! o; \1 Q, d" R6 `
  RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL); % ^- Y. e$ p9 J
  
' u! i$ o" V6 V+ A" w5 A4 z2 t' N  ! ^, ?4 q  t3 P1 y9 [/ M* B! W. O
  if(FAILED(hres))
$ C; z& `8 A7 j6 J; ^& ]8 j0 P  { ; y! T: I- K0 T4 T, r, v1 z% i
  cout<<"Failed to initialize security. Error code = 0x"
8 u/ P& x9 f. x% V4 f  <<hex<<hres<<endl ; 3 r' ~; G% ^  F8 S
  CoUninitialize(); 2 G* M6 D( O) ^9 F, F0 [
  return 1 ;   p7 `) j4 o- r! Q, Y5 T
  // Program has failed.
/ T7 C: {4 {' f5 Y# ?6 T4 m9 i8 @! z  }
# o7 Q4 ^1 J- ~6 K7 |  
' ^% x4 z4 w7 E  m  // Obtain the initial locator to Windows Management on a particular host computer.
- u, p' C3 M  ~- W  IWbemLocator*pLoc=0 ;
" \  L- |0 F4 z# v: |' i  " b+ o% ^3 M8 j, J( m
  hres=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,
* d! q3 L% e2 w8 E' u; S8 K  IID_IWbemLocator,(LPVOID*)&pLoc);
: D' C; M  B* I2 R  . L0 P6 j# \! F7 ?. j  Y+ b
  if(FAILED(hres)) 7 o+ S6 a$ z* p' J3 A5 W/ C8 Z) F
  { 6 p4 a% o9 `; s: O$ t
  cout<<"Failed to create IWbemLocator object. Err code = 0x" ( G+ I. y' F; h& R3 ]
  <<hex<<hres<<endl ; + A! ?5 L1 [* q# P) E
  CoUninitialize();
) W. [: v9 t; G$ s( S" a5 H; x7 ]* f  return 1 ;
2 p7 }5 G' B' ?! L  U+ B  // Program has failed. ) j/ h: S& ]3 X% N  q/ n( g
  } ! @# f6 l3 I) }, f4 i* \
  
7 g2 g5 `( T: s  IWbemServices*pSvc=0 ; , {  S- L4 D0 W: N6 r3 y- Z7 ^
  
5 u4 C4 l- E  u2 k/ |5 J1 d7 k" B6 ]6 M  // Connect to the rootcimv2 namespace with the current user and obtain pointer pSvc & b  J1 k% N6 L
  // to make IWbemServices calls. ) m* K& Q! `8 x! u
  4 F9 S# [5 A+ J7 Z+ x# _/ r* D
  hres=pLoc->ConnectServer(_bstr_t(L"ROOT\CIMV2"),
9 P' ?1 Q! H! k8 X6 B6 X2 s  NULL,NULL,0,NULL,0,0,&pSvc); $ w; `7 }: L$ X" s
  
8 S. `* ?9 Y) m- k: P+ c  if(FAILED(hres))
1 @! `2 d8 Q6 `- ]. a9 p  {
' b8 Y1 }' [- @: W% `, M! K  cout<<"Could not connect. Error code = 0x" 8 b' S. b. o0 A% x, }
  <<hex<<hres<<endl ;
* r* X0 b( D1 T  pLoc->Release();
2 B3 v1 _* O4 K8 P# _+ o' H  CoUninitialize();
# j" T/ i3 s+ h0 m6 ]9 o' Y  return 1 ; 5 D  t9 C2 C) J. W: ~
  // Program has failed.
3 F- L. \+ {' _! t  }
- V& e) e5 p- @# s4 B& m  
4 C% J7 S, M9 z/ x' S& R/ A  cout<<"Connected to WMI"<<endl ; ; }9 D" w" u. a! D: y7 w- ^. C
  0 O5 b& }7 k, r! K) u  [
  // Set the IWbemServices proxy so that impersonation of the user (client) occurs.
4 z% g- a  D9 B8 B: W9 A  hres=CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,
, V0 i& S: y9 P% s2 v5 {7 f  RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE); 1 n5 Z% r  D+ S8 g
  
/ V8 U0 H3 C% l- |  if(FAILED(hres))
% C0 U2 M6 V0 O  {
# Y- D) g6 a; z+ J  cout<<"Could not set proxy blanket. Error code = 0x"
5 I4 H' V9 k# y% @# d" p, ^  <<hex<<hres<<endl ; 6 l$ v( y1 c8 y/ E/ s$ L' V
  pSvc->Release(); / y( ?* H' P5 B) x6 K+ c2 |# c
  pLoc->Release(); 2 d5 v5 W5 r2 }& h( |# O
  CoUninitialize();
, K$ Y& N9 J) ~2 F  return 1 ; 5 z0 i3 J4 Z( f, S* t
  // Program has failed.
2 k& m1 h  e4 [6 P1 @  }
; g& K) D8 F3 m: T  1 j, j5 J" m6 N7 I7 `9 y
  3 J1 R1 w9 k) k" z
  // Use the IWbemServices pointer to make requests of WMI.
; i, {/ L; w0 {0 x6 g. W  // Make requests here:
9 O1 y- \7 D) \/ |! L1 q  
8 f6 t' V- d/ Z2 Y  x, f/ M  // For example, query for print queues that have more than 10 jobs
4 m7 v+ R( ?6 I. X4 Y5 f3 y  IEnumWbemClassObject*pEnumerator=NULL ;
: {% _$ u0 F2 S5 ]/ M/ ?  hres=pSvc->ExecQuery( 1 O0 N% }/ q& q. k: N  K" P
  bstr_t("WQL"),
) d4 C: P% u6 U2 D# F; c/ c4 d  bstr_t("SELECT * from Win32_BIOS"),
' m0 m( n  [- N3 I  [  WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
/ v% h) q' s" k/ f( I& L3 ?$ D  NULL, - m* R1 `( l2 ^$ d* I
  &pEnumerator);
/ ]6 J9 G& w% {' h1 `8 |: a+ M  ( I4 Z$ L- X6 C, o1 i$ Q
  if(FAILED(hres))
7 [, \. Q9 f, H% M7 M8 W  {   w; T6 }0 [9 D4 P
  cout<<"Query for print queues failed. Error code = 0x" ' Y1 V( L1 T& @& F: W
  <<hex<<hres<<endl ; 6 J, v5 x' h' N7 T
  pSvc->Release(); " a" a! h& _9 |9 p+ y7 Q! V( V3 Z, L
  pLoc->Release();
+ |- W2 |3 \1 e  CoUninitialize();
6 b! I4 o0 o& @/ U6 Y% [  return 1 ; 8 i1 D1 o7 C8 g) }9 \; u4 a9 U
  // Program has failed. / p& M, d' I% Q6 j3 j
  }
; \: Q2 b9 L6 R7 ]  j5 F3 \, z  else 5 B3 h4 ?5 `5 W+ O  |; e
  {
' f. X) G, y8 ?. j  IWbemClassObject*pInstance=NULL ; - u) D+ F2 t6 S& A# b
  ULONG dwCount ; 4 C0 e/ F8 ]$ _  H% j0 N. o5 c! N
  while(pEnumerator->Next(
" A, ~& t/ L- U/ {# [: T  WBEM_INFINITE, + g4 w! Y* U; o: Z
  1, 5 k. ^' D- s5 ]( h% V% F2 @1 u; a
  &pInstance,
% V  H: T! m# s' A5 G; {& u+ C  &dwCount)==S_OK)
& v+ v  p6 u# w9 J5 }) e  e/ l2 a9 l  { 7 X( y* Y' V. u; ^- M6 p
  SAFEARRAY*pvNames=NULL ; + a, W5 ]: _" E' O/ T/ }, K
  if(pInstance->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK)
) k# r! b" V& @; }3 e" P, T, O  { / Z& C7 j* m; j3 v1 V
  long vbl,vbu ; 0 N3 [7 Q, Y. p5 D* @
  SafeArrayGetLBound(pvNames,1,&vbl);
1 \% j( N+ e! a9 a4 w  SafeArrayGetUBound(pvNames,1,&vbu);
( f- l# `6 v( a$ I  for(long idx=vbl;idx<=vbu;idx++) ; i5 @/ R8 x) a& Q, A4 G
  {
7 A4 o5 G: F2 J  long aidx=idx ;
/ z+ Z2 v; _/ ~4 k" @  wchar_t *wsName=0 ; 2 d0 N. q7 T& b9 w; }) W+ Z
  VARIANT vValue ; 4 n) N& a# X- O) h$ @# d( m
  VariantInit(&vValue);
' A  S3 K; o* @( r2 M$ G. \  , m% U  D) r% G. |& y1 l
  SafeArrayGetElement(pvNames,&aidx,&wsName); . F1 R4 ]+ t* l, A# a! K" ^* F' s. F* J
  
0 V' i! \- j6 [1 |; ^  BSTR bs=SysAllocString(wsName); 1 s) l1 T" _' t6 h( ?+ N, S( o
  hres=pInstance->Get(bs,0,&vValue,NULL,0);
0 n; W0 b( K+ E# f  SysFreeString(bs);
# G; g' T4 O9 C* p  
6 Y6 R& H4 y, Z0 |/ X. J) I1 g2 |  
9 s+ M% F/ a, l$ ?: R9 a# j$ p8 n- Q  if(SUCCEEDED(hres)) / e% i0 h: G8 Y
  {
+ m" }  }$ b8 x  {) ~  @; d  char szANSIString[MAX_PATH];
0 t! W' M5 b2 J9 ]/ o5 G  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1, ' v* t1 R% i3 P# p9 i2 P
  szANSIString,sizeof(szANSIString),NULL,NULL); " k; Q' \' i% \$ h* \/ C& _+ _
  
: E3 a% w$ G( L7 O* J# B  cout<<szANSIString<<" : " ; 6 a1 F; T" e2 V0 E
  switch(vValue.vt)
3 X& [9 k& r. |  {
6 D, |% |6 z2 Q. C9 C  case VT_BSTR : 9 i0 i& m& Y9 j6 }7 `
  wprintf(L"%s",V_BSTR(&vValue)); & A' x. @) S) R: D- i
  break ;
, l4 x3 d0 ]% ~' k, G  q  case VT_I2 : ' N7 n; m7 y# H' q0 F0 f
  wprintf(L"%d",V_I2(&vValue));
/ r- Y' n  D: V4 P  break ;
7 H1 i0 n+ @4 O; T) |  f) ~7 N& h  case VT_I4 : 2 J# a3 O( }9 h. d2 Z
  wprintf(L"%d",V_I4(&vValue)); 0 s7 [4 O9 x! m* D4 |% @0 V; ?* T
  break ; * L" q- R* S4 c& f
  case VT_BOOL : 0 ~' P' L0 c4 o0 d
  wprintf(L"%s",V_BOOL(&vValue)?L"TRUE""FALSE"); $ }  N9 x# |: q9 s, s4 P8 C
  break ;
- y7 X; S1 K! i+ `  default:
# y) Y' D/ T& G  /*WCHAR tmp[100];
: i) L/ R3 D) }  wcscpy(tmp, V_BSTR(&vValue));
5 r" Q% j1 V. W! s- f0 ]# Z0 v  char tmp1[MAX_PATH];
; l8 d7 m6 P; J/ c4 {  WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1,
  W& H0 C- s( n# v& p" Y+ X  tmp1,sizeof(tmp1),NULL,NULL);
6 h7 {0 r9 }8 h" m' B7 Z  3 M) W0 d9 N) y
  cout<<tmp1;*/
" V& p& _; q& y, p9 i* i  break;
' I# F3 ]. R3 d! R: H/ Q  }
6 a$ ]6 h/ m% g/ s  cout<<endl ; & S1 W' b7 f" |% W
  } 6 P' i  f4 Q! e9 K4 I; j3 y" \
  7 x* V/ L6 w' h9 M: R
  SysFreeString(wsName); 8 o' f; V) Q1 C' n) w, ^
  }
+ A; h) ]4 a( t+ S3 B  2 j7 ]* z" c: c4 e( M
  }
# `! X$ I* a0 x6 ?2 \  else ' g5 O3 V/ w. e# M
  {
, L  c* u- y4 D" _* x3 _  cout<<"Query for print queues failed. Error code = 0x"
5 f# U0 e0 e4 ^$ W" Z$ b# D' o  <<hex<<hres<<endl ;
1 p! w6 y  I% }  }! i3 \  L  pSvc->Release();
2 N1 _& k/ e2 k  pLoc->Release();
' |+ l. n6 k/ ~% c8 T$ |  CoUninitialize();
. u6 k% ]+ V7 m) A  return 1 ; 2 y" |8 S/ ~" [" q$ y8 `, p. B
  // Program has failed. + v+ a/ L- e9 O
  } 8 J) m3 m% E' w& y# j( n/ p2 K
  if(pvNames)SafeArrayDestroy(pvNames);
$ d) u. e/ ?- d% b  }
' u, s/ [+ |4 s3 T4 E, ~  if(pInstance)pInstance->Release();
0 ~& E7 C% f, ~- J  
' R3 g6 Q1 x# @  } ) {) |. E8 g9 A. u# X3 A
  // Cleanup 9 X  T- U, Y( L& a# d9 ~
  // ========
7 @7 T3 g' d4 o3 _! H7 n5 m1 O  pEnumerator->Release();
. @9 h" \3 s9 D' Q. \' t, a  pSvc->Release();
/ o% J+ n1 |( b, n  g* Z  pLoc->Release(); & q7 F9 ]8 ~6 Y5 p; p& O
  CoUninitialize();
3 q  U$ S/ p8 {- Q: J: ~; N+ i5 |8 }& o  % T$ S2 T+ b) q' k+ W; [  R' _/ F# o
  return 0; * {/ ]4 Z& _1 g+ @4 u) i  L" [
  // Program successfully completed. 8 q7 r4 w/ o  w( o, Q  g" \0 _6 _
  } ! O' g/ t7 E$ T& Z
  //-----------------------------------3 M" k8 E3 J6 C" v. M! `2 X- j
  : s5 N1 s. Y' _  s) T. O8 e, X
  对于怎么用BCB编, 感觉还容易一点,因为我在类型转换的时候碰到了一些问题,而在BCB中的Variant类做了比较好的封装, 具体代码可以 http://www.cppfans.com上找到.
3 e! p& r% ~- ]2 h1 i* }' o: f0 m' [; M- I5 P  5 x9 j+ V; |5 e1 x5 j
  void GetWmiInfo(TStrings *lpList, WideString wsClass) % S5 v3 ^+ [% l. |/ p- j5 z
  {
9 G# K: x7 G$ v7 L- S  IWbemLocator *pWbemLocator = NULL;
9 w" ~( i9 l) S, Z8 S& z  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK) / ~( E% j7 m) p" k. d" v
  {
" e( ^( T1 [$ M( m) @: d0 @  IWbemServices *pWbemServices = NULL; ! z' |" Q% q( ~' l/ i& I; U
  WideString wsNamespace = (L"root\cimv2"); 5 o2 Y& ]8 f' Y. x% N9 f. R
  if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
1 f) p3 ~7 {! w# V+ L: B5 i3 Y  {
! q0 W% R7 i: c. p9 w- Z  IEnumWbemClassObject *pEnumClassObject = NULL;
- a1 U& X/ I8 ?% x+ B' ]2 y  WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
3 {2 `6 z4 P! A$ v  if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
" S; s; E* }* P  e# ]8 b  { ; R* t# a( _3 f( J
  IWbemClassObject *pClassObject = NULL; + z+ @( {' ~0 j+ E1 x% t" z
  ULONG uCount = 1, uReturned;
6 r0 k4 c6 d" `2 R9 P/ [  if(pEnumClassObject->Reset() == S_OK) ! i. B  y" d9 {: v3 M' O4 ?: H
  {   a/ u( l/ g1 p7 X
  int iEnumIdx = 0; " I# ~# _' k1 \  ^
  while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK) " Q; J' Q- J4 z  I  w* U, b
  {
- i' ]- F3 x" l4 J8 t  lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
  M- P% M' V# e+ M4 [  
- J2 J5 ~0 C6 p% w. Z6 U  SAFEARRAY *pvNames = NULL; - ^0 g% y1 ^2 d5 ^; v
  if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK) 9 Q1 c' h8 l8 V* S
  {
+ s1 f! C; X3 m8 A$ x* h  long vbl, vbu;
  W" {8 b+ G# ?9 B+ Q  SafeArrayGetLBound(pvNames, 1, &vbl);
: E. j  r$ F7 M# {' t  SafeArrayGetUBound(pvNames, 1, &vbu);
3 @/ c& p/ n% N7 \+ |" t: Z% x  for(long idx=vbl; idx<=vbu; idx++) 6 W; d9 O+ D/ _0 d) @
  {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 22:50 , Processed in 0.018158 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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