Automated Installation Framework
Mass software installation is generally done with imaging of machines. The process is simple: a reference image is created and then software is installed onto it. Along the way we test the software, QC check the software installation against our environment, then regression test the software against accounts that will be used by our users. Finally ‘sysprep the image’ and then push out a gigantic image to the all the PC’s in the field and cross our fingers.
Some software just does not want to be imaged, so we find ourselves reverse engineering the software to make it work; licensing is usually to blame. This can sometime take weeks because it breaks other functionality. Many times we simply don’t have the time to image a PC and go through the entire process or it may be something that’s just not worth the time. Bohack’s rule of thumb is: less than 40 PC’s in the same location just sit down and manually install!
However that doesn’t mean we need to give up on automation. So I wrote what I call the ‘Automated Installation Framework’. It’s a simple VBScript with common subroutines and often just saves time behind the keyboard. It uses a VB command called sendkeys and saves us from clicking next, next, next…
To use it I recommend using a ‘Vanilla’ install of your current environment; so use the image in place you will be installing to. Virtualization undo disks help speed this process up, because you will find that you will be installing over and over again for the perfect rollout. Next start practice installing the program, as you write the keystrokes down required moving the install through its steps. Keep track of the time it takes and estimate the time for the slowest computer you have. Next create a domain account that is a local administrator or domain admin for the machines you need to install to. Create a simple profile for the user and drop the finished VBScript into the profile’s startup section (base of the profile\Start Menu\Programs\Startup). Now all you need to do is login as that user and as the profile loads and the startup section runs, your install will begin. Cross your fingers and watch the install!
Just copy and paste the script below into notepad and save it as “rollout.vbs”
'rollout.vbs - Bohack 2008i
'main
'everything below main to wscript.quit can be deleted and is only included for example only.
'this will run the install program
run """\\server\share\program to install\install.exe"""
'this will let the install program start
sleep 5
'now lets send some keys to walk thru the install
send "n"
send "a"
send "~"
send "o"
send "~"
'lets wait 5 minutes for the install to complete
wait 15
send "t"
send "f"
'lets delete a folder that is created during install.
DeleteFolder "C:\Documents and Settings\All Users\Start Menu\Programs\some lame program"
'lets delete some registry keys
DeleteRegKey "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogon"
DeleteRegKey "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultPassword"
DeleteRegKey "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName"
'lets wait 5 seconds
sleep 5
'then shutdown
shutdown
'of course be kind and quit
wscript.quit
'----------------------------------------------------------------
'Quotes Inside of Quotes ex run """\\ral\apps\Unreal Tournament 2004\UT2004install.exe"""
'DeleteFolder - Deletes a folder and contents ex DeleteFolder "C:\junk"
'Sleep - Sleeps in seconds ex sleep 5
'Wait - waits in minutes ex wait 2
'LogOff - LogsOff session ex LogOff
'Shutdown - Shutsdown machine ex Shutdown
'Reboot - Reboots Machine ex Reboot
'Send - Sends a keystroke and waits 1 Second ex SendKey "T"
'Run - Runs a program but still processes ex Run "\\windows\system32\calc.exe"
'RunWait - Runs a program and waits for the process to end ex RunWait "\\windows\system32\calc.exe"
'RestartService - Restarts a service ex RestartService "wuauserv"
'StopService - Stops a service ex StopService "wuauserv"
'StartService - Starts a service ex StartService "wuauserv"
'FileExists - Checks to see if file exists ex If FileExists "c:\windows\test.txt" then something
'CreateFile - Creates a file ex CreateFile "c:\windows\test.txt"
'DeleteRegKey - Deletes a registry key ex DeleteRegKey ("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\PingID")
'----------------------------------------------------------------
Function Sleep (intSec)
intMSec = intSec * 1000
wscript.sleep intMSec
End Function
Function Wait (intMin)
intMSec = intMin * 60000
wscript.sleep intMSec
End Function
Function Run (strPath)
Set objShell = CreateObject("WScript.Shell")
objShell.Run strPath
Set objShell = Nothing
End Function
Function RunWait (strPath)
Set objShell = CreateObject("WScript.Shell")
objShell.Run strPath, 8, 1
Set objShell = Nothing
End Function
Function LogOff
Set objShell = CreateObject("WScript.Shell")
objShell.Run "C:\WINDOWS\system32\logoff.exe"
Set objShell = Nothing
End Function
Function Shutdown
Set objShell = CreateObject("WScript.Shell")
objShell.Run "C:\WINDOWS\system32\shutdown.exe -s -f -t 0"
Set objShell = Nothing
End Function
Function Reboot
Set objShell = CreateObject("WScript.Shell")
objShell.Run "C:\WINDOWS\system32\shutdown.exe -r -f -t 0"
Set objShell = Nothing
End Function
Function Send (strKey)
Set objShell = CreateObject("WScript.Shell")
objShell.SendKeys strKey
Set objShell = Nothing
sleep 1
End Function
Function DeleteFolder (strPath)
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(strPath) Then
objFSO.DeleteFolder strPath, 1
End If
Set objFSO = Nothing
End Function
Function RestartService(strService)
set objShell = CreateObject("Shell.Application")
If objShell.IsServiceRunning(strService) Then
objShell.ServiceStop strService, True
wscript.sleep 2000
objShell.ServiceStart strService, true
wscript.sleep 2000
End If
set objShell = Nothing
End Function
Function StopService(strService)
set objShell = CreateObject("Shell.Application")
If objShell.IsServiceRunning(strService) Then
objShell.ServiceStop strService, True
wscript.sleep 2000
End If
set objShell = Nothing
End Function
Function StartService(strService)
set objShell = CreateObject("Shell.Application")
If not objShell.IsServiceRunning(strService) Then
objShell.ServiceStart strService, True
wscript.sleep 2000
End If
set objShell = Nothing
End Function
Function FileExists(strFileName)
Set objFSO = CreateObject("Scripting.FileSystemObject")
FileExists = objFSO.FileExists(strFileName)
Set objFSO = Nothing
End Function
Function CreateFile(strFileName)
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CreateTextFile(strFileName)
Set objFSO = Nothing
End Function
Function  DeleteRegKey(strRegKey)
On Error Resume Next
Set objShell = CreateObject("WScript.Shell")
objShell.RegDelete(strRegKey)
Set objShell = Nothing
End Function