' Windows Installer utility to manage the summary information stream ' For use with Windows Scripting Host, CScript.exe or WScript.exe ' Copyright (c) Microsoft Corporation. All rights reserved. ' Demonstrates the use of the database summary information methods Option Explicit Const msiOpenDatabaseModeReadOnly = 0 Const msiOpenDatabaseModeTransact = 1 Const msiOpenDatabaseModeCreate = 3 Dim propList(19, 1) propList( 1,0) = "Codepage" : propList( 1,1) = "ANSI codepage of text strings in summary information only" propList( 2,0) = "Title" : propList( 2,1) = "Package type, e.g. Installation Database" propList( 3,0) = "Subject" : propList( 3,1) = "Product full name or description" propList( 4,0) = "Author" : propList( 4,1) = "Creator, typically vendor name" propList( 5,0) = "Keywords" : propList( 5,1) = "List of keywords for use by file browsers" propList( 6,0) = "Comments" : propList( 6,1) = "Description of purpose or use of package" propList( 7,0) = "Template" : propList( 7,1) = "Target system: Platform(s);Language(s)" propList( 8,0) = "LastAuthor" : propList( 8,1) = "Used for transforms only: New target: Platform(s);Language(s)" propList( 9,0) = "Revision" : propList( 9,1) = "Package code GUID, for transforms contains old and new info" propList(11,0) = "Printed" : propList(11,1) = "Date and time of installation image, same as Created if CD" propList(12,0) = "Created" : propList(12,1) = "Date and time of package creation" propList(13,0) = "Saved" : propList(13,1) = "Date and time of last package modification" propList(14,0) = "Pages" : propList(14,1) = "Minimum Windows Installer version required: Major * 100 + Minor" propList(15,0) = "Words" : propList(15,1) = "Source and Elevation flags: 1=short names, 2=compressed, 4=network image, 8=LUA package" propList(16,0) = "Characters" : propList(16,1) = "Used for transforms only: validation and error flags" propList(18,0) = "Application" : propList(18,1) = "Application associated with file, ""Windows Installer"" for MSI" propList(19,0) = "Security" : propList(19,1) = "0=Read/write 2=Readonly recommended 4=Readonly enforced" Dim iArg, iProp, property, value, message Dim argCount:argCount = Wscript.Arguments.Count If argCount > 0 Then If InStr(1, Wscript.Arguments(0), "?", vbTextCompare) > 0 Then argCount = 0 If (argCount = 0) Then message = "Windows Installer utility to manage summary information stream" &_ vbNewLine & " 1st argument is the path to the storage file (installer package)" &_ vbNewLine & " If no other arguments are supplied, summary properties will be listed" &_ vbNewLine & " Subsequent arguments are property=value pairs to be updated" &_ vbNewLine & " Either the numeric or the names below may be used for the property" &_ vbNewLine & " Date and time fields use current locale format, or ""Now"" or ""Date""" &_ vbNewLine & " Some properties have specific meaning for installer packages" For iProp = 1 To UBound(propList) property = propList(iProp, 0) If Not IsEmpty(property) Then message = message & vbNewLine & Right(" " & iProp, 2) & " " & property & " - " & propLIst(iProp, 1) End If Next message = message & vbNewLine & vbNewLine & "Copyright (C) Microsoft Corporation. All rights reserved." Wscript.Echo message Wscript.Quit 1 End If ' Connect to Windows Installer object On Error Resume Next Dim installer : Set installer = Nothing Set installer = Wscript.CreateObject("WindowsInstaller.Installer") : If CheckError("MSI.DLL not registered") Then Wscript.Quit 2 ' Evaluate command-line arguments and open summary information Dim cUpdate:cUpdate = 0 : If argCount > 1 Then cUpdate = 20 Dim sumInfo : Set sumInfo = installer.SummaryInformation(Wscript.Arguments(0), cUpdate) : If CheckError(Empty) Then Wscript.Quit 2 ' If only package name supplied, then list all properties in summary information stream If argCount = 1 Then For iProp = 1 to UBound(propList) value = sumInfo.Property(iProp) : CheckError(Empty) If Not IsEmpty(value) Then message = message & vbNewLine & Right(" " & iProp, 2) & " " & propList(iProp, 0) & " = " & value Next Wscript.Echo message Wscript.Quit 0 End If ' Process property settings, combining arguments if equal sign has spaces before or after it For iArg = 1 To argCount - 1 property = property & Wscript.Arguments(iArg) Dim iEquals:iEquals = InStr(1, property, "=", vbTextCompare) 'Must contain an equals sign followed by a value If iEquals > 0 And iEquals <> Len(property) Then value = Right(property, Len(property) - iEquals) property = Left(property, iEquals - 1) If IsNumeric(property) Then iProp = CLng(property) Else ' Lookup property name if numeric property ID not supplied For iProp = 1 To UBound(propList) If propList(iProp, 0) = property Then Exit For Next End If If iProp > UBound(propList) Then Wscript.Echo "Unknown summary property name: " & property sumInfo.Persist ' Note! must write even if error, else entire stream will be deleted Wscript.Quit 2 End If If iProp = 11 Or iProp = 12 Or iProp = 13 Then If UCase(value) = "NOW" Then value = Now If UCase(value) = "DATE" Then value = Date value = CDate(value) End If If iProp = 1 Or iProp = 14 Or iProp = 15 Or iProp = 16 Or iProp = 19 Then value = CLng(value) sumInfo.Property(iProp) = value : CheckError("Bad format for property value " & iProp) property = Empty End If Next If Not IsEmpty(property) Then Wscript.Echo "Arguments must be in the form: property=value " & property sumInfo.Persist ' Note! must write even if error, else entire stream will be deleted Wscript.Quit 2 End If ' Write new property set. Note! must write even if error, else entire stream will be deleted sumInfo.Persist : If CheckError("Error persisting summary property stream") Then Wscript.Quit 2 Wscript.Quit 0 Function CheckError(message) If Err = 0 Then Exit Function If IsEmpty(message) Then message = Err.Source & " " & Hex(Err) & ": " & Err.Description If Not installer Is Nothing Then Dim errRec : Set errRec = installer.LastErrorRecord If Not errRec Is Nothing Then message = message & vbNewLine & errRec.FormatText End If Wscript.Echo message CheckError = True Err.Clear End Function