From 1d0e1fcf6c9e189eed5541a0cfb68e426631f1a7 Mon Sep 17 00:00:00 2001 From: fbomj Date: Mon, 26 Mar 2018 12:38:53 +0200 Subject: [PATCH] Minor corrections --- agent/Windows/runningDatabaseInstances.vbs | 713 ++++++++++++++------- 1 file changed, 466 insertions(+), 247 deletions(-) diff --git a/agent/Windows/runningDatabaseInstances.vbs b/agent/Windows/runningDatabaseInstances.vbs index 394ae0c..75b744c 100644 --- a/agent/Windows/runningDatabaseInstances.vbs +++ b/agent/Windows/runningDatabaseInstances.vbs @@ -1,228 +1,391 @@ -'---------------------------------------------------------- -' Plugin for OCS Inventory NG 2.x -' Script : Liste les bases de données SQL Server du poste -' Version : 1.00 -' Date : 21/10/2011 -' Author : Sylvie Grimonpont -'---------------------------------------------------------- -' OS checked [X] on 32b 64b (Professionnal edition) -' Windows XP [ ] -' Windows Vista [ ] [ ] -' Windows 7 [ ] [ ] -' Windows 8.1 [ ] [ ] -' Windows 10 [ ] [ ] -' Windows 2k8R2 [ ] -' Windows 2k12R2 [ ] -' Windows 2k16 [ ] -' --------------------------------------------------------- -' NOTE : No checked on Windows 8 +'------------------------------------------------------------------------------- +' OCSINVENTORY-NG +' Web : http://www.ocsinventory-ng.org +' +' Liste les bases de données SQL Server du poste ' 4 données sont remontées : -' - strSQLName : Nom long du produit SQL Server -' Par exemple : "Microsoft SQL Server 2008 R2" +' - strSQLName : Nom long du produit SQL Server +' Par exple : "Microsoft SQL Server 2008 R2" ' - strServiceName : Nom de l'instance -' Par exemple : "MSSQLSERVER" -' - strEdition : Edition. -' Par exemple : "Enterprise Edition (64-bit)" -' - strVersion : Version "chiffrée". -' Par exemple : "8.00.194" -' --------------------------------------------------------- +' Par exple : "MSSQLSERVER" +' - strEdition : Edition. +' Par exple : "Enterprise Edition (64-bit)" +' - strVersion : Version "chiffrée". +' Par exple : "8.00.194" +' +Const PluginAuthor = "Sylvie Cozic" +Const PluginDate = "23/03/2018" +Const PluginVersion = "1.5.0" +' +' Historique : +' 1.0.0 - 21/10/2011 - Sylvie Grimonpont : +' Première version +' +' 1.1.0 - 17/10/2012 - Sylvie Grimonpont : +' Ajout des versions Service pack de SQL Server 2008 +' +' 1.2.0 - 27/09/2013 - Sylvie Grimonpont : +' Ajout des versions Service pack de SQL Server 2008 R2 + SQL Server 2012 +' + recalcule d'un numéro de version "officiel" SQL Server (celui qu'on retrouve en lancant "Select @@version") +' + ecriture dans la table softwares (fonctionne à partir de l'agent OCS 2.1.0) +' +' 1.3.0 - 26/11/2013 - Sylvie Grimonpont : +' Si aucun service SQL n'est detecté mais que des produits SQL sont installés, on remonte l'information +' +' 1.4.0 - 04/06/2015 - Sylvie Cozic (Grimonpont) : +' Ajout de la version SQL Server 2014 +' + Ré-écrtiture complète de la partie Errorlog (quand les classes WMI ne donnent rien) +' + Ajout du plugin dbinstances dans les logiciels +' +' 1.5.0 - 23/03/2018 - Frank Bourdeau +' Ajout de la version SQL Server 2016 et SQL Server 2017 +' +' This code is open source and may be copied and modified as long as the source +' code is always made freely available. +' Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt +'------------------------------------------------------------------------------- + On Error Resume Next +' DECLARATIONS + 'Déclaration des constantes Const DblQuote = """" Const ForReading = 1 -Const HKEY_LOCAL_MACHINE = &H80000002 +Const HKEY_LOCAL_MACHINE = &H80000002 Const strMSSQLServerRegKey = "SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\Parameters" Const REG_SZ = 1 +Const adVarChar = 200 +Const MaxCharacters = 255 + +' RegExp pour reconstituer le n° de version "officiel" Microsoft SQL Server +' Par exemple Microsoft SQL Server 2008 10.3.5500.0 = Microsoft SQL Server 2008 10.00.5500.0 SP3 (le .3. = SP3...) +Set regexpOfficialVersion = New RegExp +regexpOfficialVersion.IgnoreCase = True +regexpOfficialVersion.Global = True +regexpOfficialVersion.Pattern = "(\d*)\.(\d*)\.(.*)" + +' RegExp pour détection produits SQL Server +Set regexpSQLProduct = New RegExp +regexpSQLProduct.IgnoreCase = True +regexpSQLProduct.Global = True +regexpSQLProduct.Pattern = "^Microsoft([^ -~]| )+SQL([^ -~]| )+Server([^ -~]| )+(\d|\.)+( (R|V)\d)*( \(64-bit\))*$" -' Spécificités SQL 2000 - ' RegExp pour récupération de l'édition dans un fichier ERRORLOG - Set regexpEdition = New RegExp - regexpEdition.IgnoreCase = True - regexpEdition.Global = True - regexpEdition.Pattern = "^.*dition" +' Clefs de registre des logiciels installés à parcourir +Set objUninstallPaths = CreateObject("Scripting.Dictionary") +objUninstallPaths.Add "1", "Software\Microsoft\Windows\CurrentVersion\Uninstall" +objUninstallPaths.Add "2", "Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" - ' RegExp pour récupération de la version dans un fichier ERRORLOG - Set regexpVersion = New RegExp - regexpVersion.IgnoreCase = True - regexpVersion.Global = True - regexpVersion.Pattern = "-[^-(]+(\(|$)" +' Dictionnaire des logiciels installés (pour gestion des doublons de nom logiciel) +Set dicInstalledSoftwares = CreateObject("Scripting.Dictionary") +dicInstalledSoftwares.RemoveAll +dicInstalledSoftwares.CompareMode = 0 -' Initialisation des variables -strSourceServer = "." +' MAIN + +' Remontée des informations du plugin dans la table SOFTWARES +arrScriptName = Split(Wscript.ScriptName,".") +Result = "" & VbCrLf +Result = Result & "Sylvie Cozic" & VbCrLf +Result = Result & "" & arrScriptName(0) & "" & VbCrLf +Result = Result & "" & PluginVersion & "" & VbCrLf +Result = Result & "Data out of OCS Plugin" & VbCrLf +Result = Result & "" +WScript.Echo Result ' Recherche d'un service ayant sqlservr.exe dans son path. Si ce service n'existe pas, aucune base sql ne tourne. -Set objWMIcimv2 = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strSourceServer & "\root\cimv2") +Set objWMIcimv2 = GetObject("winmgmts:root\cimv2") If Err = 0 Then - Set colServices = objWMIcimv2.ExecQuery("Select Name , PathName from Win32_Service Where PathName Like '%sqlservr.exe%'") - If Err = 0 Then - If colServices.count > 0 Then - If Err = 0 Then - 'Wscript.Echo "SQL Server trouvé !" - For Each objService in colServices - ' ServiceName - strServiceName = objService.Name - If InStr(strServiceName,"$") > 0 Then - strServiceName = Mid(strServiceName, InStr(strServiceName,"$") + 1) - End If - - ' PathName, Drive et Path - strPathName = objService.PathName - If Left(strPathName, 1) = DblQuote Then strPathName= Mid(strPathName, 2) - strDrive = Mid(strPathName, 1, 2) - strPath = Mid(strPathName, 3, InStr(1, strPathName, "sqlservr.exe") - 3) - - ' Recherche la version du fichier sqlservr.exe - strCIMDatafile = "Select FileName,Extension,Version from CIM_Datafile" _ - & " Where Drive = '" & strDrive & "'" _ - & " and Path = '" & Replace( strPath ,"\","\\") & "'" _ - & " and FileName = 'sqlservr' and Extension = 'exe'" - - ' Si on a eu une erreur entre temps, on efface - Err.Clear - - Set colSQLFile = objWMIcimv2.ExecQuery ( strCIMDatafile ) - If Err = 0 Then - For Each objSQLFile in colSQLFile - If Not IsNull(objSQLFile.Version) Then - arrSQLFileVersion=Split(objSQLFile.Version,".") - strSQLFileVersion=Cint(arrSQLFileVersion(1)) - Else - strSQLFileVersion=0 - End If - - ' Initialisation - strVersion ="" - strEdition ="" - strWMIsql = "" - strError = "" - - ' Positionne la classe WMI SqlServer en fonction de la version du fichier sqlservr.exe - If strSQLFileVersion = 90 Then strWMIsql = "ComputerManagement" - If strSQLFileVersion > 90 Then strWMIsql = "ComputerManagement10" - - ' Recherche la version et l'édition de la base SQL via la classe WMI SqlServer si disponible - If (strWMIsql <> "") Then - ' Si on a eu une erreur entre temps, on efface - Err.Clear - Set objWMIsql = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strSourceServer & "\root\Microsoft\SqlServer\" & strWMIsql) - If Err = 0 Then - For Each prop in objWMIsql.ExecQuery("select * from SqlServiceAdvancedProperty Where SQLServiceType = 1 And ServiceName='" & objService.Name & "'") - If Err = 0 Then - If (prop.PropertyName="VERSION") Then strVersion = prop.PropertyStrValue - If (prop.PropertyName="SKUNAME") Then strEdition = prop.PropertyStrValue - Else - WriteError() - End If - Next - If Err <> 0 Then WriteError() - Else - WriteError() - End If - End If - - ' Si on n'a pas pu determiner la version et l'édition à partir de la classe WMI (cas SQL Server 2000), on essaie de la déterminer à partir du fichier ERRORLOG (si en local) - If (((strWMIsql= "") Or (strVersion = "") Or (strEdition = "")) And (strSourceServer = ".")) Then - ' On ne trappe plus les erreurs... - On Error Goto 0 - ' Recherche du chemin du fichier ERRORLOG dans la base de registre - Set objRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strSourceServer & "\root\default:StdRegProv") - If objRegistry.EnumKey (HKEY_LOCAL_MACHINE, strMSSQLServerRegKey, arrSubKeys) = 0 Then - strErrorlogPath = "" - objRegistry.EnumValues HKEY_LOCAL_MACHINE, strMSSQLServerRegKey, arrValueNames, arrValueTypes - For I=0 To UBound(arrValueNames) - If arrValueTypes(I) = REG_SZ Then - objRegistry.GetStringValue HKEY_LOCAL_MACHINE,strMSSQLServerRegKey,arrValueNames(I),strValue - ' Dans HKLMSOFTWARE\Microsoft\MSSQLServer\MSSQLServer\Parameters, le paramètre qui commence par "-e" définie le path de ERRORLOG - If Left(strValue,2) = "-e" Then - strErrorlogPath = Mid(strValue,3) - End If - End If - Next - - ' Si on a trouvé le chemin du fichier ERRORLOG dans la base de registre, on essaie de lire le fichier en question - If strErrorlogPath <> "" Then - ' Teste l'existence du fichier - Set objFSO = CreateObject("Scripting.FileSystemObject") - If objFSO.FileExists(strErrorlogPath) Then - ' Teste la taille du fichier - Set objErrorlogFile = objFSO.GetFile(strErrorlogPath) - If objErrorlogFile.Size > 0 Then - ' Lit le fichier - ReadErrorLog(strErrorlogPath) - Else - ' On essaie avec le fichier ERRORLOG.1 - Set objErrorlogFile = objFSO.GetFile(strErrorlogPath & ".1") - If objErrorlogFile.Size > 0 Then - ReadErrorLog(strErrorlogPath & ".1") + Set colServices = objWMIcimv2.ExecQuery("Select Name , PathName from Win32_Service Where PathName Like '%sqlservr.exe%'") + If Err = 0 Then + If colServices.count > 0 Then + If Err = 0 Then + 'WScript.Echo "SQL Server trouvé !" + For Each objService in colServices + ' ServiceName + strServiceName = objService.Name + If InStr(strServiceName,"$") > 0 Then + strServiceName = Mid(strServiceName, InStr(strServiceName,"$") + 1) + End If + + ' PathName, Drive et Path + strPathName = objService.PathName + If Left(strPathName, 1) = DblQuote Then strPathName= Mid(strPathName, 2) + strDrive = Mid(strPathName, 1, 2) + strPath = Mid(strPathName, 3, InStr(1, strPathName, "sqlservr.exe") - 3) + + ' Recherche la version du fichier sqlservr.exe + strCIMDatafile = "Select FileName,Extension,Version from CIM_Datafile" _ + & " Where Drive = '" & strDrive & "'" _ + & " and Path = '" & Replace( strPath ,"\","\\") & "'" _ + & " and FileName = 'sqlservr' and Extension = 'exe'" + + ' Si on a eu une erreur entre temps, on efface + Err.Clear + + Set colSQLFile = objWMIcimv2.ExecQuery ( strCIMDatafile ) + If Err = 0 Then + For Each objSQLFile in colSQLFile + ' WScript.Echo "Version objSQLFile (l. 131) : " & objSQLFile.Version + If Not IsNull(objSQLFile.Version) Then + arrSQLFileVersion=Split(objSQLFile.Version,".") + strSQLFileVersion=Cint(arrSQLFileVersion(1)) + Else + strSQLFileVersion=0 + End If + + ' Initialisation + strVersion ="" + strEdition ="" + strServicePack = "" + strWMIsql = "" + strError = "" + + ' Positionne la classe WMI SqlServer en fonction de la version du fichier sqlservr.exe + If strSQLFileVersion = 90 Then strWMIsql = "ComputerManagement" + If strSQLFileVersion > 90 Then strWMIsql = "ComputerManagement10" + If strSQLFileVersion = 110 Then strWMIsql = "ComputerManagement11" + If strSQLFileVersion = 120 Then strWMIsql = "ComputerManagement12" + If strSQLFileVersion = 130 Then strWMIsql = "ComputerManagement13" + If strSQLFileVersion = 140 Then strWMIsql = "ComputerManagement14" + + ' Recherche la version et l'édition de la base SQL via la classe WMI SqlServer si disponible + If (strWMIsql <> "") Then + ' Si on a eu une erreur entre temps, on efface + Err.Clear + Set objWMIsql = GetObject("winmgmts:root\Microsoft\SqlServer\" & strWMIsql) + If Err = 0 Then + For Each prop in objWMIsql.ExecQuery("select * from SqlServiceAdvancedProperty Where SQLServiceType = 1 And ServiceName='" & objService.Name & "'") + If Err = 0 Then + If (prop.PropertyName="VERSION") Then strVersion = prop.PropertyStrValue + If (prop.PropertyName="SKUNAME") Then strEdition = prop.PropertyStrValue + Else + WriteError() + End If + Next + If Err <> 0 Then WriteError() + Else + WriteError() + End If + End If + + ' Si on n'a pas pu determiner la version et l'édition à partir de la classe WMI (cas SQL Server 2000), on essaie de la déterminer à partir du fichier ERRORLOG (si en local) + If (((strWMIsql= "") Or (strVersion = "") Or (strEdition = "")) And (strSourceServer = ".")) Then + + ' On ne trappe plus les erreurs... + On Error Goto 0 + + ' Init + strErrorlogPath = "" + Set objFSO = CreateObject("Scripting.FileSystemObject") + + ' Recherche le répertoire le répertoire des ERRORLOG de la base SQL à partir du chemin de l'exécutable du service + If objFSO.FolderExists(strDrive & strPath) Then + strServiceParentPath = objFSO.GetParentFolderName(strDrive & strPath) + If objFSO.FolderExists(strServiceParentPath & "\LOG") Then + strErrorlogPath = strServiceParentPath & "\LOG" + End If + End If + + ' Tente la recherche le répertoire des ERRORLOG dans la base de registre + If strErrorlogPath = "" Then + Set objRegistry = GetObject("winmgmts:root\default:StdRegProv") + If objRegistry.EnumKey (HKEY_LOCAL_MACHINE, strMSSQLServerRegKey, arrSubKeys) = 0 Then + strErrorlogFile = "" + objRegistry.EnumValues HKEY_LOCAL_MACHINE, strMSSQLServerRegKey, arrValueNames, arrValueTypes + For I=0 To UBound(arrValueNames) + If arrValueTypes(I) = REG_SZ Then + objRegistry.GetStringValue HKEY_LOCAL_MACHINE,strMSSQLServerRegKey,arrValueNames(I),strValue + ' Dans HKLMSOFTWARE\Microsoft\MSSQLServer\MSSQLServer\Parameters, le paramètre qui commence par "-e" définie le path de ERRORLOG + If Left(strValue,2) = "-e" Then + strErrorlogFile = Mid(strValue,3) + Exit For + End If + End If + Next + + ' Si on a trouvé le chemin du fichier ERRORLOG dans la base de registre, on récupère le répertoire de celui-ci + If strErrorlogFile <> "" Then + ' Teste l'existence du fichier + If objFSO.FileExists(strErrorlogFile) Then + strErrorlogPath = objFSO.GetParentFolderName(strErrorlogFile) + Else + strError = "Le fichier " & strErrorlogFile & " n'existe pas" + End If + Else + strError = "Information sur fichier ERRORLOG non trouvée en base de registre" + End If + Else + strError = "Information sur fichier ERRORLOG non trouvée en base de registre" + End If + End If + + ' Si on a trouvé le répertoire des ERRORLOG on essaie de lire l'un des fichiers ERRORLOG + If strErrorlogPath <> "" Then + Set objErrorlogFolder = objFSO.GetFolder(strErrorlogPath) + Set colErrorlogFiles = objErrorlogFolder.Files + For Each objErrorlogFile in colErrorlogFiles + If objFSO.GetBaseName(objErrorlogFile) = "ERRORLOG" Then + ' Teste la taille du fichier + If objErrorlogFile.Size > 0 Then + strErrorlogFile = objErrorlogFile.Path + ' Lit le fichier + ReadErrorLog(strErrorlogFile) + 'Sort de la boucle + Exit For + End If + End If + Next + If strVersion = "" Then + strError = "Le fichier " & strErrorlogPath & "\ERRORLOG n'est pas exploitable" + End If + End If + End If + + ' Récupération du nom SQL Server + ' WScript.Echo "Version de SQL : " & strVersion + If Left(strVersion,3) = "6.5" Then + strSQLName = "Microsoft SQL Server 6.5" + ElseIf Left(strVersion,1) = "7" Then + strSQLName = "Microsoft SQL Server 7.0" + ElseIf Left(strVersion,1) = "8" Then + strSQLName = "Microsoft SQL Server 2000" + ElseIf Left(strVersion,1) = "9" Then + strSQLName = "Microsoft SQL Server 2005" + ElseIf Left(strVersion,2) = "10" Then + strSQLName = "Microsoft SQL Server 2008" + If Left(strVersion,4) = "10.5" Then + strSQLName = "Microsoft SQL Server 2008 R2" + End if + ElseIf Left(strVersion,2) = "11" Then + strSQLName = "Microsoft SQL Server 2012" + ElseIf Left(strVersion,2) = "12" Then + strSQLName = "Microsoft SQL Server 2014" + ElseIf Left(strVersion,2) = "13" Then + strSQLName = "Microsoft SQL Server 2016" + ElseIf Left(strVersion,2) = "14" Then + strSQLName = "Microsoft SQL Server 2017" + Else + strSQLName = "Microsoft SQL Server" + End if + + ' Re-"calcule" le numéro officiel de la version SQL et du service pack le cas échéant + ' Par exemple Microsoft SQL Server 2008 10.3.5500.0 = Microsoft SQL Server 2008 10.00.5500.0 SP3 (le .3. = SP3...) + Set matchesVersion = regexpOfficialVersion.Execute(strVersion) + If matchesVersion.Count > 0 Then + ' Seulement les versions > 7 + If CInt(matchesVersion(0).Submatches(0)) > 7 Then + ' Pad à gauche le 2ème nombre de la version : xx.3.xx -> xx.03.xx + strPadSubversion=Right(String(2, "0") & matchesVersion(0).Submatches(1),2) + ' Récupère le numéro de Service Pack si existant xx.03.xx -> SP3, xx.51.xx -> SP1,... + If Right (strPadSubversion,1) <> "0" Then + strServicePack = " (SP" & Right (strPadSubversion,1) & ")" + End IF + ' Reforme le numéro de version "officielle" : xx.03.xx -> xx.00.xx, xx.51.xx -> xx.50.xx + strVersion = matchesVersion(0).Submatches(0) & "." & Left(strPadSubversion,1) & "0." & matchesVersion(0).Submatches(2) + End If + End If + + ' Ecrit les données de sortie en XML + ' Les données disponibles sont : + ' - strSQLName : Nom long du produit SQL Server + ' - strServiceName : Nom de l'instance + ' - strEdition : Edition. Par exple : Enterprise Edition (64-bit) / Express Edition + ' - strVersion : Version "chiffrée". Par exemple : 8.00.194 / 10.50.1600.1 + ' Le format remonté est spécifique à un process interne. A vous d'adapter en fonction de vos besoins. :-) + ' On garde pour le côté ergonomique sur l'interface Web OCS + Result = "" & VbCrLf + Result = Result & "Microsoft Corporation" & VbCrLf + Result = Result & "" & strSQLName & strServicePack & "" & VbCrLf + Result = Result & "" & strVersion & "" & VbCrLf + Result = Result & "" & strEdition & "" & VbCrLf + Result = Result & "" & strServiceName & "" & VbCrLf + Result = Result & "" + WScript.Echo Result + + ' Remontée dans la table SOFTWARES (fonctionne à partir de la version 2.1.0 de l'agent Windows) + Result = "" & VbCrLf + Result = Result & "Microsoft Corporation" & VbCrLf + Result = Result & "" & strSQLName & strServicePack & strEdition & "" & VbCrLf + Result = Result & "" & strVersion & "" & VbCrLf + Result = Result & "Data out of OCS Plugin" & VbCrLf + Result = Result & "" + WScript.Echo Result + + Next + Else + WriteError() + End If + Next + Else + WriteError() + End If + Else + ' Aucun service SQL Server trouvé. + ' Si des produits SQL Server sont installés, on précise dans DBInstance qu'aucun service ne tourne pour ces produits. + + 'WScript.Echo "Aucun SQL Server trouvé !" + On Error Goto 0 + + 'Parcours les logiciels installés + Set objReg=GetObject("winmgmts:root\default:StdRegProv") + colKeyPaths = objUninstallPaths.Items + For Each strKeyPath in colKeyPaths + objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys + If IsArray(arrSubKeys) Then + For Each Subkey in arrSubKeys + strExpKeyPath = strKeyPath & "\" & Subkey + objReg.EnumValues HKEY_LOCAL_MACHINE, strExpKeyPath, arrEntryNames ,arrValueTypes + strDisplayName = "" + If IsArray(arrEntryNames) Then + For i = 0 To UBound(arrEntryNames) + If InStr(1, arrEntryNames(i), "DisplayName", vbTextCompare) Then + If InStr(1, arrEntryNames(i), "ParentDisplayName", vbTextCompare) Then + '## Ne rien Faire Else - strError = "Le fichier " & strErrorlogPath & " est vide" + If arrValueTypes(i) = REG_SZ Then + objReg.GetStringValue HKEY_LOCAL_MACHINE, strExpKeyPath, arrEntryNames(i), strValue + If strValue <> "" AND NOT IsNull(strValue) Then + strDisplayName = strValue + strDisplayName = Replace(strDisplayName, "[", "(") + strDisplayName = Replace(strDisplayName, "]", ")") + strDisplayName = Replace(strDisplayName, Chr(160), " ") + End If + End If End If - End If - Else - strError = "Le fichier " & strErrorlogPath & " n'existe pas" - End If - Else - strError = "Information sur fichier ERRORLOG non trouvée en base de registre" - End If - Else - strError = "Information sur fichier ERRORLOG non trouvée en base de registre" + End If + Next End If - End If - ' Récupération du nom SQL Server - If Left(strVersion,3) = "6.5" Then - strSQLName = "Microsoft SQL Server 6.5" - ElseIf Left(strVersion,1) = "7" Then - strSQLName = "Microsoft SQL Server 7.0" - ElseIf Left(strVersion,1) = "8" Then - strSQLName = "Microsoft SQL Server 2000" - ElseIf Left(strVersion,1) = "9" Then - strSQLName = "Microsoft SQL Server 2005" - ElseIf Left(strVersion,4) = "10.0" Then - strSQLName = "Microsoft SQL Server 2008" - ElseIf Left(strVersion,4) = "10.5" Then - strSQLName = "Microsoft SQL Server 2008 R2" - Else - strSQLName = "Microsoft SQL Server" - End if - - ' Ecrit les données de sortie en XML - - ' Les données disponibles sont : - ' - strSQLName : Nom long du produit SQL Server - ' - strServiceName : Nom de l'instance - ' - strEdition : Edition. Par exple : Enterprise Edition (64-bit) / Express Edition - ' - strVersion : Version "chiffrée". Par exemple : 8.00.194 / 10.50.1600.1 - - ' Le format remonté est spécifique à un process interne. A vous d'adapter en fonction de vos besoins. :-) - - Wscript.Echo _ - "" & VbCrLf &_ - "Microsoft Corporation" & VbCrLf &_ - "" & strSQLName & "" & VbCrLf &_ - "" & strVersion & "" & VbCrLf &_ - "" & strEdition & "" & VbCrLf &_ - "" & strServiceName & "" & VbCrLf &_ - "" - Next - Else - WriteError() - End If + If strDisplayName <> "" Then + ' Si ce logiciel n'est pas déjà vu dans la boucle + If Not dicInstalledSoftwares.Exists(strDisplayName) Then + ' Ajout au dictionnaire des logiciels installés + dicInstalledSoftwares.Add strDisplayName, strDisplayName + ' Si ce logiciel est un produit SQL Server + Set matchesSQLProduct = regexpSQLProduct.Execute(strDisplayName) + If matchesSQLProduct.Count > 0 Then + ' Ecrit les données de sortie en XML dans la table Dbinstances + Result = "" & VbCrLf &_ + Result = Result & "Microsoft Corporation" & VbCrLf &_ + Result = Result & "" & strDisplayName & "" & VbCrLf &_ + Result = Result & "Aucun service" & VbCrLf &_ + Result = Result & "" + WScript.Echo Result + End If + End If + End If + Next + End If Next - Else - WriteError() - End If - Else - On Error Goto 0 - 'Wscript.Echo "Aucun SQL Server trouvé !" - End if - Else - WriteError() - End If + Set dicInstalledSoftwares = Nothing + End if + Else + WriteError() + End If Else - WriteError() + WriteError() End If On Error Goto 0 @@ -230,57 +393,113 @@ On Error Goto 0 WScript.Quit Sub WriteError() - strError = "Erreur " & Err.Number & " - " & Err.Description + strError = "Erreur " & Err.Number & " - " & Err.Description - ' ' On écrit l'erreur dans le fichier + ' ' On écrit l'erreur dans le fichier - Err.Clear + Err.Clear End Sub -Function MultilineTrim (Byval TextData) - Dim textRegExp - Set textRegExp = new regexp - textRegExp.Pattern = "\s{0,}(\S{1}[\s,\S]*\S{1})\s{0,}" - textRegExp.Global = False - textRegExp.IgnoreCase = True - textRegExp.Multiline = True - - If textRegExp.Test (TextData) Then - MultilineTrim = textRegExp.Replace (TextData, "$1") + +Function TestFileEncoding(strFilePath) +' Retourne +' 0 si le fichier testé est en AscII +' -1 si le fichier testé est en Unicode + + ' Init + TestFileEncoding = 0 + + ' Ouvre le fichier et récupère les 3 premiers caractères + Set testFile = objFSO.OpenTextFile(strFilePath) + char1 = testFile.read(1) + char2 = testFile.read(1) + char3 = testFile.read(1) + testFile.Close + + ' Teste les 3 premiers caractères pour voir si c'est de l'Unicode + If (Asc(char1) = 255 And Asc(char2) = 254) Then + TestFileEncoding = -1 + ElseIf (Asc(char1) = 254 And Asc(char2) = 255) Then + TestFileEncoding = -1 + ElseIf (Asc(char1) = 239 And Asc(char2) = 187 And Asc(char3) = 191) Then + TestFileEncoding = -1 Else - MultilineTrim = "" + TestFileEncoding = 0 End If + +End Function + +Function MultilineTrim (Byval TextData) + Dim textRegExp + Set textRegExp = new regexp + textRegExp.Pattern = "\s{0,}(\S{1}[\s,\S]*\S{1})\s{0,}" + textRegExp.Global = False + textRegExp.IgnoreCase = True + textRegExp.Multiline = True + + If textRegExp.Test (TextData) Then + MultilineTrim = textRegExp.Replace (TextData, "$1") + Else + MultilineTrim = "" + End If End Function + Sub ReadErrorLog (strFilePath) - ' Lit le fichier - Set objTextFile =objFSO.OpenTextFile(strFilePath, ForReading, False) - For i = 1 To 4 - strErrorlogText = objTextFile.Readline - - ' La version se trouve sur la première ligne - If i = 1 Then - Set versions = regexpVersion.Execute(strErrorlogText) - For Each version In versions - strVersion = version - If Left(strVersion,1) = "-" Then strVersion = Mid(strVersion,2) - If Right(strVersion,1) = "(" Then strVersion = Left(strVersion,Len(strVersion)-1) - strVersion = MultilineTrim(strVersion) - Next - If strVersion="" Then strVersion = "Errolog" - End If - - ' L'édition se trouve sur la quatrième ligne - If i = 4 Then - strEdition = strErrorlogText - Set editions = regexpEdition.Execute(strErrorlogText) - For Each edition In editions - strEdition = edition - strEdition = MultilineTrim(strEdition) - Next - If strEdition="" Then strEdition = "Errolog" - End If - - Next - objTextFile.Close +' Lit un fichier ErrorLog et récupère les informations de version et d'édition SQL + + ' RegExp pour récupération de la version dans un fichier ERRORLOG + Set regexpVersion = New RegExp + regexpVersion.IgnoreCase = True + regexpVersion.Global = True + regexpVersion.Pattern = "-[^-\(]+(\(|$)" + + ' RegExp pour récupération de l'édition dans un fichier ERRORLOG + Set regexpEdition = New RegExp + regexpEdition.IgnoreCase = True + regexpEdition.Global = True + regexpEdition.Pattern = "^.*dition|^.* on |^.*" + + ' Ouvre le fichier en fonction de son encodage + intFileMode = TestFileEncoding(strFilePath) + Set objTextFile =objFSO.OpenTextFile(strFilePath, ForReading, False, intFileMode) + + ' Lit le fichier + For i = 1 To 4 + strErrorlogText = objTextFile.Readline + + ' La version se trouve sur la première ligne + If i = 1 Then + Set versions = regexpVersion.Execute(strErrorlogText) + For Each version In versions + strVersion = version + If Left(strVersion,1) = "-" Then strVersion = Mid(strVersion,2) + If Right(strVersion,1) = "(" Then strVersion = Left(strVersion,Len(strVersion)-1) + strVersion = MultilineTrim(strVersion) + Next + If strVersion="" Then strVersion = "Errolog" + End If + + ' L'édition se trouve sur la quatrième ligne + If i = 4 Then + 'strEdition = strErrorlogText + Set editions = regexpEdition.Execute(strErrorlogText) + For Each edition In editions + strEdition = edition + If Right(strEdition,4) = " on " Then strEdition = Left(strEdition,Len(strEdition)-4) + strEdition = MultilineTrim(strEdition) + Next + If strEdition="" Then strEdition = "Errolog" + + ' Si on trouve une information de Service pack on en profite pour la remonter + If InStr(strErrorlogText,"Service Pack") > 0 Then + strServicePack = " (SP" & Mid(strErrorlogText, InStr(strErrorlogText,"Service Pack") + 13) + End If + End If + + Next + + ' Ferme le fichier + objTextFile.Close + End Sub