WMIQuery.pbi

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

WMIQuery.pbi

Message par falsam »

Objectif : Obtenir des informations sur la configuration est l'activité d'un ordinateur.

WMI
WMI est une API créée en 1998 par Microsoft qui permet de gèrer une base de données sur chaque PC sur lequel il est installé contenant des informations liées aux matériels et logiciels installés sur votre ordinateur. WMI permet aussi d'obtenir des informations sur un ordinateur distant mais je ne développerais pas ce sujet car je ne sais pas comment faire .... pour le moment. (Noob Inside)

Des classes
Chaque information logiciel/matériel est regroupée à travers des classes.
Exemple de quelques classes : Win32_MotherboardDevice, Win32_NetworkAdapterConfiguration, Win32_DisplayConfiguration, etc...

Des propriétes
Une classe contient des propriétés
Exemple d'une classe contenant un extrait des propriétés.
class Win32_ComputerSystem
string Manufacturer;
string Model;
string SystemType;

Une requête
Connaitre des informations sur une classe consiste à exécuter une requête de type WQL. ça ressemble à des requêtes SQL en moins bien.

Exemples de requête:
Select * from Win32_ComputerSystem Pour sélectionner toutes les propriétes d'une classe.
Select Manufacturer, Model, SystemType from Win32_ComputerSystem pour sélectionner quelques propriétés.

Mise en oeuvre avec Pure Basic
J'ai repris un code sur lequel plusieurs utilisateurs de Pure Basic se sont pencher pour en sortir quelques chose de fonctionnelle. J'ai juste modifier ce code en ajoutant une liste structurée qui contient le résultat des requêtes.

Pour ce premier tutoriel, je veux connaitre le fabriquant, le model et le type de système qui fonctionne sur l'ordinateur de mon ordinateur.
Pour cela je veux interroger la classe Win32_ComputerSystem

Vous devez inclure le fichier WMIQuery.pbi

Code : Tout sélectionner

IncludeFile "WMIQuery.pbi"
Cet include contient la structure WMIClass associé à une classe WMI.
Cette structure contient les variable Property (string) et Value (String)

Dans votre code, il est nécessaire de sérialiser cette structure.

Code : Tout sélectionner

NewList WMIResult.WMIClass()
Il est temps maintenant d’interroger une classe. On va utiliser la fonction WMIQuery()
WMIQuery(WMIReqSql.s, Liste())
WMIReqSql : La requête que vous envoyer.
Liste() : La liste structurée que vous avez défini.

Code : Tout sélectionner

WMIQuery("Select Manufacturer, Model, SystemType from Win32_ComputerSystem", WMIResult())
Pour finir, examinons le résultat.

Code : Tout sélectionner

ForEach WMIResult()
  Debug WMIResult()\Property + "=" + WMIResult()\Value
Next
Le code complet de ce premier tutoriel sur WMI.

Code : Tout sélectionner

;Computer Manufacturer

IncludeFile "WMIQuery.pbi"

NewList WMIResult.WMIClass()

If WMIQuery("Select Manufacturer, Model, SystemType from Win32_ComputerSystem", WMIResult())
  ForEach WMIResult()
    Debug WMIResult()\Property + "=" + WMIResult()\Value
  Next
EndIf
L'include WMIQuery.pbi

Code : Tout sélectionner

;WMIQuery Version 1.00
;
;Pure Basic 4.51, 4.61, 5.00 Beta
;
;Contributor : Andre (2004), DataMiner (2005) ..... others who have tried :)
;Update      : falsam (19.09.2012) 
;
;Add
;Procedure WMIQuery(WMIReqSql.s, Map WMIMap.s())
;Run a WMI query and retrieve one or all properties of a class in a map
;
;Example
;NewList WMIResult.WMIClass()

;If WMIQuery("Select Manufacturer, Model, SystemType from Win32_ComputerSystem", WMIResult())
;  ForEach WMIResult()
;    Debug WMIResult()\Property + "=" + WMIResult()\Value
;  Next
;EndIf

;WMI constants
#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
#WBEM_INFINITE = $FFFFFFFF
#IFlags = #wbemFlagReturnImmediately + #wbemFlagForwardOnly

Structure WMIClass
  Property.s
  Value.s  
EndStructure

