' AG-VIP SQL Support ' ' Patch for AG-VIP SQL 1.20.005 ' 2009.09.02 Martin Richter ' ' This patch disables a custom action for the CodeMeter merge module, that should not be ' executed upon repair or deinstlation. ' Copyright (c) 2009, Grutzeck-Software GmbH Option Explicit '======================================================================================================= Const MSIOPENDATABASEMODE_READONLY = 0 Const MSIOPENDATABASEMODE_TRANSACT = 1 Const MSIOPENDATABASEMODE_DIRECT = 2 Const MSIOPENDATABASEMODE_PATCHFILE = 32 Const MSIVIEWMODIFY_ASSIGN = 3 Const PID_TEMPLATE = 7 Const PID_PACKAGECODE = 9 'package code for .msi Const LEN_GUID = 38 Const V120005_PACKAGE_CODE_GUID = "{44931416-6507-475F-B1D0-664F23B3C443}" const PATCH_CONDITION = "Installed AND $CodeMeter.exe.A961A077_4BD0_4C98_86BC_EE4A98CE550D=3" '======================================================================================================= Dim oMsi,oFso,oWShell Dim sWinDir,sWICacheDir,sScriptDir,sMsp,sPackageCode,sCmd Dim File,prod Dim fCScript, fFound '======================================================================================================= fCScript = (LCase(Mid(Wscript.FullName, Len(Wscript.Path)+2, 1)) = "c") If fCScript Then wscript.echo "Script Starting" ' Get some required objecs Set oMsi = CreateObject("WindowsInstaller.Installer") Set oFso = CreateObject("Scripting.FileSystemObject") Set oWShell = CreateObject("Wscript.Shell") sWinDir = oWShell.ExpandEnvironmentStrings("%windir%")&"\" sWICacheDir = sWinDir&"Installer\" sScriptDir = wscript.ScriptFullName sScriptDir = Left(sScriptDir,InStrRev(sScriptDir,"\")) 'Scan the local Windows Installer Cache for the patch For Each File in oFso.GetFolder(sWICacheDir).Files ' wscript.echo File If LCase(Right(File.Name,4))= ".msi" Then sPackageCode = Left(oMsi.SummaryInformation(File.Path,MSIOPENDATABASEMODE_READONLY).Property(PID_PACKAGECODE),LEN_GUID) ' wscript.echo sPackageCode If sPackageCode = V120005_PACKAGE_CODE_GUID Then 'Found 1.20.005 Installation package 'Have to update this instance as this will be effectively used for patching UpdateMSIStore File.Path fFound = true End If End If Next 'File If Not fFound Then wscript.echo "AG-VIP SQL 1.20.005 is not installed!" End If If fCScript Then wscript.echo "Script Complete" '======================================================================================================= Sub UpdateMSIStore(sMspFile) Dim View,MsiDb,Record Dim sQuery,sMstEmbedded Dim i If fCScript Then wscript.echo "Updating MSI for 1.20.005 "& sMspFile 'Remove Read Only attribute oFso.GetFile(sMspFile).Attributes = 0 'Open the .msp file in edit mode Set MsiDb = oMsi.OpenDatabase(sMspFile,MSIOPENDATABASEMODE_TRANSACT) sQuery = "SELECT Action, Condition, Sequence FROM InstallExecuteSequence WHERE `Sequence`=502" Set View = MsiDb.OpenView(sQuery) 'Read the record in the substorage and modify it View.Execute Set Record = View.Fetch ' check if pacth already applied if Record.StringData(2) = PATCH_CONDITION Then wscript.echo "This MSI file of AG-VIP SQL 1.20.005 is already patched!" & vbCrLf & sMspFile Else Record.StringData(2) = "Installed AND $CodeMeter.exe.A961A077_4BD0_4C98_86BC_EE4A98CE550D=3" View.Modify MSIVIEWMODIFY_ASSIGN,Record 'Commit the changes MsiDb.Commit ' Display success wscript.echo "The patch for the MSI file of AG-VIP SQL 1.20.005 was successfully applied!" & vbCrLf & sMspFile End If 'Clean up Set Record = Nothing Set View = Nothing End Sub 'UpdateMSIStore '=======================================================================================================