Publicité
Discussion fermée
Affichage des résultats 1 à 6 sur 6
  1. #1
    Futur Membre du Club
    Inscrit en
    novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 26

    Informations forums :
    Inscription : novembre 2006
    Messages : 150
    Points : 18
    Points
    18

    Par défaut Afficher programme(s) récemment installé(s)

    Bonjour,

    Je souhaiterais afficher le nom d'un programme installé entre un temps t et t+1. Je commence avec ce code permettant d'afficher tous les programmes installés, et souhaiterais ensuite en afficher un différentiel, peut être en passant par un des fichiers CSV. Afin de n'en ressortir uniquement le ou les programmes qui ont été installés dans le temps impartis.

    Merci pour votre aide

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Set oShell = CreateObject("wscript.Shell")
    Set env = oShell.environment("Process")
    strComputer = env.Item("Computername")
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const UnInstPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
    Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
    ".\root\default:StdRegProv")
    oReg.EnumKey HKEY_LOCAL_MACHINE, UnInstPath, arrSubKeys
    software = "*******************************" & Now & "****************************" & vbCrLf
    software = software & "*******************************Logiciels installés********************************" & vbCrLf
    For Each subkey In arrSubKeys
            'MsgBox subkey
            If Left (subkey, 1) <> "{" Then
                    software = software & subkey & vbCrLf
            End If
    Next
    software = software & "*********************************************************" & vbCrLf
     
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    'Détermine si le fichier csv existe déjà ou s'il doit le créer
    If Not fso.FileExists("inventaire " & strComputer & ".csv") Then
            set ts = fso.CreateTextFile("inventaire " & strComputer & ".csv", True)
    Else
            set ts = fso.OpenTextFile("inventaire " & strComputer & ".csv", 2, True)
    End If
     
    ts.write software
      0  0

  2. #2
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro Moncef Ben Othman
    Directeur de lycée
    Inscrit en
    juillet 2009
    Messages
    1 347
    Détails du profil
    Informations personnelles :
    Nom : Homme Moncef Ben Othman
    Âge : 58
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Directeur de lycée
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2009
    Messages : 1 347
    Points : 2 620
    Points
    2 620

    Par défaut

    Salut;

    1ère remarque : Il existe pas mal de programmes qui n'écrivent rien sous la clé Uninstall
    2ème remarque : Certains programmes écrivent sous leur propre clé une entrée appelée InstallDate qui peut être utilisée dans ce cas pour déterminer la date d'installation. le code suivant en donne une idée sous forme de boite de message que tu peux modifier selon ton besoin :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Set oShell = CreateObject("wscript.Shell")
    Set env = oShell.environment("Process")
    strComputer = env.Item("Computername")
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const UnInstPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
    Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
    ".\root\default:StdRegProv")
    oReg.EnumKey HKEY_LOCAL_MACHINE, UnInstPath, arrSubKeys
    software = "*******************************" & Now & "****************************" & vbCrLf
    software = software & "*******************************Logiciels installés********************************" & vbCrLf
    For Each subkey In arrSubKeys
           ' MsgBox subkey
     
            If Left (subkey, 1) <> "{" Then
                    software = software & subkey & vbCrLf
    				If RegReadValue(SubKey , "InstallDate")<>"" Then _
    				msgbox ReadInstallDate
            End If
    Next
    software = software & "*********************************************************" & vbCrLf
     
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    'Détermine si le fichier csv existe déjà ou s'il doit le créer
    If Not fso.FileExists("inventaire " & strComputer & ".csv") Then
            set ts = fso.CreateTextFile("inventaire " & strComputer & ".csv", True)
    Else
            set ts = fso.OpenTextFile("inventaire " & strComputer & ".csv", 2, True)
    End If
     Private Function RegReadValue(strFind,strValue)
      oReg.EnumValues HKEY_LOCAL_MACHINE, UnInstPath & "\" & strFind,arrValueNames, arrValueTypes
      If Not IsNull(arrValueNames) Then
        For Each Value In arrValueNames
    	    If Ucase(Value) = Ucase(strValue) Then 
    	      Ret = Value 
    	  	  Exit For
    	    End If
        Next	  
      End If	
      RegReadValue = Ret
     End Function
     Function ReadInstallDate()
       Ret = oShell.RegRead("HKLM\" & UnInstPath & Subkey & "\InstallDate")
       LaDate = Right(Ret,2) & "/" & Mid(Ret,5,2) & "/" & Left(Ret,4)
     
       ReadInstallDate = LaDate
     End Function
    ts.write software
    ts.Close
    A cœur vaillant rien d'impossible
    Ne pas oublier le tag si satisfait.
    Vous pouvez voir Mes contributions
      0  0

  3. #3
    Futur Membre du Club
    Inscrit en
    novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 26

    Informations forums :
    Inscription : novembre 2006
    Messages : 150
    Points : 18
    Points
    18

    Par défaut

    Merci pour ta réponse, mais du coup dans quelle clé de registre dois-je chercher ? Si peu sont dans Uninstall , et quelques uns dans InstallDate ?
    Merci pour ton code, j'ai essayé mais ça ne m'affiche pas tous les programmes que j'ai dans le menu "ajout/suppression"

    Olivier
      0  0

  4. #4
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro Moncef Ben Othman
    Directeur de lycée
    Inscrit en
    juillet 2009
    Messages
    1 347
    Détails du profil
    Informations personnelles :
    Nom : Homme Moncef Ben Othman
    Âge : 58
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Directeur de lycée
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2009
    Messages : 1 347
    Points : 2 620
    Points
    2 620

    Par défaut

    ..... j'ai essayé mais ça ne m'affiche pas tous les programmes que j'ai dans le menu "ajout/suppression"
    Ce que j'ai dit :
    2ème remarque : Certains programmes écrivent sous leur propre clé une entrée appelée InstallDate qui.....
    Dans le cas où le programme n'écrit rien, je ne vois pas comment on peut lui tirer ses informations.
    A cœur vaillant rien d'impossible
    Ne pas oublier le tag si satisfait.
    Vous pouvez voir Mes contributions
      0  0

  5. #5
    Futur Membre du Club
    Inscrit en
    novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 26

    Informations forums :
    Inscription : novembre 2006
    Messages : 150
    Points : 18
    Points
    18

    Par défaut

    Merci, j'ai un peu avancé , j'ai un premier programme qui regarde les clé de registre et établit une liste (pas forcément exhaustive) des programmes installés :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    ' List All Installed Software
    Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
    strComputer = "."
    strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
    strEntry1a = "DisplayName"
     
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    Set objReg = GetObject("winmgmts://" & strComputer & _
     "/root/default:StdRegProv")
    objReg.EnumKey HKLM, strKey, arrSubkeys
     
    If Not fso.FileExists("inventaire " & strComputer & ".csv") Then
            set ts = fso.CreateTextFile("inventory.csv", True)
    Else
            set ts = fso.OpenTextFile("inventory.csv", 2, True)
    End If
     
    For Each strSubkey In arrSubkeys
     
    		  intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey, _
    		   strEntry1a, strValue1)
    		  If intRet1 <> 0 Then
    			objReg.GetStringValue HKLM, strKey & strSubkey, _
    			 strEntry1b, strValue1
    		  End If
    		  If strValue1 <> "" Then
    			'WScript.Echo VbCrLf & strValue1
    			DisplayName = DisplayName & strValue1 & VbCrLf
    			'wscript.echo DisplayName
    		  End If	 
     Next
     
    ts.write DisplayName
    ts.Close
    Ensuite j'ai un 2eme script vbs qui compare les clé (registry) et ce qui est écrit dans le CSV : si une ligne est différente on sort de la boucle - ça veut dire qu'un nouveau programme a été installé => voilà mon différentiel.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    ' List All Installed Software
    Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
    strComputer = "."
    strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
    strEntry1a = "DisplayName"
    boolDiff = False
    ApplicationName = ""
     
    Dim ts, fso, Line
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    Set objReg = GetObject("winmgmts://" & strComputer & _
     "/root/default:StdRegProv")
    objReg.EnumKey HKLM, strKey, arrSubkeys
     
    set ts = fso.OpenTextFile("inventory.csv", 1, True)
     
    If Not fso.FileExists("inventory.csv") Then
            wscript.echo "Error : inventory file is missing !"
    Else
            set ts = fso.OpenTextFile("inventory.csv", 1, True)
    End If
     
    For Each strSubkey In arrSubkeys
    		  intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey, _
    		   strEntry1a, strValue1)
    		  If intRet1 <> 0 Then
    			objReg.GetStringValue HKLM, strKey & strSubkey, _
    			 strEntry1b, strValue1
    		  End If
    		  If strValue1 <> "" Then
     
    				  Do While ts.AtEndOfStream <> true 
     
    				  Line = ts.ReadLine	
     
    				  wscript.echo "Display Name : " & strValue1 & " Line : " & Line
     
    							If StrComp(strValue1,Line) <> 0 Then
     
    										'wscript.echo "Line :" & Line & " Reg : " & strValue1
    										'wscript.echo "new reg entry : " & strValue1
    										ApplicationName = strValue1
     
    										Exit For
    							End If
    				  Loop
     
    		  End If
    Next		  
     
    		 if  ApplicationName <> "" Then 
    		 wscript.echo "application : " & ApplicationName
    		 End if
     
    				'wscript.echo "edition du MSI avec :" & ApplicationName
     
    		 'Edit MSI
    ts.Close
    Par contre là je sèche un peu j'avoue
    Olivier
      0  0

  6. #6
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro Moncef Ben Othman
    Directeur de lycée
    Inscrit en
    juillet 2009
    Messages
    1 347
    Détails du profil
    Informations personnelles :
    Nom : Homme Moncef Ben Othman
    Âge : 58
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Directeur de lycée
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2009
    Messages : 1 347
    Points : 2 620
    Points
    2 620

    Par défaut

    Le problème ici est de chercher chaque entrée du registre dans le fichier csv.
    Si elle s'y trouve, on continue sinon on arrête en donnant le nom de la nouvelle entrée trouvée.
    Mais tel que le code se présente, on sort de la boucle avec la lecture de la première ligne du fichier csv.
    A cœur vaillant rien d'impossible
    Ne pas oublier le tag si satisfait.
    Vous pouvez voir Mes contributions
      0  0

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •