WMI Lib

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

WMI Lib

Message par Droopy »

Juste le code de Dataminer convertit en librairie ( Pour faciliter les requêtes WMI)

Code : Tout sélectionner

; Autheur : DataMiner
; Modifié par Droopy pour en faire une Lib
; PureBasic 3.93 
; 14/06/05

;{- WMI Constants 
#COINIT_MULTITHREAD=0 
#RPC_C_AUTHN_LEVEL_CONNECT=2 
#RPC_C_IMP_LEVEL_IDENTIFY=2 
#EOAC_NONE=0 
#RPC_C_AUTHN_WINNT=10 
#RPC_C_AUTHZ_NONE=0 
#RPC_C_AUTHN_LEVEL_CALL=3 
#RPC_C_IMP_LEVEL_IMPERSONATE=3 
#CLSCTX_INPROC_SERVER=1 
#wbemFlagReturnImmediately=16 
#wbemFlagForwardOnly=32 
#IFlags = #wbemFlagReturnImmediately + #wbemFlagForwardOnly 
#WBEM_INFINITE=$FFFFFFFF 
#WMISeparator=","
;}

Procedure.l ansi2bstr(ansi.s) 
  size.l=MultiByteToWideChar_(#CP_ACP,0,ansi,-1,0,0) 
  Dim unicode.w(size) 
  MultiByteToWideChar_(#CP_ACP, 0, ansi, Len(ansi), unicode(), size) 
  ProcedureReturn SysAllocString_(@unicode()) 
EndProcedure 

Procedure bstr2string (bstr) 
  Shared result.s 
  result.s = "" 
  pos=bstr 
  While PeekW (pos) 
    result=result+Chr(PeekW(pos)) 
    pos=pos+2 
  Wend 
  ProcedureReturn @result 
EndProcedure 

ProcedureDLL.s WMI(WMICommand.s)
;- WMI Initialize 
CoInitializeEx_(0,#COINIT_MULTITHREAD) 
hres=CoInitializeSecurity_(0, -1,0,0,#RPC_C_AUTHN_LEVEL_CONNECT,#RPC_C_IMP_LEVEL_IDENTIFY,0,#EOAC_NONE,0) 
If hres <> 0: MessageRequester("ERROR", "unable to call CoInitializeSecurity", #MB_OK): Goto cleanup: EndIf 
hres=CoCreateInstance_(?CLSID_WbemLocator,0,#CLSCTX_INPROC_SERVER,?IID_IWbemLocator,@loc.IWbemLocator) 
If hres <> 0: MessageRequester("ERROR", "unable to call CoCreateInstance", #MB_OK): Goto cleanup: EndIf 
hres=loc\ConnectServer(ansi2bstr("root\cimv2"),0,0,0,0,0,0,@svc.IWbemServices) 
If hres <> 0: MessageRequester("ERROR", "unable to call IWbemLocator::ConnectServer", #MB_OK): Goto cleanup: EndIf 
hres=svc\queryinterface(?IID_IUnknown,@pUnk.IUnknown) 
hres=CoSetProxyBlanket_(svc,#RPC_C_AUTHN_WINNT,#RPC_C_AUTHZ_NONE,0,#RPC_C_AUTHN_LEVEL_CALL,#RPC_C_IMP_LEVEL_IMPERSONATE,0,#EOAC_NONE) 
If hres <> 0: MessageRequester("ERROR", "unable to call CoSetProxyBlanket", #MB_OK): Goto cleanup: EndIf 
hres=CoSetProxyBlanket_(pUnk,#RPC_C_AUTHN_WINNT,#RPC_C_AUTHZ_NONE,0,#RPC_C_AUTHN_LEVEL_CALL,#RPC_C_IMP_LEVEL_IMPERSONATE,0,#EOAC_NONE) 
If hres <> 0: MessageRequester("ERROR", "unable to call CoSetProxyBlanket", #MB_OK): Goto cleanup: EndIf 
pUnk\release() 


;- CallData
k=CountString(WMICommand,#WMISeparator)
Dim wmitxt$(k+1) 
Debug k+1
For i=1 To k 
  wmitxt$(i) = StringField(WMICommand,i,#WMISeparator)
Next 

hres=svc\ExecQuery(ansi2bstr("WQL"),ansi2bstr(wmitxt$(1)), #IFlags,0,@pEnumerator.IEnumWbemClassObject) 
If hres <> 0: MessageRequester("ERROR", "unable to call IWbemServices::ExecQuery", #MB_OK): Goto cleanup: EndIf 
hres=pEnumerator\reset() 
Repeat 
hres=pEnumerator\Next(#WBEM_INFINITE, 1, @pclsObj.IWbemClassObject, @uReturn) 
For i=2 To k 
  mem=AllocateMemory(1000) 
  hres=pclsObj\get(ansi2bstr(wmitxt$(i)), 0, mem, 0, 0) 
  type=PeekW(mem) 
  Select type 
    Case 8 
      val.s=PeekS(bstr2string(PeekL(mem+8))) 
    Case 3 
      val.s=Str(PeekL(mem+8)) 
    Default 
      val.s="" 
  EndSelect 
  If uReturn <> 0: wmi$=wmi$+wmitxt$(i)+" = "+val+Chr(10)+Chr(13): EndIf 
  FreeMemory(mem) 
Next 
Until uReturn = 0 

;- Cleanup 
cleanup: 
svc\release() 
loc\release() 
pEnumerator\release() 
pclsObj\release() 
CoUninitialize_() 

ProcedureReturn wmi$
EndProcedure

;{- WMI DATASECTION
DataSection 
CLSID_IEnumWbemClassObject: 
  ;1B1CAD8C-2DAB-11D2-B604-00104B703EFD 
Data.l $1B1CAD8C 
Data.w $2DAB, $11D2 
Data.b $B6, $04, $00, $10, $4B, $70, $3E, $FD 
IID_IEnumWbemClassObject: 
  ;7C857801-7381-11CF-884D-00AA004B2E24 
Data.l $7C857801 
Data.w $7381, $11CF 
Data.b $88, $4D, $00, $AA, $00, $4B, $2E, $24 
CLSID_WbemLocator: 
    ;4590f811-1d3a-11d0-891f-00aa004b2e24 
Data.l $4590F811 
Data.w $1D3A, $11D0 
Data.b $89, $1F, $00, $AA, $00, $4B, $2E, $24 
IID_IWbemLocator: 
    ;dc12a687-737f-11cf-884d-00aa004b2e24 
Data.l $DC12A687 
Data.w $737F, $11CF 
Data.b $88, $4D, $00, $AA, $00, $4B, $2E, $24 
IID_IUnknown: 
    ;00000000-0000-0000-C000-000000000046 
Data.l $00000000 
Data.w $0000, $0000 
Data.b $C0, $00, $00, $00, $00, $00, $00, $46 

EndDataSection
;}


;/ TEST 
; MessageRequester("WMI",WMI("Select * FROM Win32_OperatingSystem,Name,CSDVersion,SerialNumber,RegisteredUser,Organization"))
; MessageRequester("WMI",WMI("SELECT * FROM Win32_BIOS,Manufacturer,Caption,SerialNumber"))
; MessageRequester("WMI",WMI("SELECT * FROM Win32_VideoController,DeviceID,Caption,AdapterDACType,DriverVersion,InstalledDisplayDrivers,CurrentBitsPerPixel,CurrentRefreshRate,CurrentHorizontalResolution,CurrentVerticalResolution" ))
; MessageRequester("WMI",WMI("SELECT * FROM Win32_LogicalDisk,DeviceID,Description,VolumeName,FileSystem,size,FreeSpace,VolumeSerialNumber,Compressed"))
tme007
Messages : 57
Inscription : mar. 26/oct./2004 12:34

Message par tme007 »

Très bonne idée ... je prends !

Ce serait intéressant d'également ajouter la possibilité de lancer des commandes WMI ... du style 'Stop NT Service', 'Start NT Service', etc ....
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Pendant un moment je cherchai a emuler un code VB d un gars de ma classe mais j ai bloque sur le WMI... des que je rentre je teste ca

Dri :D
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Bug corrigé ( un seul objet ne renvoyait rien / dernier objet non plus)

Code : Tout sélectionner

; Author : DataMiner
; Tweaked by Droopy to create a Libary
; PureBasic 3.93 
; 14/06/05

;{- WMI Constants 
#COINIT_MULTITHREAD=0 
#RPC_C_AUTHN_LEVEL_CONNECT=2 
#RPC_C_IMP_LEVEL_IDENTIFY=2 
#EOAC_NONE=0 
#RPC_C_AUTHN_WINNT=10 
#RPC_C_AUTHZ_NONE=0 
#RPC_C_AUTHN_LEVEL_CALL=3 
#RPC_C_IMP_LEVEL_IMPERSONATE=3 
#CLSCTX_INPROC_SERVER=1 
#wbemFlagReturnImmediately=16 
#wbemFlagForwardOnly=32 
#IFlags = #wbemFlagReturnImmediately + #wbemFlagForwardOnly 
#WBEM_INFINITE=$FFFFFFFF 
#WMISeparator=","
;}

Procedure.l ansi2bstr(ansi.s) 
  size.l=MultiByteToWideChar_(#CP_ACP,0,ansi,-1,0,0) 
  Dim unicode.w(size) 
  MultiByteToWideChar_(#CP_ACP, 0, ansi, Len(ansi), unicode(), size) 
  ProcedureReturn SysAllocString_(@unicode()) 
EndProcedure 

Procedure bstr2string (bstr) 
  Shared result.s 
  result.s = "" 
  pos=bstr 
  While PeekW (pos) 
    result=result+Chr(PeekW(pos)) 
    pos=pos+2 
  Wend 
  ProcedureReturn @result 
EndProcedure 

ProcedureDLL.s WMI(WMICommand.s)
;- WMI Initialize 
CoInitializeEx_(0,#COINIT_MULTITHREAD) 
hres=CoInitializeSecurity_(0, -1,0,0,#RPC_C_AUTHN_LEVEL_CONNECT,#RPC_C_IMP_LEVEL_IDENTIFY,0,#EOAC_NONE,0) 
If hres <> 0: MessageRequester("ERROR", "unable to call CoInitializeSecurity", #MB_OK): Goto cleanup: EndIf 
hres=CoCreateInstance_(?CLSID_WbemLocator,0,#CLSCTX_INPROC_SERVER,?IID_IWbemLocator,@loc.IWbemLocator) 
If hres <> 0: MessageRequester("ERROR", "unable to call CoCreateInstance", #MB_OK): Goto cleanup: EndIf 
hres=loc\ConnectServer(ansi2bstr("root\cimv2"),0,0,0,0,0,0,@svc.IWbemServices) 
If hres <> 0: MessageRequester("ERROR", "unable to call IWbemLocator::ConnectServer", #MB_OK): Goto cleanup: EndIf 
hres=svc\queryinterface(?IID_IUnknown,@pUnk.IUnknown) 
hres=CoSetProxyBlanket_(svc,#RPC_C_AUTHN_WINNT,#RPC_C_AUTHZ_NONE,0,#RPC_C_AUTHN_LEVEL_CALL,#RPC_C_IMP_LEVEL_IMPERSONATE,0,#EOAC_NONE) 
If hres <> 0: MessageRequester("ERROR", "unable to call CoSetProxyBlanket", #MB_OK): Goto cleanup: EndIf 
hres=CoSetProxyBlanket_(pUnk,#RPC_C_AUTHN_WINNT,#RPC_C_AUTHZ_NONE,0,#RPC_C_AUTHN_LEVEL_CALL,#RPC_C_IMP_LEVEL_IMPERSONATE,0,#EOAC_NONE) 
If hres <> 0: MessageRequester("ERROR", "unable to call CoSetProxyBlanket", #MB_OK): Goto cleanup: EndIf 
pUnk\release() 


;- CallData
k=CountString(WMICommand,#WMISeparator)
Dim wmitxt$(k) 
For i=0 To k
  wmitxt$(i) = StringField(WMICommand,i+1,#WMISeparator)
Next 

For z=0 To k
  Debug Str(z)+" "+wmitxt$(z)
Next


hres=svc\ExecQuery(ansi2bstr("WQL"),ansi2bstr(wmitxt$(0)), #IFlags,0,@pEnumerator.IEnumWbemClassObject) 
If hres <> 0: MessageRequester("ERROR", "unable to call IWbemServices::ExecQuery", #MB_OK): Goto cleanup: EndIf 
hres=pEnumerator\reset() 
Repeat 
hres=pEnumerator\Next(#WBEM_INFINITE, 1, @pclsObj.IWbemClassObject, @uReturn) 
For i=1 To k
  mem=AllocateMemory(1000) 
  hres=pclsObj\get(ansi2bstr(wmitxt$(i)), 0, mem, 0, 0) 
  type=PeekW(mem) 
  Select type 
    Case 8 
      val.s=PeekS(bstr2string(PeekL(mem+8))) 
    Case 3 
      val.s=Str(PeekL(mem+8)) 
    Default 
      val.s="" 
  EndSelect 
  If uReturn <> 0: wmi$=wmi$+wmitxt$(i)+" = "+val+Chr(10)+Chr(13): EndIf 
  FreeMemory(mem) 
Next 
Until uReturn = 0 

;- Cleanup 
cleanup: 
svc\release() 
loc\release() 
pEnumerator\release() 
pclsObj\release() 
CoUninitialize_() 

ProcedureReturn wmi$
EndProcedure

;{- WMI DATASECTION
DataSection 
CLSID_IEnumWbemClassObject: 
  ;1B1CAD8C-2DAB-11D2-B604-00104B703EFD 
Data.l $1B1CAD8C 
Data.w $2DAB, $11D2 
Data.b $B6, $04, $00, $10, $4B, $70, $3E, $FD 
IID_IEnumWbemClassObject: 
  ;7C857801-7381-11CF-884D-00AA004B2E24 
Data.l $7C857801 
Data.w $7381, $11CF 
Data.b $88, $4D, $00, $AA, $00, $4B, $2E, $24 
CLSID_WbemLocator: 
    ;4590f811-1d3a-11d0-891f-00aa004b2e24 
Data.l $4590F811 
Data.w $1D3A, $11D0 
Data.b $89, $1F, $00, $AA, $00, $4B, $2E, $24 
IID_IWbemLocator: 
    ;dc12a687-737f-11cf-884d-00aa004b2e24 
Data.l $DC12A687 
Data.w $737F, $11CF 
Data.b $88, $4D, $00, $AA, $00, $4B, $2E, $24 
IID_IUnknown: 
    ;00000000-0000-0000-C000-000000000046 
Data.l $00000000 
Data.w $0000, $0000 
Data.b $C0, $00, $00, $00, $00, $00, $00, $46 

EndDataSection
;}


;/ TEST 
; MessageRequester("WMI",WMI("Select * FROM Win32_OperatingSystem,Name,CSDVersion,SerialNumber,RegisteredUser,Organization"))
; MessageRequester("WMI",WMI("SELECT * FROM Win32_BIOS,Manufacturer,Caption,SerialNumber"))
; MessageRequester("WMI",WMI("SELECT * FROM Win32_VideoController,DeviceID,Caption,AdapterDACType,DriverVersion,InstalledDisplayDrivers,CurrentBitsPerPixel,CurrentRefreshRate,CurrentHorizontalResolution,CurrentVerticalResolution" ))
; MessageRequester("WMI",WMI("SELECT * FROM Win32_LogicalDisk,DeviceID,Description,VolumeName,FileSystem,size,FreeSpace,VolumeSerialNumber,Compressed"))

Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Répondre