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