265 lines
8 KiB
Plaintext
265 lines
8 KiB
Plaintext
|
'
|
||
|
' Script to update OS install MSI package
|
||
|
' Syntax: cscript OsPack.vbs package_path platform build_number language_number
|
||
|
'
|
||
|
'
|
||
|
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.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
|
||
|
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, True)
|
||
|
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
|
||
|
|
||
|
|
||
|
|
||
|
'
|
||
|
' 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 )
|
||
|
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
|
||
|
On Error Resume Next
|
||
|
|
||
|
'Create the MSI API object
|
||
|
Set Installer = CreateObject("WindowsInstaller.Installer")
|
||
|
If Err <> 0 Then
|
||
|
Set Installer = CreateObject("WindowsInstaller.Application")
|
||
|
End If
|
||
|
If Err <> 0 Then
|
||
|
Set Installer = CreateObject("Msi.ApiAutomation")
|
||
|
End if
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error creating Installer object"
|
||
|
UpdateOsPackage = -1
|
||
|
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
|
||
|
End if
|
||
|
|
||
|
'Open the package
|
||
|
Set Database = Installer.OpenDatabase(szPackage, 1)
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error opening database"
|
||
|
UpdateOsPackage = -1
|
||
|
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
|
||
|
End if
|
||
|
|
||
|
SummaryInfo.Property(9) = MakeGuid()
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error setting package code"
|
||
|
UpdateOsPackage = -1
|
||
|
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 langusge list"
|
||
|
UpdateOsPackage = -1
|
||
|
End if
|
||
|
|
||
|
Wscript.echo " Updated Language and platform list to: " & szPlatform & ";" & dwLanguage
|
||
|
|
||
|
SummaryInfo.Persist
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error persisting summary info"
|
||
|
UpdateOsPackage = -1
|
||
|
End if
|
||
|
Wscript.echo " persisted summary stream"
|
||
|
|
||
|
'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
|
||
|
End if
|
||
|
|
||
|
View.Execute
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error executing view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
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
|
||
|
End if
|
||
|
|
||
|
View.Execute
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error executing view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
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
|
||
|
End if
|
||
|
|
||
|
View.Execute
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error executing view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
End if
|
||
|
Wscript.echo " Product Language Property updated"
|
||
|
|
||
|
'Set the product version property
|
||
|
SQL = "UPDATE Property SET Property.Value = '5.0." & dwBuildNumber & ".0' WHERE Property.Property= 'ProductVersion'"
|
||
|
Set View = Database.OpenView( SQL )
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error opening view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
End if
|
||
|
|
||
|
View.Execute
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error executing view: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
End if
|
||
|
Wscript.echo " ProductVersion Property updated"
|
||
|
|
||
|
'Commit changes
|
||
|
Database.Commit
|
||
|
If Err <> 0 Then
|
||
|
Wscript.echo "ERROR: Error commiting changes: " & SQL
|
||
|
UpdateOsPackage = -1
|
||
|
End if
|
||
|
Wscript.echo " Changes commited"
|
||
|
|
||
|
End Function
|
||
|
|
||
|
|
||
|
' main()
|
||
|
Set Args = Wscript.Arguments
|
||
|
Set FileSystem = CreateObject("Scripting.FileSystemObject")
|
||
|
|
||
|
If Args.Count <> 4 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
|
||
|
|
||
|
wscript.echo szPathToPackage, szPlatform, Int( dwBuild ), dwLang
|
||
|
status = UpdateOsPackage( szPathToPackage, szPlatform, Int( dwBuild ), dwLang )
|
||
|
Wscript.Quit status
|