'========================================================================== ' ' NAME: Reganalyse.vbs ' ' AUTHOR: S. A. ' DATE : 1/2/2006 ' ' script permettant de voir si des information registre stockée dans un fichier *.reg son présente ou non ' ' Reganalyse /m ' Lance la verification en mode modification , il modifie la base de registre par rapport au fichier ' ' Reganalyse ' Lance la verification ' ' Reganalyse ' Demande quelle fichier a traiter et lance la verification. ' ' STATSYNS Arnaud ' 1-2-2006 ' ' 20-4-2006 ' Ajout de la possibilité de transmettre le fichier *.Reg par valeur ' ' 24-4-2006 ' Ajout de la possibilité de modifier la Base de registre si nécessaire ' '========================================================================== ' Déclaration des objects Set FSO = CreateObject("Scripting.FileSystemObject") Set Shell = CreateObject("WScript.Shell") Set UA = CreateObject("UserAccounts.CommonDialog") Set args = WScript.Arguments ' Déclaration des variables Const HKEY_LOCAL_MACHINE = &H80000002 strComputer = "." convertedfile="c:\temp\reg.txt" modify = 0 'Debut du script 'Ouverture du fichier *.reg Select Case args.Count Case 0 ua.Filter = "REG Files(*.REG)|*.reg" x = UA.ShowOpen filetoverify = UA.FileName Case 1 filetoverify=args(0) Case 2 Filetoverify=args(0) If LCase(args(1)) = "/m" Then modify = 1 WScript.Echo ("Modification mode") End If Case Else WScript.Echo ("Mauvais parametre " & vbCrLf & "reganalyse [] "& vbCrLf) WScript.Quit End Select If Not fso.fileexists(filetoverify) Then WScript.Echo (filetoverify) WScript.Echo ("File not found error") WScript.Quit Else WScript.Echo ("start verification") WScript.Echo (filetoverify& vbCrLf) End If 'Converti le fichier reg en fichier exploitable en vbs 'Creation du fichier converti set filetoconvert = fso.CreateTextFile(convertedfile,true) set repportfile = fso.CreateTextFile("c:\temp\repport.log",true) repportfile.writeline "Begining registry analyse " 'Traitement du fichier Reg a convertir 'Declaration de variable dim tmp 'utiliser pour stocker les lignes lue du fichier REG si plusieur repportfile.writeline " "&now&" Analysing REG file " With FSO.GetFile(filetoverify) RegFileLines = Split(.OpenAsTextStream(1, -1).Read(.Size), vbcrlf) End With tmp="" For Each RegLine In RegFileLines 'traite tout le fichier REG if not left(regline,16)="Windows Registry" and regline <> "" then if right(regline,1)="\" then ' detect si la valeur registre tien sur plusieur ligne if left(regline,2)=" " then regline=right(regline,len(regline)-2) tmp = tmp+ left(regline,len(regline)-1) else if tmp="" then else if left(regline,2)=" " then regline=right(regline,len(regline)-2) regline=tmp+regline end if if left(regline,1)="[" and right(regline,1)="]" then 'detect la cle registre subkey = right(regline,len(regline)-1) subkey = left(subkey,len(subkey)-1) typevalue="subkey" else result=instr(regline,"=") if result = 0 then 'separe la valuename de la valeur else key = left(regline,result-1) if left(key,1)="""" then key = right(key,len(key)-1) key = left(key,len(key)-1) else end if value=right(regline,len(regline)-result) 'Gestion des String Value if left(value,1)="""" then value = right(value,len(value)-1) value = left(value,len(value)-1) typevalue="REG_SZ" else end if value = replace(value,"\\","\") 'remplace les double \ créé par le regedit value = replace(value,"\""","""") 'remplace les double \" " créé par le regedit 'Gestion des Expandable String Value if left(value,7) = "hex(2):" then 'Valeur hex a transformer en valeur string value=right(value,len(value)-7) tmp=split(value,",") typevalue="REG_EXPAND_SZ" value="" For i =0 to ubound(tmp) If tmp(i) <> "00" then 'Supprime les double 00 temp = tmp(i) temp = CLng ("&H" & temp) value = value & Chr(temp) end If Next value=RTrim(value) end If 'Gestion des dword Value if left(value,6) = "dword:" then 'detect les DWord value=right(value,len(value)-6) value=cLng ("&H" & value) typevalue="REG_DWORD" end If 'Gestion des Multi String Value if left(value,7) = "hex(7):" then 'Valeur hex a transformer en valeur string ' WScript.Echo value value=right(value,len(value)-7) tmp=split(value,",") typevalue="REG_EXPAND_SZ" 'Multi string value="" for i =0 to ubound(tmp) step 2 temp = tmp(i) temp = CLng ("&H" & temp) If tmp(i) <> "00" Then value = value & chr(temp) Else if i+2 < ubound(tmp) Then If tmp(i+2) <> "00" Then value = value & chr(temp) End if End IF End If Next value=RTrim(value) end If 'Gestion des Qword if left(value,7) = "hex(b):" then value=right(value,len(value)-7) tmp=split(value,",") typevalue="Qword" 'value="" 'for i =0 to ubound(tmp) ' temp = tmp(i) ' temp = CLng ("&H" & temp) ' value = value & chr(temp) 'next 'value=RTrim(value) End if end if end if tmp="" filetoconvert.writeline subkey&"-;-"&key&"-;-"&value&"-;-"&typevalue end if end if key="" value="" next filetoconvert.close repportfile.writeline " "&now&" End to analyse " repportfile.writeline on error resume next repportfile.writeline " "&now&" begin registry analyse " repportfile.writeline 'comparaison avec la base de registre set RegFileLines = Fso.Opentextfile(convertedfile ,1,true) nokey=0 keyok=0 keynook=0 subkey="" key="" value="" types="" repportfile.writeline repportfile.WriteLine nbrkey = 0 Do While RegFileLines.Atendofline <> True templine = split(RegFileLines.readline,"-;-") subkey= templine(0) If templine(1)="@" Then key ="" Else key = templine(1) End If value = templine(2) types = templine(3) if templine(1) = "" then 'Detect la subkey a rechercher 'repportfile.writeline "Subkey := " &subkey 'repportfile.writeline "---------" Else nbrkey = nbrkey + 1 tmpregvalue = Shell.RegRead(subkey & "\" &key) if Err.Number <> 0 then 'Si la cle n'est pas trouvée repportfile.writeline " Cle non trouvée " repportfile.writeline " " & subkey & "\" & key repportfile.writeline " File = "&value repportfile.WriteLine nokey = nokey + 1 If modify = 1 Then repportfile.writeline vbclrf&" Ajout de la cle registre " shell.RegWrite subkey & "\" & key,value,types End If else ' traitement des differents types de données de la base de registre if vartype(tmpregvalue)= 3 Then regvalue = CStr(tmpregvalue) else if vartype(tmpregvalue)= 8204 Then If VarType (tmpregvalue(0)) = 8 Then regvalue=Join(tmpregvalue," ") 'WScript.Echo ("regvalue := "®value) Else Dim tempreg ReDim tempreg(ubound(tmpregvalue)) for x = lbound(tmpregvalue) to ubound(tmpregvalue) tempreg(x) = hex(tmpregvalue(x)) if tempreg(x) = "0" then tempreg(x)="00" if len(tempreg(x))=1 then tempreg(x)="0"&tempreg(x) Next regvalue=lcase("hex:"&join(tempreg,",")) End if Else regvalue = tmpregvalue end If end if 'verifie si il y a concordance entre la cle du fichier et la base de registre if value = regvalue then keyok = keyok + 1 else repportfile.writeline " Valeur touvée et differente" ' Regvalue = " & vartype(regvalue) &" Value = "& vartype(value) repportfile.writeline " " & subkey & "\" & key repportfile.writeline " Registry = "®value repportfile.writeline " File = "&value keynook = keynook + 1 repportfile.WriteLine If modify = 1 Then repportfile.writeline vbclrf&" Modification de la cle registre " shell.RegWrite subkey & "\" & key,value,types End If end if end if end if Err.Clear loop repportfile.writeline " Valeur touvée et identique : " & keyok repportfile.writeline " Valeur touvée et differente : " & keynook repportfile.writeline " Cle non trouvée : " & nokey repportfile.writeline repportfile.writeline repportfile.writeline now&" End to analyse " wscript.echo " Nombre de cles : " & nbrkey wscript.echo " Valeur touvée et identique : " & keyok wscript.echo " Valeur touvée et differente : " & keynook wscript.echo " Cle non trouvée : " & nokey RegFileLines.Close repportfile.Close If args.Count = 0 Then Set r=shell.Run("notepad.exe c:\temp\repport.log") End If