Procedure.l ansi2bstr(ansi.s)
  Protected Size.l, i.i, tmp.s
  
  size=MultiByteToWideChar_(#CP_ACP,0,ansi,Len(ansi),0,0)
  Dim unicode.w(size)
  MultiByteToWideChar_(#CP_ACP, 0, ansi, Len(ansi), unicode(), size);#CP_ACP
  For i=0 To size
    tmp + Hex(unicode(i),#PB_Unicode)  
  Next
  
  ProcedureReturn SysAllocString_(@unicode())
EndProcedure

Procedure bstr2string (bstr)
  Static result.s
  result = PeekS(bstr, -1, #PB_Unicode)
  ProcedureReturn @result
EndProcedure

; Interrogate WMI Database
Procedure WMIQuery(WMIReqSql.s, List WMI.WMIClass())
  
  Protected Mem.l
  Protected hres.i
  Protected loc.IWbemLocator
  Protected svc.IWbemServices
  Protected pUnk.IUnknown
  Protected pEnumerator.IEnumWbemClassObject
  Protected pclsObj.IWbemClassObject
  Protected uReturn
  Protected sf.l
  Protected lBound.i, uBound.i, i.i
  Protected temp.l,  x.Variant, Type.i
  Protected Property.s, Val.s
  Protected nDim.i, plUbound.i, z.i, rgVar
  
 
  ClearList(WMI())
  ; --- Step 1: Initialize COM parameters with a call to CoInitializeEx  
  CoInitializeEx_(0, #COINIT_MULTITHREADED)
  
  ; --- Step 2: Initialize COM process security by calling CoInitializeSecurity.
  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)
    CoUninitialize_()
    ProcedureReturn #False
  EndIf
  
  ; --- Step 3: Obtain the initial locator to WMI by calling CoCreateInstance. 
  hres=CoCreateInstance_(?CLSID_WbemLocator,0,#CLSCTX_INPROC_SERVER,?IID_IWbemLocator,@loc.IWbemLocator) 
  If hres <> 0
    MessageRequester("ERROR", "unable to call CoCreateInstance", #MB_OK)
    loc\release()
    CoUninitialize_()
    ProcedureReturn #False
  EndIf
  
  ; --- Step 4: Obtain a pointer to IWbemServices for the root\cimv2 namespace on the local computer by calling IWbemLocator::ConnectServer. 
  ;hres=loc\ConnectServer(Ansi2Uni("root\cimv2"),0,0,0,0,0,0,@svc)
  If #PB_Compiler_Unicode = 1;we create unicode application
    hres=loc\ConnectServer(@"root\cimv2" ,0,0,0,0,0,0,@svc.IWbemServices)
  Else; non unicode
    hres=loc\ConnectServer(ansi2bstr("root\cimv2"),0,0,0,0,0,0,@svc.IWbemServices)  
  EndIf
  If hres <> 0
    MessageRequester("ERROR", "unable to call IWbemLocator::ConnectServer", #MB_OK)
    svc\release()
    loc\release()
    CoUninitialize_()
    ProcedureReturn #False
  EndIf
    
  ; --- Step 5: Set IWbemServices proxy security so the WMI service can impersonate the client by calling CoSetProxyBlanket. 
  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)
    svc\release()
    loc\release()
    CoUninitialize_()
    ProcedureReturn #False
  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)
    svc\release()
    loc\release()
    CoUninitialize_()
    ProcedureReturn #False
  EndIf
  
  pUnk\release()
  
  ; --- Step 6: Use the IWbemServices pointer to make requests of WMI.   
  ;hres=svc\ExecQuery(Ansi2Uni("WQL"), Ansi2Uni(WMIReqSql), #IFlags,0,@pEnumerator)
  ;hres=svc\ExecQuery(@"WQL",@WMIobj, #IFlags,0,@pEnumerator.IEnumWbemClassObject) 
  If #PB_Compiler_Unicode = 1
    hres=svc\ExecQuery(@"WQL",@WMIReqSql, #IFlags,0,@pEnumerator.IEnumWbemClassObject)  
  Else
   hres=svc\ExecQuery(ansi2bstr("WQL"),ansi2bstr(WMIReqSql), #IFlags,0,@pEnumerator.IEnumWbemClassObject) 
  EndIf
  
  If hres <> 0
    MessageRequester("ERROR", "unable to call IWbemServices::ExecQuery", #MB_OK)
    svc\Release() 
    loc\Release() 
    pEnumerator\Release() 
    CoUninitialize_() 
    ProcedureReturn #False 
  EndIf
  
  ; --- Step 7: Get the data from the WQL query. The IEnumWbemClassObject pointer is linked to the data objects that the query returned,  
  ; ---            and the data objects can be retrieved with the IEnumWbemClassObject::Next method. This method links the data objects to an IWbemClassObject pointer  
  ; ---            that is passed into the method. Use the IWbemClassObject::Get method to get the desired information from the data objects.  
  mem=AllocateMemory(1000)  
  hres=pEnumerator\reset()   
  
  Repeat
    
    hres = pEnumerator\Next(#WBEM_INFINITE, 1, @pclsObj.IWbemClassObject, @uReturn) 
    If uReturn = 0
     Break
    EndIf
        
    ; get a list with the names of the properties.
    
    hres=pclsObj\GetNames(0, 0, 0,@sf.l); get a list with the names of the properties.
    SafeArrayGetLBound_(sf, 1, @lBound)
    SafeArrayGetUBound_(sf, 1, @uBound)
    Dim indices(1)
    
    For i = lbound To ubound
      indices(0) = i
      SafeArrayGetElement_(sf, @indices(), @temp)
      If temp
         Property = PeekS(temp, -1, #PB_Unicode) 
         If #PB_Compiler_Unicode = 1
            hres=pclsObj\get(@Property, 0, mem, 0, 0)  
         Else
            hres=pclsObj\get(ansi2bstr(Property), 0, mem, 0, 0) 
         EndIf
         
         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 FindString(WMIReqSql,"*",1) <> 0;we need everything, not just some specific properties
           AddElement(WMI())
           WMI()\Property = Property
           WMI()\Value = val
         ElseIf Left(Property,1)<>"_";we need some specific properties, not all, not these starting with '_'.           
           AddElement(WMI())
           WMI()\Property = Property
           WMI()\Value = val
         EndIf
            
      EndIf
    Next
  Until uReturn = 0
  
  ; --- Step 8: Cleanup 
  svc\release()
  loc\release()
  pEnumerator\release()
  
  If uReturn
    pclsObj\release()
  EndIf 
  
  CoUninitialize_()
  
  
  ProcedureReturn #True
EndProcedure

;- Data Section
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
Je posterais d'autres exemple de requêtes faisant appel à WMIQuery. Bien entendu, WMI n'est pas la seule solution pour obtenir des informations sur son infrastructure matériel et logiciel :) Essayer de ne pas poster des tonnes de code API. je sais que ça existe. Il suffit de consulter le forum. :mrgreen: C'est juste une autre façon de faire et d'obtenir des information qu'il ne serait peut être pas possible d'obtenir autrement. N'hésitez pas par contre à poster des exemples de Query. J’espère par contre qu'on parlera des méthodes associées à WMI.

la liste des classes sur ce lien (En anglais). En français sur cet autre site mais je pense qu'il est incomplet.
Dernière modification par falsam le sam. 22/sept./2012 18:15, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: WMIQuery.pbi

Message par falsam »

Obtenir des informations sur une carte mère.

Code : Tout sélectionner

;Info Carte mere
IncludeFile "WMIQuery.pbi"

NewList WMIResult.WMIClass()

If WMIQuery("Select Manufacturer, Product, SerialNumber from Win32_BaseBoard", WMIResult())
  ForEach WMIResult()
    Debug WMIResult()\Property + "=" + WMIResult()\Value
  Next  
EndIf
Le numéro de série n’apparaît pas systématiquement.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: WMIQuery.pbi

Message par falsam »

Information carte vidéo

Code : Tout sélectionner

;Carte vidéo
IncludeFile "WMIQuery.pbi"

NewList WMIResult.WMIClass()

If WMIQuery("Select Caption from Win32_VideoController", WMIResult())
  ForEach WMIResult()
    Debug WMIResult()\Property
    Debug WMIResult()\Value
  Next
EndIf
Information carte réseau

Code : Tout sélectionner

;Information carte réseau
IncludeFile "WMIQuery.pbi"

NewList WMIResult.WMIClass()

If WMIQuery("Select Description from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE", WMIResult())
  ForEach WMIResult()
    Debug WMIResult()\Property + "=" + WMIResult()\Value
  Next
EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: WMIQuery.pbi

Message par falsam »

Information disques et unités logiques

Code : Tout sélectionner

;Information Disques et unité logique
IncludeFile "WMIQuery.pbi"

NewList WMIResult.WMIClass()

Debug "-Disque"
If WMIQuery("Select Caption from Win32_DiskDrive", WMIResult())
  ForEach WMIResult()
    Debug WMIResult()\Property + "=" + WMIResult()\Value
  Next
EndIf
Debug " "

Debug "-CD/DVD/..."
If WMIQuery("Select Caption from Win32_CDROMDrive", WMIResult())
  ForEach WMIResult()
    Debug WMIResult()\Property + "=" + WMIResult()\Value
  Next
EndIf
Debug " "

Debug "-Lecteurs logiques"
If WMIQuery("Select Caption, description, VolumeName, Size, FreeSpace, VolumeSerialNumber from Win32_LogicalDisk", WMIResult())
  ForEach WMIResult()
    Debug WMIResult()\Property + "=" + WMIResult()\Value
  Next
EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: WMIQuery.pbi

Message par Kwai chang caine »

Merci beaucoup pour le partage de tout ce travail 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: WMIQuery.pbi

Message par falsam »

Kwai chang caine a écrit :Merci beaucoup pour le partage de tout ce travail 8)
De rien et j'en profite pour te dire que te lire un peu plus sur ce forum ....... ça serait bien :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: WMIQuery.pbi

Message par Kwai chang caine »

C'est super gentil, ça me va sincerement droit au coeur, merci beaucoup.
Je vais essayer de faire un effort, malheureusement pour moi tout le monde n'est pas ou plus de ton avis, alors vu que je n'aime pas m'imposer, des que je sens que je gene....j'essaie de ne plus déranger..c'est dur car ce forum était une grande partie de ma vie...mais avec un peu d'entrainement..on y arrive :wink:
Encore merci 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: WMIQuery.pbi

Message par Backup »

note , que pour ma part, ta présence ne m'a JAMAIS dérangé !.
ce qui me dérange , c’était ta propension a la flagellation .... ;)

et ceci :
malheureusement pour moi tout le monde n'est pas ou plus de ton avis
confirme que ça n'est pas encore guéri ....

(et a me faire passer accessoirement, pour le vilain mechant pas beau ...responsable de tout les maux du forum . )
mais je ne vais pas t'imiter, donc fais comme si j'avais rien dit :mrgreen: :lol:
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: WMIQuery.pbi

Message par G-Rom »

Merci pour le partage.

@kcc, c'est vrai ce que dit dobro, pas besoin de faire le caliméro ;) t'es le bienvenu ici. ;)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: WMIQuery.pbi

Message par falsam »

Bonjour,
Le code ci-dessous teste le numéro de série d'une clé USB. Je ne suis pas certain que la façon de faire soit la bonne avec WMI, mais j'ai pu testé avec 5 cles USB dont deux datant de quelques années (256 Mo) et je trouve des résultat que j'ai pu vérifié avec le logiciel USBDeview.

5 tests n'étant pas suffisant, pouvez vous faire de même ? merci. Je pense que ce code peut être une bonne base pour simuler un dongle de protection logiciel. pas de clé ? pas d’exécution de votre logiciel en cours de phase de test par exemple.

Code : Tout sélectionner

;Usb drive : Read Serial Number 
IncludeFile "WMIQuery.pbi"

Global Buffer.s

NewList WMIResult.WMIClass()

If WMIQuery("SELECT PNPDeviceID FROM Win32_DiskDrive WHERE InterfaceType='USB'", WMIResult())
  ForEach WMIResult()
    Debug WMIResult()\Property + "=" + WMIResult()\Value
    Buffer = StringField(WMIResult()\Value, CountString(WMIResult()\Value, "\")+1, "\")
    Debug "Serial number " + Left(Buffer, Len(Buffer)-2)
  Next
EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: WMIQuery.pbi

Message par falsam »

Exemple de code minimaliste ne se lançant que si le numéro de série d'une clé USB est conforme au numéro de série présent dans le code. Si la clé est retirée, le programme s'arrête.

Code : Tout sélectionner

IncludeFile "WMIQuery.pbi"

Enumeration
  #Mainform
  #SerialKey
EndEnumeration


Define.l Event, WEvent, MEvent, GEvent, TEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget

Global SerialKey.s

Procedure IsDonglePresent()
  Protected Buffer.s, DonglePresent.b

  Protected NewList WMIResult.WMIClass()
  
  If WMIQuery("SELECT PNPDeviceID FROM Win32_DiskDrive WHERE InterfaceType='USB'", WMIResult())
    ForEach WMIResult()
      Buffer = StringField(WMIResult()\Value, CountString(WMIResult()\Value, "\")+1, "\")
      
      If Left(Buffer, Len(Buffer)-2) = SerialKey
        DonglePresent = #True
      Else
        DonglePresent = #False
      EndIf
     
    Next
  Else
    DonglePresent = #False
  EndIf
  
  If DonglePresent = #False
    MessageRequester("Information", "La clé n'est plus ou pas présente"+#CRLF$+"Arrêt du programme.")
    End
  EndIf
  
EndProcedure


Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 500, 400, "New Form", WindowStyle)
EndProcedure

;Your USB Serial Number
SerialKey = "????????"

Open_MainForm()

AddWindowTimer(#Mainform, 123, 1000)


Repeat
  Event  = WaitWindowEvent(10)
  WEvent = EventWindow() ;different de WindowEvent() :p (oui je me suis fais avoir !!!)
  MEvent = EventMenu()
  GEvent = EventGadget()
  TEvent = EventType()
  Select Event
    Case #PB_Event_Timer 
      If EventTimer() = 123
        IsDonglePresent()
      EndIf    

    Case #PB_Event_Gadget
      Select GEvent
      EndSelect
        
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: WMIQuery.pbi

Message par Kwai chang caine »

Nadine boudin t'es trop fort !!! 8O
Avec ce code

Code : Tout sélectionner

Global Buffer.s

NewList WMIResult.WMIClass()

If WMIQuery("SELECT PNPDeviceID FROM Win32_DiskDrive WHERE InterfaceType='USB'", WMIResult())
  ForEach WMIResult()
    Debug WMIResult()\Property + "=" + WMIResult()\Value
    Buffer = StringField(WMIResult()\Value, CountString(WMIResult()\Value, "\")+1, "\")
    Debug "Serial number " + Left(Buffer, Len(Buffer)-2)
  Next
EndIf
Tu es arrivé a trouver le nombre que j'ai cherché des années depuis 2010 et trouvé dans USBDeview
http://www.purebasic.fr/english/viewtop ... 97#p324897

Si pas de clef rien ne se passe.

Si clef
PNPDeviceID=USBSTOR\DISK&VEN_KINGSTON&PROD_DATATRAVELER_2.0&REV_PMAP\5B6A088E28B6&0
Serial number 5B6B088E28B7
Trop fort FALSAM, merci 8)


@GRom
Tu m'as accueilli les premiers jours, avec ton beret et ton oeil qui clignotait, et depuis ce jour, je te suis reconnaisant. 8)
Tu n'a jamais changé, si ce n'est dans le bien, pour devenir de plus en plus fort en programmation (J'aimerais que tu m'expliques comment d'ailleurs) mon admiration pour toi, n'en a que grandi
Cela me remonte le moral de me voir un peu apprécié par des gens comme Falsam, toi, et/ou autre ...
Quoi de plus triste qu'un clown qui ne fait plus rire

Image



@A personne
Il est de gens que malgré le fait qu'autrui ne les dérangent pas, demandent a FRED leur exclusion (Parmis d'autres bien sur)
Il est des gens qui prennent la sensibilité, l'impartiale auto-evaluation dont ils sont totallement dénués, pour de la flagellation
Il est des gens qui malgré le fait qu'il n'aient rien à dire de plus, s'obstinent à remettre sur le tapis des discussions maintes fois évoquées, vociférant l'acharnement qu'ils subissent, tel un paradoxe ostentatoire.
Il est des gens pour qui le monogue prévaut sur la discussion.
Il est des gens, tellement étranger à la tolérance et le respect de la différence, qui pensent que le fait de guérir, est de devenir comme eux.

Et enfin, bien qu'il soit passionnant d'étudier ce genre de personnage, sur lequel nous pourrions converser plus d'un hivers devant un feu, nuisant de ce fait à la couche d'ozone et au deux tiers d'une foret amazoniene
Il est des gens qui continuent à la rammener, en demandant de faire comme si, il avaient enfin adopté un comportement respectueux.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: WMIQuery.pbi

Message par falsam »

Merci KCC :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: WMIQuery.pbi

Message par Kwai chang caine »

Je viens de tester ton dernier code, il marche super bien sous XP.
Je clique sur l'icone d'extraction et hop plus de programme :D
Merci beaucoup du partage de tous ces codes aussi ingenieux les uns que les autres 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: WMIQuery.pbi

Message par Ar-S »

C'est étrange, j'ai un "Nom déjà utilisé par une commande externe" lorsque je test ton exemple et l'include PBI.
Le plus étrange est que même en renommant la procédure, le "Nom déjà utilisé par une commande externe" se ré affiche.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre