472 lines
14 KiB
Plaintext
472 lines
14 KiB
Plaintext
|
'
|
||
|
' Script to update OS install MSI package
|
||
|
' Syntax: cscript OsPack.vbs package_path platform build_number language_number info_file
|
||
|
'
|
||
|
'
|
||
|
Sub Usage()
|
||
|
Wscript.echo "Script to update OS install MSI package. Syntax:"
|
||
|
Wscript.echo " cscript OsPack.vbs package_path platform build_number language_number"
|
||
|
Wscript.echo " package_path - path to package to update. requires read/write access"
|
||
|
Wscript.echo " platform - must be either 'Alpha' or 'Intel'"
|
||
|
Wscript.echo " build_number - 4 digit build number of the current build, i.e 1877"
|
||
|
Wscript.echo " language_number - Language Id of the desired language, i.e. 1033 = US English, 0=Neutral"
|
||
|
Wscript.echo " info_file - File containing information in Valuename = Value format"
|
||
|
Wscript.Quit -1
|
||
|
End Sub
|
||
|
|
||
|
' takes a string of the form 0x409 and converts it to an int
|
||
|
Function IntFromHex(szInHexString)
|
||
|
szHexString = szInHexString
|
||
|
IntFromHex = 0
|
||
|
multiplier = 1
|
||
|
While (UCase(Right(szHexString, 1)) <> "X")
|
||
|
Ch = UCase(Right(szHexString, 1))
|
||
|
Select Case Ch
|
||
|
Case "A" Ch = 10
|
||
|
Case "B" Ch = 11
|
||
|
Case "C" Ch = 12
|
||
|
Case "D" Ch = 13
|
||
|
Case "E" Ch = 14
|
||
|
Case "F" Ch = 15
|
||
|
End Select
|
||
|
IntFromHex = IntFromHex + multiplier * Ch
|
||
|
multiplier = multiplier * 16
|
||
|
szHexString = Left(szHexString, Len(szHexString) - 1)
|
||
|
Wend
|
||
|
Exit Function
|
||
|
End Function
|
||
|
|
||
|
'
|
||
|
' Uses uuidgen.exe to generate a GUID, then formats it to be
|
||
|
' a MSI acceptable string guid
|
||
|
'
|
||
|
' This makes use of a temporary file %temp%\MakeTempGUID.txt
|
||
|
'
|
||
|
Function MakeGuid()
|
||
|
Dim WSHShell, FileSystem, File, ret, TempFileName, regEx
|
||
|
Set WSHShell = CreateObject("WScript.Shell")
|
||
|
Set FileSystem = CreateObject("Scripting.FileSystemObject")
|
||
|
|
||
|
TempFileName = WSHShell.ExpandEnvironmentStrings("%temp%\MakeTempGUID.txt")
|
||
|
|
||
|
If FileSystem.fileExists(TempFileName) Then
|
||
|
FileSystem.DeleteFile TempFileName
|
||
|
End If
|
||
|
|
||
|
ret = WSHShell.Run("uuidgen -o" & TempFileName, 2, True)
|
||
|
|
||
|
If FileSystem.fileExists(TempFileName) Then
|
||
|
Set File = FileSystem.OpenTextFile(TempFileName, 1)
|
||
|
MakeGuid = "{" & UCase(File.ReadLine) & "}"
|
||
|
File.Close
|
||
|
FileSystem.DeleteFile TempFileName
|
||
|
Wscript.echo " Generated GUID: " & MakeGuid
|
||
|
Else
|
||
|
MakeGuid = "{00000000-0000-0000-0000-000000000000}"
|
||
|
Wscript.echo " ERROR: Failed to generate GUID"
|
||
|
End If
|
||
|
Exit Function
|
||
|
End Function
|
||
|
|
||
|
Function GetToken(szFile, szValue)
|
||
|
Dim FileSystem, File, Line, regEx, Matches, Match
|
||
|
|
||
|
GetToken = Empty
|
||
|
Set FileSystem = CreateObject("Scripting.FileSystemObject")
|
||
|
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error creating filesystem object"
|
||
|
End If
|
||
|
|
||
|
szPathToFile = FileSystem.GetAbsolutePathName(szFile) ' Gets current directory
|
||
|
|
||
|
If FileSystem.fileExists(szPathToFile) Then
|
||
|
Set File = FileSystem.OpenTextFile(szPathToFile, 1) 'Open up the file
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error opening file " & szPathToFile
|
||
|
End If
|
||
|
|
||
|
Do While File.AtEndOfStream <> True
|
||
|
Line = File.ReadLine
|
||
|
|
||
|
Set regEx = New RegExp
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error creating RegExp object"
|
||
|
End If
|
||
|
|
||
|
regEx.Pattern = szValue & " *=+ *" ' Look for valuename = Value entry
|
||
|
regEx.IgnoreCase = False
|
||
|
regEx.Global = False
|
||
|
Set Matches = regEx.Execute(Line)
|
||
|
|
||
|
|
||
|
For Each Match In Matches
|
||
|
ValueIndex = Match.FirstIndex + Match.Length + 1
|
||
|
GetToken = Mid(Line, ValueIndex)
|
||
|
Exit Function
|
||
|
Next
|
||
|
|
||
|
Loop
|
||
|
|
||
|
If Matches.Count = 0 Then
|
||
|
Wscript.echo "Error: Could not find " & szValue & " in " & szFile
|
||
|
End If
|
||
|
|
||
|
Else
|
||
|
Wscript.echo "ERROR: " & szPathToFile & " not present"
|
||
|
|
||
|
|
||
|
|
||
|
End If
|
||
|
Exit Function
|
||
|
End Function
|
||
|
|
||
|
|
||
|
|
||
|
'
|
||
|
' Updates the OS install MSI package using the following paramaters
|
||
|
' szPackage - path to package to update. requires read/write access
|
||
|
' szPlatform - must be either "Alpha" or "Intel"
|
||
|
' dwBuildNumber - 4 digit build number of the current build, i.e 1877
|
||
|
' dwLanguage - Language Id of the desired language, i.e. 1033 = US English, 0=Neutral
|
||
|
'
|
||
|
Function UpdateOsPackage(szPackage, szPlatform, dwBuildNumber, dwLanguage, szInfoFile)
|
||
|
Dim WSHShell, Installer, Database, SummaryInfo, Record, View, SQL
|
||
|
|
||
|
Wscript.echo "Updating OS install package: " & szPackage
|
||
|
Wscript.echo " For: " & szPlatform
|
||
|
Wscript.echo " Build: " & dwBuildNumber
|
||
|
Wscript.echo " Lang: " & dwLanguage
|
||
|
|
||
|
|
||
|
UpdateOsPackage = 0
|
||
|
Err = 0
|
||
|
On Error Resume Next
|
||
|
|
||
|
'Create the MSI API object
|
||
|
Set Installer = CreateObject("WindowsInstaller.Installer")
|
||
|
If Err <> 0 Then
|
||
|
Err = 0
|
||
|
Set Installer = CreateObject("WindowsInstaller.Application")
|
||
|
End If
|
||
|
If Err <> 0 Then
|
||
|
Err = 0
|
||
|
Set Installer = CreateObject("Msi.ApiAutomation")
|
||
|
End If
|
||
|
If Err <> 0 Then
|
||
|
Err = 0
|
||
|
Wscript.echo "ERROR: Error creating Installer object"
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
'Create the WSH shell object
|
||
|
Set WSHShell = CreateObject("WScript.Shell")
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error creating WSHShell object"
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
'Open the package
|
||
|
Set Database = Installer.OpenDatabase(szPackage, 1)
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error opening database"
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
Wscript.echo " Database opened for update"
|
||
|
|
||
|
'Generate and set a new package code
|
||
|
Set SummaryInfo = Database.SummaryInformation(3)
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Creating Summary Info Object"
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
'-------------------------------------------------
|
||
|
' Remove the not needed Summary fields
|
||
|
'-------------------------------------------------
|
||
|
|
||
|
SummaryInfo.Property(3) = Empty 'Subject
|
||
|
SummaryInfo.Property(4) = Empty 'Author
|
||
|
SummaryInfo.Property(5) = Empty 'Keywords
|
||
|
SummaryInfo.Property(6) = Empty 'Comments
|
||
|
SummaryInfo.Property(8) = Empty 'Last Saved by
|
||
|
SummaryInfo.Property(13) = Empty 'Last Save Time
|
||
|
|
||
|
Err=0
|
||
|
SummaryInfo.Property(9) = MakeGuid()
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error setting package code"
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
Wscript.echo " Updated package Code"
|
||
|
|
||
|
'-------------------------------------------------
|
||
|
'Update Platform and Language list
|
||
|
'-------------------------------------------------
|
||
|
|
||
|
|
||
|
SummaryInfo.Property(7) = szPlatform & ";" & dwLanguage
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error setting platform and language list"
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
Wscript.echo " Updated Language and platform list to: " & szPlatform & ";" & dwLanguage
|
||
|
|
||
|
|
||
|
'-------------------------------------------------
|
||
|
'Get Product Name from szInfoFile and Set
|
||
|
'-------------------------------------------------
|
||
|
|
||
|
|
||
|
szProductName = GetToken(szInfoFile, "ProductName")
|
||
|
If IsEmpty(szProductName) Then
|
||
|
Wscript.echo "ERROR: Error getting Product Name from " & szInfoFile
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
|
||
|
SummaryInfo.Property(2) = szProductName
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error setting productname property"
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
Wscript.echo " Updated Product Name to: " & szProductName
|
||
|
|
||
|
SummaryInfo.Persist
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error persisting summary info"
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
Wscript.echo " persisted summary stream"
|
||
|
|
||
|
|
||
|
SQL = "UPDATE Property SET Property.Value = '" & szProductName & "' WHERE Property.Property= 'ProductName'"
|
||
|
Set View = Database.OpenView(SQL)
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error executing view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
View.Execute
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error executing view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
Wscript.echo " ProductName Property updated"
|
||
|
|
||
|
|
||
|
|
||
|
'-------------------------------------------------
|
||
|
'Generate and set a new product code
|
||
|
'-------------------------------------------------
|
||
|
|
||
|
SQL = "UPDATE Property SET Property.Value = '" & MakeGuid() & "' WHERE Property.Property= 'ProductCode'"
|
||
|
Set View = Database.OpenView(SQL)
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error opening view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
View.Execute
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error executing view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
Wscript.echo " ProductCode Property updated"
|
||
|
|
||
|
'-------------------------------------------------
|
||
|
'set package Build
|
||
|
'-------------------------------------------------
|
||
|
|
||
|
SQL = "UPDATE Property SET Property.Value = '" & dwBuildNumber & "' WHERE Property.Property= 'PackageBuild'"
|
||
|
Set View = Database.OpenView(SQL)
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error opening view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
View.Execute
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error executing view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
Wscript.echo " PackageBuild Property updated"
|
||
|
|
||
|
'-------------------------------------------------
|
||
|
'Set the product language property
|
||
|
'-------------------------------------------------
|
||
|
|
||
|
SQL = "UPDATE Property SET Property.Value = '" & dwLanguage & "' WHERE Property.Property= 'ProductLanguage'"
|
||
|
Set View = Database.OpenView(SQL)
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error opening view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
View.Execute
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error executing view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
Wscript.echo " Product Language Property updated"
|
||
|
|
||
|
'-------------------------------------------------
|
||
|
'Set the product version property
|
||
|
'-------------------------------------------------
|
||
|
'
|
||
|
SQL = "UPDATE Property SET Property.Value = '5.1." & dwBuildNumber & ".0' WHERE Property.Property= 'ProductVersion'"
|
||
|
Set View = Database.OpenView(SQL)
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error opening view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
View.Execute
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error executing view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
Wscript.echo " ProductVersion Property updated"
|
||
|
|
||
|
'-------------------------------------------------
|
||
|
'Set the DialogCaption property
|
||
|
'-------------------------------------------------
|
||
|
'
|
||
|
|
||
|
szDialogCaption = GetToken(szInfoFile, "DialogCaption")
|
||
|
If IsEmpty(szDialogCaption) Then
|
||
|
Wscript.echo "ERROR: Error getting DialogCaption from " & szInfoFile
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
SQL = "UPDATE Property SET Property.Value = '" & szDialogCaption & "' WHERE Property.Property= 'DialogCaption'"
|
||
|
Set View = Database.OpenView(SQL)
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error opening view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
|
||
|
View.Execute
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error executing view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
Wscript.echo " DialogCaption Property updated"
|
||
|
|
||
|
'-------------------------------------------------
|
||
|
'Set the DiskPrompt property
|
||
|
'-------------------------------------------------
|
||
|
'
|
||
|
|
||
|
'szDiskPrompt = GetToken(szInfoFile, "DiskPrompt")
|
||
|
'If IsEmpty(szDiskPrompt) Then
|
||
|
' Wscript.echo "ERROR: Error getting DiskPrompt from " & szInfoFile
|
||
|
' UpdateOsPackage = -1
|
||
|
' Exit Function
|
||
|
'End If
|
||
|
'
|
||
|
'SQL = "UPDATE Property SET Property.Value = '" & szDiskPrompt & "' WHERE Property.Property= 'DiskPrompt'"
|
||
|
'Set View = Database.OpenView(SQL)
|
||
|
' If Err <> 0 Then
|
||
|
' Wscript.echo "ERROR: Error opening view: " & SQL
|
||
|
' UpdateOsPackage = -1
|
||
|
' Exit Function
|
||
|
'End If
|
||
|
|
||
|
'View.Execute
|
||
|
'If Err <> 0 Then
|
||
|
' Wscript.echo "ERROR: Error executing view: " & SQL
|
||
|
' UpdateOsPackage = -1
|
||
|
' Exit Function
|
||
|
'End If
|
||
|
'Wscript.echo " DiskPrompt Property updated"
|
||
|
|
||
|
|
||
|
'Commit changes
|
||
|
Database.Commit
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error commiting changes: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
Exit Function
|
||
|
End If
|
||
|
Wscript.echo " Changes commited"
|
||
|
|
||
|
End Function
|
||
|
|
||
|
|
||
|
' main()
|
||
|
|
||
|
Set Args = Wscript.Arguments
|
||
|
Set FileSystem = CreateObject("Scripting.FileSystemObject")
|
||
|
|
||
|
If Args.Count <> 5 Then
|
||
|
Usage
|
||
|
End If
|
||
|
|
||
|
szPathToPackage = Args(0)
|
||
|
If Not FileSystem.fileExists(szPathToPackage) Then
|
||
|
Wscript.echo " invalid path: " & szPathToPackage
|
||
|
Usage
|
||
|
End If
|
||
|
|
||
|
szPlatform = Args(1)
|
||
|
If (UCase(szPlatform) = "INTEL") Or (UCase(szPlatform) = "X86") Or (UCase(szPlatform) = "I386") Or (UCase(szPlatform) = "IA64") Then
|
||
|
szPlatform = "Intel"
|
||
|
ElseIf (UCase(szPlatform) = "ALPHA") Or (UCase(szPlatform) = "AXP64") Then
|
||
|
szPlatform = "Alpha"
|
||
|
Else
|
||
|
Wscript.echo " invalid pltform: " & szPlatform
|
||
|
Usage
|
||
|
End If
|
||
|
|
||
|
dwBuild = Args(2)
|
||
|
If Not IsNumeric(dwBuild) Then
|
||
|
Wscript.echo " invalid build number: " & dwBuild
|
||
|
Usage
|
||
|
End If
|
||
|
|
||
|
dwLang = Args(3)
|
||
|
If Not IsNumeric(dwLang) Then
|
||
|
If Not IsNumeric(IntFromHex(dwLang)) Then
|
||
|
Wscript.echo " invalid Language: " & dwLang
|
||
|
Usage
|
||
|
Else
|
||
|
dwLang = IntFromHex(dwLang)
|
||
|
End If
|
||
|
End If
|
||
|
|
||
|
szInfoFile = Args(4)
|
||
|
|
||
|
Wscript.echo szPathToPackage, szPlatform, Int(dwBuild), dwLang, szInfoFile
|
||
|
Status = UpdateOsPackage(szPathToPackage, szPlatform, Int(dwBuild), dwLang, szInfoFile)
|
||
|
Wscript.Quit Status
|
||
|
|
||
|
|