Requete WMI sur logiciels installés

davix123 Messages postés 21 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 6 octobre 2008 - 2 juil. 2004 à 07:33
bemo1050 Messages postés 4 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 18 octobre 2012 - 17 mai 2010 à 15:25
Bonjour,

J'ai développé une appli de gestion de parc informatique.
J'ai ajouté à ce logiciel un module d'inventaire automatique basé sur la technologie WMI. Je remonte bien toutes les infos matériels sans soucis.

Par contre, je ne trouve rien pour faire remonter la liste des logiciels installés. En cherchant, j'ai vu qu'il fallait faire une requête dans la base de registre en passant par root\default:StdRegProv. Mais je n'arrive pas à le programmer.

Avez-vous un exemple de code ?

Merci de votre aide.

Cordialement

Davix

7 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
3 juil. 2004 à 14:52
Si ça peut t'aider, Laurent DARDENNE vient de publier, aujourd'hui même, un cours Delphi et WMI sur le site Developpez.com.
0
kasjacques Messages postés 11 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 2 décembre 2005
5 août 2005 à 01:20
Salut j'ai le même probleme que davix 123. J'ai essayer de lire de cours que conseille delphiprog mais ça ne va. davix puis je avoir les codes qui te permettent de remonter les informations matériels?
Merci
0
davix123 Messages postés 21 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 6 octobre 2008
5 août 2005 à 07:51
Bonjour,



finalement, je n'ai pas trouvé de solution en delphi pour remonter les logiciels installés.

Par contre, le VBS permet plus facilement la manipulation du WMI.

