'========================================================================== ' ' VBScript Source File -- Created with SAPIEN Technologies PrimalScript 2009 ' ' NAME: Installer script template V1.2 ' AUTHOR: Bas Steelooper , Steelooper Consulting ' DATE : 08-12-2009 ' ' COMMENT: This is the installer script template ' Create a foler to hold the install sources and this script ' Following folder structure: ' ' APPLICATION-XYZ ' |------ INSTALLATION-SOURCES ' | |--- .......... ' | ' \------ install_Template.vbs ' ' Modify the following functions to your needs ' parseCommandLineArguments ' If additional commandline options are required ' showHelp ' If additional commandline options are possible describe them here ' runTask ' The installtion tasks ' ' Start from SMS/SCCM with commandline "cscript install_Template.vbs [-debug] [logfolder]" ' ' Modifications ' V1.1 ' ADDED: ' uninstallAppGUID : Uninstall an application by its Identifier. ' Usefull when the Add Remove Programname is not unique ' MODIFIED: ' s_ForceUseCSCript : added variable forceCscriptSilent. ' If set to TRUE the script will NOT notify the end user that it is being relaunched ' s_ForceUseCSCript : WSHShell.run modified to hidden. ' When relaunched the script now doesn't show a cscript window. ' ' V1.2 ' ADDED: ' isApplicationInstalled : Check if an application is installed. ' isApplicationInstalledGUID : Check if an application is installed by its Identifier. ' Usefull when the Add Remove Programname is not unique ' isProcessActive : Check if a process is active. ' MODIFIED: ' uninstallAppGUID : Fixed the exit code to be unique. ' '========================================================================== '========================= '# Constants declaration # '========================= Const FILENAME = "install_Template.vbs" Const APPNAME = "Template-Installer" Const APPDESCRIPTION = "This is the installer script template" Const APPVER = "1.2" Const COPYYEAR = "2009" Const AUTHOR = "Bas Steelooper" Const COMPANYNAME = "Steelooper Consulting" 'constants for registry editing Const HKEY_CLASSES_ROOT = &H80000000 Const HKEY_CURRENT_USER = &H80000001 Const HKEY_LOCAL_MACHINE = &H80000002 Const HKEY_USERS = &H80000003 Const HKEY_PERFORMANCE_DATA = &H80000004 Const HKEY_CURRENT_CONFIG= &H80000005 Const HKEY_DYN_DATA = &H80000006 'constants for textfiles Const FORREADING = 1 Const FORWRITING = 2 Const FORAPPENDING = 8 'constants for eventlog Const SUCCESS = 0 Const ERRORL = 1 Const WARNING = 2 Const INFORMATION = 4 'constants for disk access Const HARD_DISK = 3 Const CONVERT_GB = 1073741824 'Constants for MSI const msiUILevelNoChange = 0 'Does not change UI level. const msiUILevelDefault = 1 'Uses default UI level. const msiUILevelNone = 2 'Silent installation. const msiUILevelBasic = 3 'Simple progress and error handling. const msiUILevelReduced = 4 'Authored UI and wizard dialog boxes suppressed. const msiUILevelFull = 5 'Authored UI with wizards, progress, and errors. const msiUILevelHideCancel = 32 'If combined with the msiUILevelBasic value, the installer shows progress dialog boxes but does not display a Cancel button on the dialog box to prevent users from canceling the installation. const msiUILevelProgressOnly = 64 'If combined with the msiUILevelBasic value, the installer displays progress dialog boxes but does not display any modal dialog boxes or error dialog boxes. const msiUILevelEndDialog = 128 'If combined with any above value, the installer displays a modal dialog box at the end of a successful installation or if there has been an error. No dialog box is displayed if the user cancels. '========================= '# Variables declaration # '========================= Dim WshShell, scriptPath, objWMI, objProcess, objFSO, strPath Dim hostname, logFile ,debug '========================= '# Object initialization # '========================= set WshShell = CreateObject("WScript.Shell") Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set objFSO = CreateObject("Scripting.FileSystemObject") Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") hostname = WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%") '============================= '# Determine script location # '============================= scriptPath = left(Wscript.scriptFullName, (len(Wscript.scriptFullName) - len(WScript.ScriptName))) '============================================================= '#Check if script is invoked by cscript engine, force if not # '============================================================= Const forceCscriptSilent = False s_ForceUseCScript '================================================================ '# Parse the commandline parameters and start the actual script # '================================================================ parseCommandLineArguments '========================= '# Functions declaration # '========================= Sub parseCommandLineArguments () '==================================================================== '# Purpose : Parse the command line parameters # '# Input : # '==================================================================== Dim noUninstall, onlyProof, noProof, logFolder debug = False logFolder = WshShell.ExpandEnvironmentStrings("%SystemRoot%") & "\temp\" For Each argument In WScript.Arguments Select Case argument Case "-debug" debug = True Case Else If StrComp(Right(argument,1), "\") <> 0 Then logFolder = argument & "\" End If If Not objFSO.FolderExists( logFolder ) Then WScript.Quit(80040005) End If End Select Next On Error Resume Next Set logFile = objFSO.CreateTextFile(logfolder & hostname & "-" & APPNAME &"-trace.log", FORAPPENDING, True) If Err.Number = 70 Or Err.Number = 46 Then WScript.Echo "not running as administrator....." logfolder = WshShell.ExpandEnvironmentStrings("%temp%") & "\" WScript.Echo logfolder Set logFile = objFSO.CreateTextFile(logfolder & hostname & "-" & APPNAME &"-trace.log", FORAPPENDING, True) writeLog "LogfileError", "ERROR|Not running as administrator", "parseCommandLineArguments" End If On Error GoTo 0 '=================== '# Show the banner # '=================== scriptBanner '====================== '# Show the Help info # '====================== showHelp '====================================================== '# Start the main app # '# if additional arguments are possible add them here # '====================================================== Call runTask( ) '====================== '# Cleanup and exit # '====================== 'Close the logfile logFile.Close 'quit with exitcode 0 WScript.quit 'quit with exitcode 3010 (For SCCM if reboot is required) WScript.quit(3010) End Sub Sub showHelp() '=============================================================================== '# Purpose : show help information on how to use the script # '=============================================================================== wscript.echo "usage: cscript " & FILENAME & " [-debug] [-nouninstall] [-onlyproof] [logfolder]" wscript.echo vbTab & "-debug" & vbTab & vbTab & "Show debug information" wscript.echo vbTab & "logfolder" & vbTab & "Alterantive logfolder" wscript.echo vbTab & "Default logfolder is c:\windows\temp" WScript.Echo "" WScript.Echo "Possible error codes: " If debug Then WScript.Echo vbTab & "66600001" & vbTab & " : patchApp is called without information" WScript.Echo vbTab & "66600002" & vbTab & " : installApp is called without information" WScript.Echo vbTab & "66600003" & vbTab & " : killProcesses is called without information" WScript.Echo vbTab & "66600004" & vbTab & " : uninstallApp is called without information" WScript.Echo vbTab & "66600005" & vbTab & " : uninstallAppGUID is called without information" WScript.Echo vbTab & "66600006" & vbTab & " : isProcessActive is called without information" WScript.Echo vbTab & "66600007" & vbTab & " : isApplicationInstalled is called without information" WScript.Echo vbTab & "66600008" & vbTab & " : isApplicationInstalledGUID is called without information" End If WScript.Echo vbTab & "80040005" & vbTab & " : Logfolder not accessible" WScript.Echo "" WScript.Echo "To see the returncode you start the script form a command prompt" Wscript.Echo "and issue the command:" WScript.Echo vbTab & "echo %errorlevel%" End Sub Sub runTask( ) '============================================================================================================================== '# purpose : the actual script to run. # '============================================================================================================================== writeLog "start Runtask", "runTask started with the following parramenters " & _ "*debug = " & debug, "runtask" Dim arrRemoveApps, arrKillProcesses, strDiskSize, strKeyPath, strValueName, strValue, strCMD, dwordValue '=================================================== '# Optional: Not in use with SCCM # '# Disckspace check for use when not in SMS / SCCM # '=================================================== Set objLogicalDisk = objWMI.Get("Win32_LogicalDisk.DeviceID='c:'") strDiskSize = (objLogicalDisk.FreeSpace / CONVERT_GB) If strDiskSize < 2 Then writeLog "checkDiskSize", "ERROR : Disksize is less than required. Why am I running???" & _ " If I am not started from SCCM this line should be changed." & _ " If run from SMS/SCCM the minimal disc requirement must be set!!!!", "runtask" 'Solve in SMS / SCCM When not in SMS / SCCM uncomment the following line 'wscript.Quit(666) End If '=========================================== '# Kill some Running processes if required # '=========================================== arrKillProcesses = Array("dummy123","dummy234","dummy567") killProcesses objWMI, arrKillProcesses '=============================================== '# Uninstalling some obsolete applications # '=============================================== 'By application name from Add Remove Programs arrRemoveApps = Array("Dummy123", "Dummy234", "Dummy456") uninstallApp objWMI, arrRemoveApps 'By GUID (Product ID) arrRemoveApps = Array("{34E9AA45-3D13-4DBD-8BC9-7F06AB39B090}", "{34666A45-3D13-4DBD-8BC9-7F0612345690}") uninstallAppGUID objWMI, arrRemoveApps '============================================ '# Installing the application by executable # '============================================ writeLog "startInstall","Starting installation of Application XYZ", "runtask" strCMD = scriptPath & "APPLICATIONSOURCE\setup.exe" WshShell.Run strCMD, 2, True '========================================== '# Installing the application by msi file # '========================================== 'With an MST file installApp "APPLICATION-SOURCES\myapp.msi", "APPLICATIONSOURCE\myapp.mst", "LAUNCHEDBYSETUPEXE=1" 'Without an MST file installApp "APPLICATION-SOURCES\myapp.msi", "", "LAUNCHEDBYSETUPEXE=1" 'Without properties installApp "APPLICATION-SOURCES\myapp.msi", "APPLICATIONSOURCE\myapp.mst", "" '========================================== '# Patch the application With an msp file # '========================================== 'With properties patchApp "APPLICATIONSOURCE\myapp.msp", "MYPROPERTIE=TRUE" 'Without properties patchApp "APPLICATIONSOURCE\myapp.msp", "" '======================================== '# Remove legacy folder from Start Menu # '======================================== strPath = WshShell.ExpandEnvironmentStrings("%ALLUSERSPROFILE%")&"\Start Menu\Programs\" & "My Dummy String" If objFSO.FolderExists (strPath) Then writeLog "delete folder","Deleting the obsolete folder", "runtask" objFSO.DeleteFolder(strPath) End If '=================================== '# Write something To the registry # '=================================== strKeyPath = "SOFTWARE\Getronics\Consulting" strValueName = "Bas" strValue = "Steelooper" dwordValue = "2009" 'Write an String value oReg.SetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue 'Write an DWord value oReg.SetDwordValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, dwordValue '==================================== '# Read something from the registry # '==================================== strKeyPath = "SOFTWARE\Getronics\Consulting" strValueName = "Bas" strValue = "" dwordValue = "" 'Read an String value into strValue oReg.getStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue 'Read an DWord value into dwordValue oReg.getDwordValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, dwordValue '========================================= '# Finished processing all install tasks # '========================================= writeLog "Finished runTask","Finished processing the runtask sequence", "runtask" End Sub Function isProcessActive(objWMIService, arrProcName) '============================================================================================================================== '# purpose : check if the processes passed to this service are active # '# input : objWMIService : initialised object from GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") # '# arrProcName : Array which contains the names of the processes to be checked # '# String which contains one name of a process to be checked # '# # '# Example: arrProcName = Array("outlook", "communicator", "winword", "excel", "powerpnt", "access") # '# isProcessActive objWMI, arrProcName # '============================================================================================================================== writeLog "starting isProcessActive", "Starting isProcessActive", "isProcessActive" Dim colProcesses, strQuery, procName, first strQuery = "Select * from Win32_Process where " first = True If IsArray( arrProcName ) Then For Each procName In arrProcName If Not first Then strQuery = strQuery & "OR " End If strQuery = strQuery & "Name Like '%"& procName &"%' " first = false Next Else If arrProcName = "" Then writeLog "ERROR isProcessActive", "ERROR - Started isProcessActive with no Process te check " & _ "- Terminiting script now with errorcode 66600006", "isProcessActive" WScript.Quit (66600006) Else strQuery = strQuery & "Name Like '%"& arrProcName &"%' " End if End If Set colProcesses = objWMIService.ExecQuery(strQuery) Dim Process isProcessActive = False For Each Process In colProcesses isProcessActive = True Next End Function Private Sub uninstallApp( objWMIService, arrAppName ) '============================================================================================================================== '# purpose : uninstall the applications which are given in the input # '# input : objWMIService : initialised object from GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") # '# arrAppName : Array which contains the names of the applications to be uninstalled # '# String which contains one name of a applications to be uninstalled # '# # '# Example: arrRemoveApps = Array("Office 2003 Proofing", "Microsoft Office Proof", "visio viewer") # '# uninstallApp objWMI, arrRemoveApps # '============================================================================================================================== writeLog "starting uninstallApp","starting to run the sub uninstallApp", "uninstallApp" Dim colSoftware, objSoftware, strQuery, first, strAppName strQuery = "Select * from Win32_Product Where " first = True on error resume next If IsArray( arrAppName ) Then For Each strAppName In arrAppName If Not first Then strQuery = strQuery & "OR " End If strQuery = strQuery & "Name Like '%"& strAppName &"%' " first = false Next Else If arrAppName = "" Then writeLog "ERROR UNINSTALL","Error uninstalling because no parameter was set. exiting with errorcode 66600004", "uninstallApp" WScript.Quit (66600004) End if strQuery = strQuery & "Name Like '%"& arrAppName &"%' " End If Set colSoftware = objWMIService.ExecQuery (strQuery) For Each objSoftware in colSoftware writeLog "uninstalling","Now uninstalling " & objSoftware.Name, "uninstallApp" objSoftware.Uninstall() Next on error goto 0 End Sub Private Sub uninstallAppGUID( objWMIService, arrAppName ) '============================================================================================================================== '# purpose : uninstall the applications which are given in the input # '# input : objWMIService : initialised object from GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") # '# arrAppName : Array which contains the names of the applications to be uninstalled # '# String which contains one name of a applications to be uninstalled # '# # '# Example: arrRemoveApps = Array("{34E9AA45-3D13-4DBD-8BC9-7F06AB39B090}", "{34666A45-3D13-4DBD-8BC9-7F0612345690}") # '# uninstallAppGUID objWMI, arrRemoveApps # '============================================================================================================================== writeLog "starting uninstallApp","starting to run the sub uninstallApp", "uninstallApp" Dim colSoftware, objSoftware, strQuery, first, strAppName strQuery = "Select * from Win32_Product Where " first = True If IsArray( arrAppName ) Then For Each strAppName In arrAppName If Not first Then strQuery = strQuery & "OR " End If strQuery = strQuery & "IdentifyingNumber = '%"& strAppName &"%' " first = false Next Else If arrAppName = "" Then writeLog "ERROR UNINSTALL","Error uninstalling because no parameter was set. exiting with errorcode 66600005", "uninstallAppGUID" WScript.Quit (66600005) End if strQuery = strQuery & "IdentifyingNumber = '%"& arrAppName &"%' " End If Set colSoftware = objWMIService.ExecQuery (strQuery) on error resume next For Each objSoftware in colSoftware writeLog "uninstalling","Now uninstalling " & objSoftware.Name, "uninstallApp" objSoftware.Uninstall() Next on error goto 0 End Sub Private Function isApplicationInstalled( objWMIService, arrAppName ) '============================================================================================================================== '# purpose : check if the applications which are given in the input are installed # '# input : objWMIService : initialised object from GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") # '# arrAppName : Array which contains the names of the applications to be checked # '# String which contains one name of a applications to be checked # '# # '# Example: arrCheckAppName = Array("Office 2003 Proofing", "Microsoft Office Proof", "visio viewer") # '# isApplicationInstalled objWMI, arrCheckAppName # '============================================================================================================================== writeLog "starting isApplicationInstalled","starting to run the sub isApplicationInstalled", "isApplicationInstalled" Dim colSoftware, objSoftware, strQuery, first, strAppName strQuery = "Select * from Win32_Product Where " first = True on error resume next If IsArray( arrAppName ) Then For Each strAppName In arrAppName If Not first Then strQuery = strQuery & "OR " End If strQuery = strQuery & "Name Like '%"& strAppName &"%' " first = false Next Else If arrAppName = "" Then writeLog "ERROR CHECK","Error checking because no parameter was set. exiting with errorcode 66600007", "isApplicationInstalled" WScript.Quit (66600007) End if strQuery = strQuery & "Name Like '%"& arrAppName &"%' " End If Set colSoftware = objWMIService.ExecQuery (strQuery) on error resume next isApplicationInstalled = False For Each objSoftware in colSoftware writeLog "checking application","Now checking " & objSoftware.Name, "isApplicationInstalled" isApplicationInstalled = True Next on error goto 0 End Function Private Function isApplicationInstalledGUID( objWMIService, arrAppName ) '============================================================================================================================== '# purpose : check if the applications which are given in the input are installed # '# input : objWMIService : initialised object from GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") # '# arrAppName : Array which contains the names of the applications to be checked # '# String which contains one name of a applications to be checked # '# # '# Example: arrCheckAppName = Array("{34E9AA45-3D13-4DBD-8BC9-7F06AB39B090}", "{34666A45-3D13-4DBD-8BC9-7F0612345690}") # '# isApplicationInstalledGUID objWMI, arrCheckAppName # '============================================================================================================================== writeLog "starting isApplicationInstalledGUID","starting to run the sub isApplicationInstalledGUID", "isApplicationInstalledGUID" Dim colSoftware, objSoftware, strQuery, first, strAppName strQuery = "Select * from Win32_Product Where " first = True If IsArray( arrAppName ) Then For Each strAppName In arrAppName If Not first Then strQuery = strQuery & "OR " End If strQuery = strQuery & "IdentifyingNumber = '%"& strAppName &"%' " first = false Next Else If arrAppName = "" Then writeLog "ERROR CHECK","Error checking because no parameter was set. exiting with errorcode 66600008", "isApplicationInstalledGUID" WScript.Quit (66600008) End if strQuery = strQuery & "IdentifyingNumber = '%"& arrAppName &"%' " End If Set colSoftware = objWMIService.ExecQuery (strQuery) on error resume next isApplicationInstalled = False For Each objSoftware in colSoftware writeLog "checking application","Now checking " & objSoftware.Name, "isApplicationInstalledGUID" isApplicationInstalled = True Next on error goto 0 End Function Private Sub killProcesses ( objWMIService, arrKillProc ) '============================================================================================================================== '# purpose : kill the processes which are passed to the function # '# input : objWMIService : initialised object from GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") # '# arrKillProc : Array which contains the names of the processes to be terminated # '# String which contains one name of a process to be terminated # '# # '# Example: arrKillProcesses = Array("outlook", "communicator", "winword", "excel", "powerpnt", "access") # '# killProcesses objWMI, arrKillProcesses # '============================================================================================================================== writeLog "starting killProcesses", "Starting killProcesses", "killProcesses" Dim colSoftware, objSoftware, strQuery, first, procName strQuery = "Select * from Win32_Process where " first = True If IsArray( arrKillProc ) Then For Each procName In arrKillProc If Not first Then strQuery = strQuery & "OR " End If strQuery = strQuery & "Name Like '%"& procName &"%' " first = false Next Else If arrKillProc = "" Then writeLog "ERROR killProcesses", "ERROR - Started killProcesses with no Process te kill " & _ "- Terminiting script now with errorcode 66600003", "killProcesses" WScript.Quit (66600003) Else strQuery = strQuery & "Name Like '%"& procName &"%' " End if End If Set colProcess = objWMIService.ExecQuery (strQuery) For Each objProcess in colProcess writeLog "running killProcesses", "Killing process : " & objProcess.name, "killProcesses" objProcess.Terminate() Next End Sub Private Sub installApp( strMSI, strMST, properties ) '========================================================================================================================== '# purpose : Install an application by directly using the Windows Installer API instead of using msiexec # '# input : strMSI : path to the msi file to install located in a subfolder of this scriptfile # '# strMST : path to the mst file used transform the install located in a subfolder of this scriptfile # '# properties : String containing additional properties to pass on to the installation # '# Standard the following are added ALLUSERS=TRUE REBOOT=REALLYSUPPRESS # '# ALLUSERS=TRUE > if the application is scripted per user. this will install for all users # '# REBOOT=REALLYSUPPRESS > Make sure that the installation will not reboot the machine # '# # '# Example: installApp "ProofingExtra\PROOF_DE\Proof.msi", "ProofingExtra\PROOF_DE\Proof.mst", "LAUNCHEDBYSETUPEXE=1" # '========================================================================================================================== writeLog "starting installApp","starting to run the sub installApp", "installApp" If IsEmpty(strMSI) Or strMSI = "" Then writeLog "ERROR INSTALL","Error installing because no msi parameter was set. exiting with errorcode 66600002", "installApp" WScript.Quit(66600002) End if Dim objInstaller set objInstaller = createobject("WindowsInstaller.Installer") objInstaller.uilevel = msiUILevelNone If strMST <> "" then writeLog "Start installation","starting the installation of MSI File: '" & strMSI & "' with Transform file : '" & strMST & "'", "installApp" writeLog "Start installation","Applying the properties: 'ALLUSERS=TRUE REBOOT=REALLYSUPPRESS " & strMST & "'", "installApp" objInstaller.InstallProduct scriptPath & strMSI, "TRANSFORMS=" & scriptPath & strMST & " ALLUSERS=TRUE REBOOT=REALLYSUPPRESS " & properties Else writeLog "Start installation","starting the installation of MSI File: " & strMSI, "installApp" writeLog "Start installation","Applying the properties: 'ALLUSERS=TRUE REBOOT=REALLYSUPPRESS " & strMST & "'", "installApp" objInstaller.InstallProduct scriptPath & strMSI, "ALLUSERS=TRUE REBOOT=REALLYSUPPRESS " & properties End If writeLog "Finished installation","Finished the installation of MSI : '" & strMSI & "'", "installApp" End Sub Private Sub patchApp( strMSP, properties ) '==================================================================================================================== '# purpose : Patch an application by directlu using the Windows Installer API instead of using msiexec # '# input : strMSP : path to the msp file to install located in a subfolder of this scriptfile # '# properties : String containing additional properties to pass on to the installation # '# Standard the following are added REBOOT=REALLYSUPPRESS # '# REBOOT=REALLYSUPPRESS > Make sure that the installation will not reboot the machine # '# # '# Example : patchApp "ProofingExtra\SP2\proofsp2-de-de.msp", "" # '==================================================================================================================== writeLog "starting patchApp","starting to run the sub patchApp", "patchApp" If IsEmpty(strMSP) Or strMSP = "" Then writeLog "ERROR PATCHING","Error patching because no msp parameter was set. exiting with errorcode 66600001", "patchApp" WScript.Quit(66600001) End If Dim objInstaller Set objInstaller = createobject("WindowsInstaller.Installer") objInstaller.uilevel = msiUILevelNone writeLog "Start installation","starting the installation of MSP File: " & strMSP, "patchApp" writeLog "Start installation","Applying the properties: 'REBOOT=REALLYSUPPRESS " & strMST & "'", "patchApp" objInstaller.ApplyPatch scriptPath & strMSP, "", 0, " REBOOT=REALLYSUPPRESS " & properties writeLog "Finished installation","Finished the installation of MSP : '" & strMSP & "'", "patchApp" End Sub Sub s_Error(i,s) '======================================================================== '# Purpose : Show errors generated by engine and abort script operation # '# Input : i : err.number (integer) # '# s : err.description (string) # '======================================================================== wscript.echo "ERROR!" wscript.echo "The error code was : " & i wscript.echo "The error code in hex : " & Hex(i) wscript.echo "The error description : " & s wscript.quit End Sub Sub writeLog(strEvent, strDescription, strLocation ) '==================================================================== '# Purpose : Write logging to a file. # '# Input : strEvent : The event to log to file # '# strDescription : The description to log to file # '# strLocation : the location where the logging came from # '==================================================================== Dim strDate, strTime strDate = parsedigits(DAY(date()),2) & "-" & _ parsedigits(MONTH(date()),2) & "-" & _ parsedigits(YEAR(date()),2) strTime = parsedigits(Hour(Now),2) & ":" & _ parsedigits(minute(Now),2) & ":" & _ parsedigits(Second(Now),2) logFile.WriteLine(strTime & "|" & strDate & "|" & strLocation & "|" & strEvent & "|" & strDescription) if debug then wscript.echo(strTime & "|" & strDate & "|" & strLocation & "|" & strEvent & "|" & strDescription) End Sub Sub scriptBanner() '==================================================================== '# Purpose : show the banner and copyright of the script # '# Input : # '==================================================================== wscript.echo APPNAME & " - " & APPDESCRIPTION & "." wscript.echo "Copyright (c) " & COPYYEAR & " - " & COMPANYNAME & " - " & AUTHOR wscript.echo "" writeLog "APPNAME", APPNAME & " - " & APPDESCRIPTION & ".", "scriptBanner" writeLog "APPNAME", "Copyright (c) " & COPYYEAR & " - " & COMPANYNAME & " - " & AUTHOR, "scriptBanner" writeLog "", "", "" End Sub Function parsedigits(valuetoparse, totalDigits) '==================================================================== '# Purpose : Return a value which is the number of digits required # '# Input : valuetoparse : The values which must be parsed # '# totalDigits : The number of digits required to fill # '# # '# example : parsedigits(2,2) returns 02 # '# parsedigits(2,1) returns 2 # '# parsedigits(2,3) returns 002 # '==================================================================== if totalDigits > len(valuetoparse) then parsedigits = String(totalDigits-len(valuetoparse),"0") & valuetoparse else parsedigits = valuetoparse end if End Function Sub s_ForceUseCScript() '******************************************** ' Purpose: Force script to use cscript engine '******************************************** dim strScriptEngine, exitcode strScriptEngine = Right(WScript.FullName,len(WScript.FullName) - instrrev(WScript.FullName,"\")) If Not LCase(strScriptEngine) = "cscript.exe" And Not LCase(strScriptEngine) = "primalhost.dll" Then If Not forceCscriptSilent Then WshShell.Popup "Script is not invoked uder cscript engine. Relaunching under cscript...",5,"WSCRIPT" End If dim strArguments strArguments = "" For Each arg In WScript.Arguments If arg & "\" <> scriptPath Then strArguments = strArguments & " " & arg Next exitcode = WshShell.Run( "cmd.exe /C " & WshShell.ExpandEnvironmentStrings("%SystemRoot%") & "\system32\cscript.exe //NOLOGO " & Chr(34) & WScript.scriptFullName & Chr(34) & strArguments, 0, True) WScript.Quit(exitcode) End If End Sub 'GENERIC INFORMATION 'REGISTRY 'Initialise registry ' sComputer = "." '(Localhost) ' Set oRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}//" & _ ' sComputer & "/root/default:StdRegProv") 'Functions for registry editing ' GetBinaryValue - reads regisry value of BINARY type ' GetDWORDValue - reads registry value of DWORD type ' GetExpandedStringValue - reads registry value of EXPANDED STRING type ' GetMultiStringValue - reads registry value of MULTI STRING type ' GetStringValue - reads registry value of STRING type ' CreateKey - creates registry key ' SetBinaryValue - writes registry value of BINARY type ' SetDWORDValue - writes registry value of DWORD type ' SetExpandedStringValue - writes registry value of EXPANDED STRING type ' SetMultiStringValue - writes registry value of MULTI STRING type ' SetStringValue - writes registry value of STRING type ' DeleteKey - deletes registry key ' DeleteValue - deleting registry value ' EnumKey - enumerates registry key ' EnumValues - enumerates registry value ' CheckAccess - checks permissions on registry key 'WINDOWS INSTALLER 'initialise Windows Installer ' Set objInstaller = createobject("WindowsInstaller.Installer") 'Functions for Windows Installer Object ' AddSource - Adds a source to the list of valid network sources in the sourcelist. ' AdvertiseProduct - Advertises an installation package. ' AdvertiseScript - Advertises an installation package. ' ApplyPatch - Invokes an installation and sets the PATCH property to the path of the patch package for each product listed by the patch package as eligible to receive the patch. ' ApplyMultiplePatches - Applies one or more patches to products eligible to receive the patch. Sets the PATCH property to the path of the patch packages provided. ' ClearSourceList - Removes all network sources from the sourcelist. ' CollectUserInfo - Invokes a user interface wizard sequence that collects and stores both user information and the product code. ' ConfigureFeature - Configures the installed state of a product feature. ' ConfigureProduct - Installs or uninstalls a product. ' CreateAdvertiseScript - Generates an advertise script. ' CreateRecord - Returns a new Record object with the requested number of fields. ' EnableLog - Enables logging of the selected message type for all subsequent installation sessions in the current process space. ' ExtractPatchXMLData - Extracts information from a patch as an XML string. ' FileHash - Takes the path to a file and returns a 128-bit hash of that file. ' FileSignatureInfo - Takes the path to a file and returns a SAFEARRAY of bytes that represents the hash or the encoded certificate. ' FileSize - Returns the size of the specified file. ' FileVersion - Returns the version string or language string of the specified path. ' ForceSourceListResolution - Forces the installer to search the source list for a valid product source the next time a source is required. ' InstallProduct - Opens an installer package and initializes an installation session. ' LastErrorRecord - Returns a Record object that contains error parameters for the most recent error from the function that produced the error record. ' OpenDatabase - Opens an existing database or creates a new one. ' OpenPackage - Opens an installer package for use with functions that access the product database and install engine. ' OpenProduct - Opens an installer package for an installed product using the product code. ' ProvideAssembly - Returns the installed path of an assembly. ' ProvideComponent - Returns the full component path and performs any necessary installation. ' ProvideQualifiedComponent - Returns the full component path and performs any necessary installation. ' RegistryValue - Reads information about a specified registry key of value. ' ReinstallFeature - Reinstalls features or corrects problems with installed features. ' ReinstallProduct - Reinstalls a product or corrects installation problems in an installed product. ' RemovePatches - Removes one or more patches to products eligible to receive the patch. ' UseFeature - Increments the usage count for a particular feature and returns the installation state for that feature. 'Properties for Windows Installer Object ' ClientsEx - Read-only - Returns a RecordList object that lists products that use a specified installed component. ' Windows Installer 4.5 and earlier: Not supported. ' ComponentClients - Read-only - Returns a StringList object enumerating the set of clients of a specified component. ' ComponentPath - Read-only - Returns the full path to an installed component. ' ComponentPathEx - Read-only - Returns a RecordList object that gives the full path of a specified installed component. ' Windows Installer 4.5 and earlier: Not supported. ' ComponentQualifiers - Read-only - Returns a StringList object enumerating the set of registered qualifiers for the specified component. ' Components - Read-only - Returns a StringList object enumerating the set of installed components for all products. ' ComponentsEx - Read-only - Returns a RecordList object that lists installed components. ' Windows Installer 4.5 and earlier: Not supported. ' Environment - Read-only - The string value for an environment variable of the current process. ' FeatureParent - Read-only - Specifies the parent feature of a feature. ' Features - Read-only - Returns a StringList object enumerating the set of published features for the specified product. ' FeatureState - Read-only - Returns the installed state of a feature. ' FeatureUsageCount - Read-only - Returns the number of times that the feature has been used. ' FeatureUsageDate - Read-only - Returns the date that the specified feature was last used. ' FileAttributes - Read-only - Returns a number that represents the combined file attributes for the designated path to a file or folder. ' Patches - Read-only - Returns a StringList object that contains all the patches applied to the product. ' PatchesEx - Read-only - Enumerates a collection of Patch objects. ' PatchFiles - Read-only - Returns a StringList object that contains a list of files that can be updated by the provided list of patches. ' PatchInfo - Read-only - Returns information about a patch. ' PatchTransforms - Read-only - Returns the semicolon delimited list of transforms that are in the specified patch package and applied to the specified product. ' ProductElevated - Read-only - Returns True if the product is managed or False if the product is not managed. ' ProductInfo - Read-only - Returns the value of the specified attribute for an installed or published product. ' ProductInfoFromScript - Read-only - Returns the value of the specified attribute that is stored in an advertise script. ' Products - Read-only - Returns a StringList object enumerating the set of all products installed or advertised for the current user and machine. ' ProductsEx - Read-only - Enumerates a collection of Product objects. ' ProductState - Read-only - Returns the install state information for a product. ' QualifierDescription - Read-only - Returns a text string that describes the qualified component. ' RelatedProducts - Read-only - Returns a StringList object enumerating the set of all products installed or advertised for the current user and machine with a specified UpgradeCode property in their property table. ' ShortcutTarget - Read-only - Examines a shortcut and returns its product, feature name and component if available. ' SummaryInformation - Read-only - Returns a SummaryInfo object that can be used to examine, update and add properties to the summary information stream of a package or transform. ' UILevel - Read-Write - Indicates the type of user interface to be used when opening and processing subsequent packages within the current process space. ' Version - Read-only - Returns the string representation of the current version of Windows Installer