Description:

This script will change the Class context case. For example, Inprocserver32 is replaced by InprocServer32.

Usage

CScript.exe {Script} {MSI} {Transform 1} {Transform 2} {Transform x..} (or if transform ordering is not important, drag an MSI and multiple MSTs onto the VBS file)

Script

'set up log file
Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
'create a name/path for log file
Dim MSIPath : Set MSIPath = fso.GetFile(WScript.Arguments(0))  
Dim logFile : logFile = Left(MSIPath.Path, InStrRev(MSIPath.Path, ".") - 1) & ".log"
Dim objLogFile : Set objLogFile = fso.OpenTextFile(logFile, ForAppending, True)
WriteLog "Modifying Context Case"
WriteLog "Processing: " & MSIPath.Name
'create 2 constants - one for when we want to just query the MSI (read) and one for when we want to make changes (write)
Const msiOpenDatabaseModeReadOnly = 0
Const msiOpenDatabaseModeTransact = 1
Const msiViewModifyReplace = 4
'create WindowsInstaller.Installer object
Dim oInstaller : Set oInstaller = CreateObject("WindowsInstaller.Installer")
'open the MSI (the first argument supplied to the vbscript)
Dim oDatabase : Set oDatabase = oInstaller.OpenDatabase(WScript.Arguments(0),msiOpenDatabaseModeTransact) 
Dim tempKey : tempKey = ""
Dim currentContext : currentContext = ""
Dim tempKeyArray, tableView, tableRec, originalValue, tempValue
If oDatabase.TablePersistent("Registry") = 1 Then
Set Tableview = oDatabase.OpenView("SELECT `Key` FROM `Registry`")
Tableview.Execute
Set TableRec = Tableview.Fetch
While Not TableRec Is Nothing
originalValue = TableRec.StringData(1)
tempValue = originalValue
If (InStr(1,tempValue,"inprocserver",1) > 0) And Not (InStr(1,tempValue,"InprocServer",0) > 0) _
Or (InStr(1,tempValue,"inprochandler",1) > 0) And Not (InStr(1,tempValue,"InprocHandler",0) > 0) _
Or (InStr(1,tempValue,"localserver",1) > 0) And Not (InStr(1,tempValue,"LocalServer",0) > 0) _
Or (InStr(1,tempValue,"toolboxbitmap",1) > 0) And Not (InStr(1,tempValue,"ToolBoxBitmap",0) > 0) Then
tempValue = Replace(tempValue,"inprocserver","InprocServer",1,-1,1)											
tempValue = Replace(tempValue,"inprochandler","InprocHandler",1,-1,1)
tempValue = Replace(tempValue,"localserver","LocalServer",1,-1,1)
tempValue = Replace(tempValue,"toolboxbitmap","ToolBoxBitmap",1,-1,1)
TableRec.StringData(1) = tempValue
Tableview.Modify msiViewModifyReplace, TableRec
WriteLog "Modifying Registry Key: " & originalValue & " and changing to: " & tempValue								
End If	
Set TableRec = Tableview.Fetch
Wend
End If
If oDatabase.TablePersistent("Class") = 1 Then
Set Tableview = oDatabase.OpenView("SELECT `Context` FROM `Class`")
Tableview.Execute
Set TableRec = Tableview.Fetch
While Not TableRec Is Nothing
originalValue = TableRec.StringData(1)
tempValue = originalValue
If (InStr(1,tempValue,"inprocserver",1) > 0) And Not (InStr(1,tempValue,"InprocServer",0) > 0) _
Or (InStr(1,tempValue,"inprochandler",1) > 0) And Not (InStr(1,tempValue,"InprocHandler",0) > 0) _
Or (InStr(1,tempValue,"localserver",1) > 0) And Not (InStr(1,tempValue,"LocalServer",0) > 0) _
Or (InStr(1,tempValue,"toolboxbitmap",1) > 0) And Not (InStr(1,tempValue,"ToolBoxBitmap",0) > 0) Then
tempValue = Replace(tempValue,"inprocserver","InprocServer",1,-1,1)											
tempValue = Replace(tempValue,"inprochandler","InprocHandler",1,-1,1)
tempValue = Replace(tempValue,"localserver","LocalServer",1,-1,1)
tempValue = Replace(tempValue,"toolboxbitmap","ToolBoxBitmap",1,-1,1)
TableRec.StringData(1) = tempValue
Tableview.Modify msiViewModifyReplace, TableRec	
WriteLog "Modifying Class Context: " & originalValue & " and changing to: " & tempValue			
End If				     			
Set TableRec = Tableview.Fetch
Wend
End If
oDatabase.Commit	
objLogFile.Close
Set fso = Nothing
Set objLogFile = Nothing	
Set oDatabase = Nothing
Set oInstaller = Nothing
Sub WriteLog(LogMessage)
WScript.echo Now() & ": " & LogMessage
objLogFile.Writeline(Now() & ": " & LogMessage)
End Sub

 

Change the Class Context Case
Change the Class Context Case

Leave a Reply