Je fais donc appel dans delphi à un vbs auquel je passe les arguments
nécessaires (ip, nom d'utilisateur, mot de passe), j'inscris le
résultat dans un fichier texte, et après l'éxécution du vbs, le
programme delphi reprend le résultat dans ce fichier texte.



Voici le script en vbs. Je ne suis pas très fort en vbs, donc il n'est peut-être pas très optimisé, mais ça fonctionne.



=======================================

'Script qui permet faire un inventaire WMI



'Utilisation :

' On passe l'IP du Micro, le user et le mot de passe en argument a inventorié en paramètre.



Dim fichier, sArg, sFileIn, AdUser, AdPass



Dim cpt



'On récupère les arguments

Set sArg = WScript.Arguments



'Il n'y a qu'un argument, c'est le fichier en entrée.

'S'il y en a d'autres, on affiche un message d'erreur et on sort du script.

If sArg.Count < 1 Then

MsgBox "Veuillez passer en paramètre une adresse ip."

WScript.Quit

End If



'On récupère les arguments.

sFileIn = sArg(0)

AdUser = sArg(1)

AdPass = sArg(2)



'Procedure d'écriture dans fichier INI

Sub WriteINIString(Section, KeyName, Value, FileName)

Dim INIContents, PosSection, PosEndSection



INIContents = GetFile(FileName)



PosSection = InStr(1, INIContents, "[" & Section & "]", vbTextCompare)

If PosSection>0 Then

PosEndSection = InStr(PosSection, INIContents, vbCrLf & "[")

If PosEndSection 0 Then PosEndSection Len(INIContents)+1



Dim OldsContents, NewsContents, Line

Dim sKeyName, Found

OldsContents = Mid(INIContents, PosSection, PosEndSection - PosSection)

OldsContents = split(OldsContents, vbCrLf)



sKeyName = LCase(KeyName & "=")



For Each Line In OldsContents

If LCase(Left(Line, Len(sKeyName))) = sKeyName Then

Line = KeyName & "=" & Value

Found = True

End If

NewsContents = NewsContents & Line & vbCrLf

Next



If isempty(Found) Then

NewsContents = NewsContents & KeyName & "=" & Value

Else

NewsContents = Left(NewsContents, Len(NewsContents) - 2)

End If



INIContents = Left(INIContents, PosSection-1) & _

NewsContents & Mid(INIContents, PosEndSection)

else

If Right(INIContents, 2) <> vbCrLf And Len(INIContents)>0 Then

INIContents = INIContents & vbCrLf

End If

INIContents = INIContents & "[" & Section & "]" & vbCrLf & _

KeyName & "=" & Value

end if

WriteFile FileName, INIContents

End Sub





' Function de lecture dans fichier INI

Function GetINIString(Section, KeyName, Default, FileName)

Dim INIContents, PosSection, PosEndSection, sContents, Value, Found



INIContents = GetFile(FileName)



PosSection = InStr(1, INIContents, "[" & Section & "]", vbTextCompare)

If PosSection>0 Then



PosEndSection = InStr(PosSection, INIContents, vbCrLf & "[")



If PosEndSection 0 Then PosEndSection Len(INIContents)+1





sContents = Mid(INIContents, PosSection, PosEndSection - PosSection)



If InStr(1, sContents, vbCrLf & KeyName & "=", vbTextCompare)>0 Then

Found = True



Value = SeparateField(sContents, vbCrLf & KeyName & "=", vbCrLf)

End If

End If

If isempty(Found) Then Value = Default

GetINIString = Value

End Function





Function SeparateField(ByVal sFrom, ByVal sStart, ByVal sEnd)

Dim PosB: PosB = InStr(1, sFrom, sStart, 1)

If PosB > 0 Then

PosB = PosB + Len(sStart)

Dim PosE: PosE = InStr(PosB, sFrom, sEnd, 1)

If PosE 0 Then PosE InStr(PosB, sFrom, vbCrLf, 1)

If PosE 0 Then PosE Len(sFrom) + 1

SeparateField = Mid(sFrom, PosB, PosE - PosB)

End If

End Function





Function GetFile(ByVal FileName)

Dim FS: Set FS = CreateObject("Scripting.FileSystemObject")

On Error Resume Next



GetFile = FS.OpenTextFile(FileName).ReadAll

End Function



Function WriteFile(ByVal FileName, ByVal Contents)



Dim FS: Set FS = CreateObject("Scripting.FileSystemObject")



Dim OutStream: Set OutStream = FS.OpenTextFile(FileName, 2, True)

OutStream.Write Contents

End Function





' Inventaire



On Error Resume Next

strComputer = sFileIn

set objectLocator = CreateObject("WbemScripting.SWbemLocator")

set objWMIService= objectLocator.ConnectServer(strComputer,"root\cimv2",adUser,adPass)

objWMIService.Security_.AuthentificationLevel = 3

objWMIService.Security_.ImpersonationLevel = 3

Set colItems objWMIService.ExecQuery("Select * from Win32_NetworkAdapter where AdapterType 'Ethernet 802.3'",,48)

For Each objItem in colItems

fichier = objItem.MACAddress

fichier = Replace(fichier, ":", "-" )

' wscript.echo fichier

Next



' On crée le fichier ini



WriteINIString "Reseau", "IP", sFileIn , fichier & ".wmi"



WriteINIString "Connexion", "Resultat", "Ok" , fichier & ".wmi"

WriteINIString "Connexion", "Date", Date & " " & Time , fichier & ".wmi"



' Info Bios

On Error Resume Next

strComputer = sFileIn

set objectLocator = CreateObject("WbemScripting.SWbemLocator")

set objWMIService= objectLocator.ConnectServer(strComputer,"root\cimv2",adUser,adPass)

objWMIService.Security_.AuthentificationLevel = 3

objWMIService.Security_.ImpersonationLevel = 3

Set colItems = objWMIService.ExecQuery("Select * from Win32_BIOS",,48)

For Each objItem in colItems

WriteINIString "BIOS", "Fabriquant", objItem.Manufacturer , fichier & ".wmi"

WriteINIString "BIOS", "Version", objItem.SMBIOSBIOSVersion , fichier & ".wmi"

WriteINIString "BIOS", "Numéro de Serie", objItem.SerialNumber , fichier & ".wmi"

Next



' Info Processeur

On Error Resume Next

strComputer = sFileIn

set objectLocator = CreateObject("WbemScripting.SWbemLocator")

set objWMIService= objectLocator.ConnectServer(strComputer,"root\cimv2",adUser,adPass)

objWMIService.Security_.AuthentificationLevel = 3

objWMIService.Security_.ImpersonationLevel = 3

Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor",,48)

For Each objItem in colItems

WriteINIString "CPU", "Processeur", objItem.Name , fichier & ".wmi"

WriteINIString "CPU", "Fréquence", objItem.MaxClockSpeed , fichier & ".wmi"

Next



'Info carte Graphique

On Error Resume Next

strComputer = sFileIn

set objectLocator = CreateObject("WbemScripting.SWbemLocator")

set objWMIService= objectLocator.ConnectServer(strComputer,"root\cimv2",adUser,adPass)

objWMIService.Security_.AuthentificationLevel = 3

objWMIService.Security_.ImpersonationLevel = 3

Set colItems = objWMIService.ExecQuery("Select * from Win32_VideoController",,48)

For Each objItem in colItems

WriteINIString "Carte Graphique", "Nom", objItem.Caption , fichier & ".wmi"

WriteINIString "Carte Graphique", "RAM", objItem.AdapterRAM , fichier & ".wmi"

Next



'Info Carte Son

On Error Resume Next

strComputer = sFileIn

set objectLocator = CreateObject("WbemScripting.SWbemLocator")

set objWMIService= objectLocator.ConnectServer(strComputer,"root\cimv2",adUser,adPass)

objWMIService.Security_.AuthentificationLevel = 3

objWMIService.Security_.ImpersonationLevel = 3

Set colItems = objWMIService.ExecQuery("Select * from Win32_SoundDevice",,48)

For Each objItem in colItems

WriteINIString "Carte Son", "Nom", objItem.Name , fichier & ".wmi"

Next



' Info CD ROM Drive

On Error Resume Next

strComputer = sFileIn

cpt = 0

set objectLocator = CreateObject("WbemScripting.SWbemLocator")

set objWMIService= objectLocator.ConnectServer(strComputer,"root\cimv2",adUser,adPass)

objWMIService.Security_.AuthentificationLevel = 3

objWMIService.Security_.ImpersonationLevel = 3

Set colItems = objWMIService.ExecQuery("Select * from Win32_CDROMDrive",,48)

For Each objItem in colItems

cpt = cpt +1

WriteINIString "CD ROM", "Nom" & cpt, objItem.Name , fichier & ".wmi"

Next



'Info OS

On Error Resume Next

strComputer = sFileIn

set objectLocator = CreateObject("WbemScripting.SWbemLocator")

set objWMIService= objectLocator.ConnectServer(strComputer,"root\cimv2",adUser,adPass)

objWMIService.Security_.AuthentificationLevel = 3

objWMIService.Security_.ImpersonationLevel = 3

Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem",,48)

For Each objItem in colItems

WriteINIString "OS", "Nom", objItem.Caption , fichier & ".wmi"

WriteINIString "OS", "Répertoire Windows", objItem.WindowsDirectory , fichier & ".wmi"

WriteINIString "OS", "Répertoire Système", objItem.SystemDirectory , fichier & ".wmi"

WriteINIString "OS", "Service Pack",
objItem.ServicePackMajorVersion & "." &
objItem.ServicePackMinorVersion, fichier & ".wmi"

Next



'Info PC

On Error Resume Next

strComputer = sFileIn

set objectLocator = CreateObject("WbemScripting.SWbemLocator")

set objWMIService= objectLocator.ConnectServer(strComputer,"root\cimv2",adUser,adPass)

objWMIService.Security_.AuthentificationLevel = 3

objWMIService.Security_.ImpersonationLevel = 3

Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem",,48)

For Each objItem in colItems

WriteINIString "Micro", "Fabriquant", objItem.Manufacturer , fichier & ".wmi"

WriteINIString "Micro", "Modèle", objItem.Model , fichier & ".wmi"

WriteINIString "Micro", "Nom", objItem.Name , fichier & ".wmi"

WriteINIString "Micro", "Utilisateur Courant", objItem.UserName , fichier & ".wmi"

WriteINIString "Reseau", "Domaine", objItem.Domain , fichier & ".wmi"

Next



'Ram

On Error Resume Next

strComputer = sFileIn

cpt = 0

set objectLocator = CreateObject("WbemScripting.SWbemLocator")

set objWMIService= objectLocator.ConnectServer(strComputer,"root\cimv2",adUser,adPass)

objWMIService.Security_.AuthentificationLevel = 3

objWMIService.Security_.ImpersonationLevel = 3

Set colItems = objWMIService.ExecQuery("Select * from Win32_PhysicalMemory",,48)

For Each objItem in colItems

cpt = cpt + 1

WriteINIString "RAM", "Emplacement RAM" & cpt, objItem.Capacity , fichier & ".wmi"

Next



'Disque Dur

On Error Resume Next

strComputer = sFileIn

cpt = 0

set objectLocator = CreateObject("WbemScripting.SWbemLocator")

set objWMIService= objectLocator.ConnectServer(strComputer,"root\cimv2",adUser,adPass)

objWMIService.Security_.AuthentificationLevel = 3

objWMIService.Security_.ImpersonationLevel = 3

Set colItems = objWMIService.ExecQuery("Select * from Win32_DiskDrive",,48)

For Each objItem in colItems

cpt = cpt + 1

WriteINIString "Disque DUR", "HD" & cpt, objItem.Caption , fichier & ".wmi"

WriteINIString "Disque DUR", "Taille" & cpt, objItem.Size, fichier & ".wmi"

Next



'Imprimante

On Error Resume Next

strComputer = sFileIn

cpt = 0

set objectLocator = CreateObject("WbemScripting.SWbemLocator")

set objWMIService= objectLocator.ConnectServer(strComputer,"root\cimv2",adUser,adPass)

objWMIService.Security_.AuthentificationLevel = 3

objWMIService.Security_.ImpersonationLevel = 3

Set colItems = objWMIService.ExecQuery("Select * from Win32_Printer",,48)

For Each objItem in colItems

cpt = cpt +1

WriteINIString "Imprimante", "Driver" & cpt, objItem.DriverName , fichier & ".wmi"

WriteINIString "Imprimante", "Nom" & cpt, objItem.Name , fichier & ".wmi"

WriteINIString "Imprimante", "Port" & cpt, objItem.PortName , fichier & ".wmi"

Next





'Logiciel

On Error Resume Next



Dim oLoc, oSvc, oReg

Dim i

Dim sNames()

Dim aTypes()



Dim sRegTypes

sRegTypes = Array(_


"
", _


"REG_SZ
", _


"REG_EXPAND_SZ
", _


"REG_BINARY
", _


"REG_DWORD
", _

"REG_DWORD_BIG_ENDIAN ", _


"REG_LINK
", _


"REG_MULTI_SZ
", _

"REG_RESOURCE_LIST ", _

"REG_FULL_RESOURCE_DESCRIPTOR ", _

"REG_RESOURCE_REQUIREMENTS_LIST", _


"REG_QWORD
")



Const HKEY_LOCAL_MACHINE = &H80000002



RegPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"



strComputer = sFileIn



Set oLoc = CreateObject("WbemScripting.SWbemLocator")

Set oSvc = oLoc.ConnectServer(strComputer, "root\default", adUser, adPass)



Call CheckResult("ConnectServer",
err)
'



Set oReg = oSvc.Get("StdRegProv")

Call CheckResult("Get StdRegProv", err)



oReg.enumkey HKEY_LOCAL_MACHINE, Regpath, arrSubKeys

Call CheckResult("Get num", err)



cpt = 0

For Each strSubKey In arrSubKeys

cpt = cpt + 1

oReg.GetStringValue HKEY_LOCAL_MACHINE, _

Regpath & "" & strSubKey, "DisplayName", strDisplayName

oReg.GetStringValue HKEY_LOCAL_MACHINE, _

Regpath & "" & strSubKey, "DisplayVersion", strDisplayVersion

oReg.GetStringValue HKEY_LOCAL_MACHINE, _

Regpath & "" & strSubKey, "InstallLocation", strInstallLocation



WriteINIString "Logiciel",
"Titre" & cpt, strSubKey , fichier & ".wmi"

WriteINIString "Logiciel", "Nom" & cpt, strDisplayName , fichier & ".wmi"

WriteINIString "Logiciel",
"Version" & cpt, strDisplayVersion , fichier & ".wmi"

WriteINIString "Logiciel",
"Emplacement" & cpt, strInstallLocation , fichier & ".wmi"



strDisplayName = vbEmpty

strDisplayVersion = vbEmpty

strInstallLocation = vbEmpty

Next



' Recuperation Variable utilisateur dans base de registre

RegPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"



strComputer = sFileIn



Set oLoc = CreateObject("WbemScripting.SWbemLocator")

Set oSvc = oLoc.ConnectServer(strComputer, "root\default", adUser, adPass)



Call CheckResult("ConnectServer",
err)
'



Set oReg = oSvc.Get("StdRegProv")

Call CheckResult("Get StdRegProv", err)



oReg.GetStringValue HKEY_LOCAL_MACHINE, _

Regpath , "DefaultUserName", strDisplayName

WriteINIString "Micro",
"Utilisateur Courant Registre", strDisplayName , fichier &
".wmi"

strDisplayName = vbEmpty









function CheckResult(ByRef msg, ByRef error)

If error <> 0 Then

WScript.Echo "Error occurred in " & msg

WScript.Echo "Code " & Hex(error) & "; Description: " & error.description

WScript.Echo

WScript.Quit

End if

End function



=======================================



Cordialement



Davix123
0
kasjacques Messages postés 11 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 2 décembre 2005
9 août 2005 à 01:09
KASSEGNE K. Yaovi
Ingénieur Civil
Stagiaire en formation en
Informatique appliquée
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kasjacques Messages postés 11 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 2 décembre 2005
9 août 2005 à 01:13
Merci davix123, je vais essayer de comprendre ton code mais j'aimerai bien avoir le code delphi qui te permet de remonter les information matéiels du PC.
0
kasjacques Messages postés 11 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 2 décembre 2005
20 août 2005 à 20:08
Salut davix je vais encore te déranger, j'ai lu tes code VBScript mais je n'arrive pas avec Delphi à passe les arguments au VBS. Peut tu me donner les codes qui te permettent de passer les arguments auVBS à partir de delphi? Et puit ta fonction de lecture du fichier INI à quoi sert-il? Merci de m'aider c'est urgent s'il te plait.
0
bemo1050 Messages postés 4 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 18 octobre 2012
17 mai 2010 à 15:25
Je suis très intéressé par ce code, mais lorsque je l'exécute il me faut un user et mot de passe admin et dans notre réseau tous les utilisateurs sont des invités est ce qu'il ya une solution pour sa????
0
Rejoignez-nous