Deploying Internet Explorer 11 … the proper way
Microsoft recommends using IEAK to create IE11 deployment package, however, based on my own (and my work colleagues) experience I know this is not the best way to create the deployment package. Due to the number of prerequisites it just loves to fail installing the browser that way.
Bellow method has been tested by me on 300+ machines (so far). There were couple of issues related to Enterprise Mode that I have identified, hence the patches added to the script. My work colleagues have tested this deployment method on if I remember correctly 2k+ machines with not a single issue. So to cut it short – it works.
Just a word, before I start.
Lets compare IE to other web browsers in terms of deployment method. How do you deploy Google Chrome? Its simple, all you need is an googlechromestandaloneenterprise.msi from here, then you just package it with whatever deployment tool you prefer, SCCM, SMS, Altiris, PDQDeploy, AutoIT even PSExec, by simply adding /quiet /norestart (or just /qn) and ALLUSERS parameter, like this: msiexec.exe /i “googlechromestandaloneenterprise.msi” /qn ALLUSERS=2 – it just couldn’t be any easier.
Deploying Firefox in an enterprise environment is little bit more complicated, but still, its like a walk in the park comparing to IE. What you need is full redistributable installer and then you need a small .ini file with setup config where you can customize the installer. Quite straight forward to.
Internet Explorer is different :D
What do you need ?
– Prerequisites
– IE 11 installers
– Patches
Lets say we’ll be creating IE11 x86 and x64 package as we have a mix of 32 and 64-bit machines within our environment.
Create C:\IE11x86x64deploy folder – this will be your root folder.
You need to download the following prerequisites:
Download and place them all into PreReq folder within your IE11 root directory.
32-bit
– Windows6.1-KB2533623-x86
– Windows6.1-KB2639308-x86
– Windows6.1-KB2670838-x86
– Windows6.1-KB2729094-v2-x86
– Windows6.1-KB2731771-x86
– Windows6.1-KB2786081-x86
– Windows6.1-KB2834140-v2-x86
– Windows6.1-KB2882822-x86
– Windows6.1-KB2888049-x86
64-bit
– Windows6.1-KB2533623-x64
– Windows6.1-KB2639308-x64
– Windows6.1-KB2639308-x64
– Windows6.1-KB2729094-v2-x64
– Windows6.1-KB2731771-x64
– Windows6.1-KB2786081-x64
– Windows6.1-KB2834140-v2-x64
– Windows6.1-KB2882822-x64
– Windows6.1-KB2888049-x64
Download IE11 x86 and x64 standalone installers from here
Open command prompt and extract them into
IE11-Windows6.1-x86-en-us.exe /x:C:\IE11x86x64deploy\IE10_x86
IE11-Windows6.1-x64-en-us.exe /x:C:\IE11x86x64deploy\IE10_x64
Download the following patches:
Download and place them all into Patches folder within your IE11 root directory.
KB292947 is an important one as it fixes an Enterprise Mode. Even though you enable Enterprise Mode via GPO, it won’t work without this patch.
Other two are cumulative security updates.
– IE11-Windows6.1-KB2929437-x64
– IE11-Windows6.1-KB2929437-x86
– IE11-Windows6.1-KB3078071-x64
– IE11-Windows6.1-KB3078071-x86
– IE11-Windows6.1-KB3087985-x64
– IE11-Windows6.1-KB3087985-x86
Now, above patches are already included in the script bellow, they are located AFTER IE11 install. If you prefer you can remove them from the script and install them separately.
Copy the script and place it into your IE11 root folder as IE11Installer-Win7.vbs
Once launched, the script will create install log file in C:\Support\Logs .
You may wonder, why I added 3010 as a success code? There’s a suppressed reboot after IE11 install, therefore all patches will come with “3010 – restart required return code” once install is complete. Some deployment systems (ie. Altiris) see’s that as Install Failed and this will affect your compliance report.
'*************************************************************************** ' Name: IE11Installer-Win7.vbs ' ' Author: AltirisJunkie ' Date: Nov 24, 2014 ' Modified: Mirek Ordon ' ' Comment: Added security patches. Added Enterprise Mode fix patch for both x86 and x64. Updated return codes. ' ' Usage: - ' '*************************************************************************** ' Return Codes ' 0 : Success ' 099 : Unable to bind to WMI provider ' 100 : The current operating system bit level cannot be determined ' 101 : XP OS was detected ' 102 : 32 bit OS Found - Exit ' 103 : MSIEXEC could not become available within 30 seconds. ' 999 : IE11 already detected ' 3010 : Success ' '*************************************************************************** ' CHANGES: '--------------------------------------------------------------------------------------------- '////////////////////////////////BEGIN STANDARD SCRIPT LOGIC\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ '--------------------------------------------------------------------------------------------- Option Explicit On Error Resume Next '********************BEGIN GLOBAL DECLARATIONS****************************** Const HKEY_LOCAL_MACHINE = &H80000002 Public RetVal Const ForReading = 1, ForWriting = 2, ForAppending = 8 Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0 Dim CurrentDir, strComputerName, strSysDomain, strSysDomainPri, strSysDomainAlt Dim OSbit, OSName, AppName, LocalPackageDir Dim sLogFileLocation, sLogFileName Dim bEnableLogging, bIncludeDateStamp, bPrependDateStampInLogFileName Dim sOverWriteORAppend, vLogMaximumLines, vLogMaximumSize '********************END GLOBAL DECLARATIONS******************************** '***********************SET BASIC OBJECTS*********************************** Dim strComputer : strComputer = "." Dim oFSO : Set oFSO = CreateObject("Scripting.FileSystemObject") Dim oNet : Set oNet = CreateObject("Wscript.Network") Dim oShell : Set oShell = CreateObject("Wscript.Shell") Dim oLocator : Set oLocator=CreateObject("WbemScripting.SWbemLocator") Dim oEnv : Set oEnv = oShell.Environment("PROCESS") Dim oReg : Set oReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") Dim oWMIService : Set oWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Dim RegExp : Set RegExp = New RegExp RegExp.IgnoreCase = True '*********************END SET BASIC OBJECTS********************************* '****************************SET MISC*************************************** ' Waiting 3 seconds to allow objects to initialize 'WScript.Sleep 2000 AppName = "IE11Installer-Win7" ' Rename with script name or purpose for proper log file creation oEnv("SEE_MASK_NOZONECHECKS") = 1 CurrentDir = oFSO.GetParentFolderName(Wscript.ScriptFullName) LocalPackageDir = "C:\Support\Packages\" & AppName strComputerName = oShell.ExpandEnvironmentStrings( "%COMPUTERNAME%" ) strSysDomain = UCase(GetComputerDomain) ' Retrieves the computers current Fully Qualified Domain Name via WMI 'strSysDomain = UCase(RegRead("HKLM\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Domain"))' Retrieves the computers current Domain Name WITHOUT WM ' Created logging folder if does not exist and prepares file for logging of script functions ' Use logging functionality anywhere in script with the following context: ' LogToFile " -----> Input whatever you want to log here" SetupGlobalLogging ' Get the Operating System Bit Archetecture so you can used script on either 32 or 64 bit clients ' Use the If command to branch out based on bit level ex.. ( If OSBit = "32" Then ....... ) GetOSArch ' Gets the Operating System name set in the registry at install to help with logging and ' Branching of Bit level wont work and need to do it based on OS type OSName = RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName") ' Get drive space info. Assists in troubleshooting install issues Dim oLogicalDisk, dTotalSpace, dFreeSpace ' Set oLogicalDisk = oWMIService.Get("Win32_LogicalDisk.DeviceID='c:'") Set oLogicalDisk = oFSO.GetDrive("C:") dFreeSpace = FormatNumber((CDbl(oLogicalDisk.FreeSpace)/1024/1024/1024)) & " GB" dTotalSpace = FormatNumber((CDbl(oLogicalDisk.TotalSize)/1024/1024/1024)) & " GB" 'oLogicalDisk.FreeSpace Dim strIPs GetLocalIP '****************************END MISC*************************************** '--------------------------------------------------------------------------------------------- '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\END STANDARD SCRIPT LOGIC///////////////////////////////////// '--------------------------------------------------------------------------------------------- LogToFile " *** Ready to execute the "& AppName & " at "& Date & " " & Time & " ***" LogToFile " " LogToFile " -----> OS Version:" & Chr(9) & OSName & " " & OSbit & " bit" LogToFile " -----> Computername:" & Chr(9) & strComputerName LogToFile " -----> Domain:" & Chr(9) & Chr(9) & strSysDomain LogToFile " " LogToFile " -----> -------------------------------------------------------------------------------------------------------------------" LogToFile " -----> Software Team Debug Info = Domain - WMI:" & strSysDomainPri & " ~ Domain - Regitry: " & strSysDomainAlt LogToFile " -----> C:\ Drive Space Info = Total Space: " & dTotalSpace & " ~ Free Space: " & dFreeSpace LogToFile " -----> Current Local IP addresses = " & strIPs LogToFile " -----> -------------------------------------------------------------------------------------------------------------------" LogToFile " -----> Script Version - Nov242014" LogToFile " " LogToFile " " '--------------------------------------------------------------------------------------------- '//////////////////////////////BEGIN LOCALIZED SCRIPT LOGIC\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ '--------------------------------------------------------------------------------------------- Dim strProgFiles ' Exit if OS is XP If Instr(1, OSName, "XP", 1) Then WScript.Quit(101) End If If OSbit = "32" Then strProgFiles = oShell.ExpandEnvironmentStrings( "%PROGRAMFILES%" ) Else strProgFiles = oShell.ExpandEnvironmentStrings( "%PROGRAMFILES(x86)%" ) End If ' Check IE11 already exists If CHeckIEVer = "11" Then LogToFile " -----> Internet Explorer 11 has been detected. Exit." WScript.Quit(999) Else If OSbit = "32" Then '-----------------------------------------------------------------------------------Start 32 Bit Install----------------------------------------------------------------------------------------------- If MsiexecAvailable(30) Then 'install 32-bit patch for KB2533623 (Insecure library loading could allow remote code execution) LogToFile " -----> Installing update KB2533623_x86 for Insecure library loading could allow remote code execution..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2533623-x86.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2533623_x86") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 32-bit patch for KB2731771 (local/UTC time conversion) LogToFile " -----> Installing update KB2731771_x86 for local/UTC time conversion fix..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2731771-x86.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2731771_x86") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 32-bit patch for KB2639308 (Introduces the Force ASLR (Address Space Layout Randomization) feature) LogToFile " -----> Installing update KB2639308_x86 for introducing the Force ASLR (Address Space Layout Randomization) feature..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2639308-x86.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2639308_x86") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 32-bit patch for KB2670838 (graphics and imaging issues fix - platform update) LogToFile " -----> Installing update KB2670838_x86 for graphics and imaging issues fix (Platform update)..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2670838-x86.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2670838_x86") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 32-bit patch for KB2729094 (Segoe UI symbol font) LogToFile " -----> Installing update KB2729094_x86 for Segoe UI symbol font..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2729094-v2-x86.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2729094_x86") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 32-bit patch for KB2786081 (Internet Explorer 10 does not save credentials for a website) LogToFile " -----> Installing update KB2786081_x86 for Internet Explorer 10 does not save credentials for a website..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2786081-x86.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2786081_x86") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 32-bit patch for KB2834140 (Stop Error correction after installing KB2670838) LogToFile " -----> Installing update KB2834140_x86 for Stop Error correction after installing KB2670838 fix..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2834140-v2-x86.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2834140_x86") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 32-bit patch for KB2882822 (Update adds ITraceRelogger interface support) LogToFile " -----> Installing update KB2882822_x86 for update adds ITraceRelogger interface support..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2882822-x86.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2882822_x86") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 32-bit patch for KB2888049 (improves the network performance of Internet Explorer 11) LogToFile " -----> Installing update KB2888049_x86 for improving the network performance of Internet Explorer 11..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2888049-x86.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2888049_x86") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install Internet Explorer 11 for 32-bit LogToFile " -----> Installing Internet Explorer 11 for 32-bit..." LogToFile " -----> Install log: C:\Support\Logs\Microsoft_IE_11_Detailed.log" 'Factory installer: RetVal = oShell.Run(CurrentDir & "\IE11-Windows6.1-x32-en-us.exe /quiet /update-no /closeprograms /norestart /log:C:\Windows\Logs\",0,True) RetVal = oShell.Run("C:\Windows\System32\dism.exe /online /add-package /packagepath:" & Chr(34) & CurrentDir & "\IE11_x86\IE-Win7.CAB" & Chr(34) & " /quiet /norestart /logpath:C:\Support\Logs\Microsoft_IE_11_Detailed.log",0,True) If RetVal = 3010 Then LogToFile " -----> WARNING: Installation of Internet Explorer 11 has completed successfully, however, required reboot was suppressed!" RegWriteAdvanced "HKLM\SOFTWARE\Microsoft\Internet Explorer\MAIN\EnableAutoUpgrade",0,"REG_DWORD" WScript.Quit(0) ElseIf RetVal <> 0 Then LogToFile " -----> ERROR: Installation of Internet Explorer 11 has failed with error: " & RetVal Else LogToFile " -----> Installation of Internet Explorer 11 has completed successfully." RegWriteAdvanced "HKLM\SOFTWARE\Microsoft\Internet Explorer\MAIN\EnableAutoUpgrade",0,"REG_DWORD" End If Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 32-bit patch for KB2929437 (Security Update for Internet Explorer 11 Fixes Enterprise Mode) LogToFile " -----> Installing update KB2929437_x86 for Security Update for Internet Explorer 11 Fixes Enterprise Mode..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\IE11-Windows6.1-KB2929437-x86.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2888049_x86") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 32-bit patch for KB3078071 (Cumulative Security Update for Internet Explorer 11 for Windows 7 for x86-based Systems) LogToFile " -----> Installing KB3078071 Cumulative Security Update for Internet Explorer 11 for Windows 7 for x86-based Systems" RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\Patches\IIE11-Windows6.1-KB3078071-x86.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB3078071_x86") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If f MsiexecAvailable(30) Then 'install 32-bit patch for KB3087985 (Cumulative Security Update for Internet Explorer 11 for Windows 7 for x32-based Systems) LogToFile " -----> Installing KB3087985 Cumulative Security Update for Internet Explorer 11 for Windows 7 for x32-based Systems" RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\Patches\IE11-Windows6.1-KB3087985-x86.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB3087985_x32") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If Else '-----------------------------------------------------------------------------------Start 64 Bit Install----------------------------------------------------------------------------------------------- If MsiexecAvailable(30) Then 'install 64-bit patch for KB2533623 (Insecure library loading could allow remote code execution) LogToFile " -----> Installing update KB2533623_x64 for Insecure library loading could allow remote code execution..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2533623-x64.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2533623_x64") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 64-bit patch for KB2731771 (local/UTC time conversion) LogToFile " -----> Installing update KB2731771_x64 for local/UTC time conversion fix..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2731771-x64.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2731771_x64") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 64-bit patch for KB2639308 (Introduces the Force ASLR (Address Space Layout Randomization) feature) LogToFile " -----> Installing update KB2639308_x64 for introducing the Force ASLR (Address Space Layout Randomization) feature..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2639308-x64.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2639308_x64") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 64-bit patch for KB2670838 (graphics and imaging issues fix - platform update) LogToFile " -----> Installing update KB2670838_x64 for graphics and imaging issues fix (Platform update)..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2670838-x64.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2670838_x64") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 64-bit patch for KB2729094 (Segoe UI symbol font) LogToFile " -----> Installing update KB2729094_x64 for Segoe UI symbol font..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2729094-v2-x64.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2729094_x64") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 64-bit patch for KB2786081 (Internet Explorer 10 does not save credentials for a website) LogToFile " -----> Installing update KB2786081_x64 for Internet Explorer 10 does not save credentials for a website..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2786081-x64.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2786081_x64") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 64-bit patch for KB2834140 (Stop Error correction after installing KB2670838) LogToFile " -----> Installing update KB2834140_x64 for Stop Error correction after installing KB2670838 fix..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2834140-v2-x64.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2834140_x64") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 64-bit patch for KB2882822 (Update adds ITraceRelogger interface support) LogToFile " -----> Installing update KB2882822_x64 for update adds ITraceRelogger interface support..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2882822-x64.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2882822_x64") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 64-bit patch for KB2888049 (improves the network performance of Internet Explorer 11) LogToFile " -----> Installing update KB2888049_x64 for improving the network performance of Internet Explorer 11..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\PreReq\Windows6.1-KB2888049-x64.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2888049_x64") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install Internet Explorer 11 for 64-bit (includes 32-bit) LogToFile " -----> Installing Internet Explorer 11 for 64-bit..." LogToFile " -----> Install log: C:\Support\Logs\Microsoft_IE_11_Detailed.log" 'Factory installer: RetVal = oShell.Run(CurrentDir & "\IE11-Windows6.1-x64-en-us.exe /quiet /update-no /closeprograms /norestart /log:C:\Windows\Logs\",0,True) RetVal = oShell.Run("C:\Windows\System32\dism.exe /online /add-package /packagepath:" & Chr(34) & CurrentDir & "\IE11_x64\IE-Win7.CAB" & Chr(34) & " /quiet /norestart /logpath:C:\Support\Logs\Microsoft_IE_11_Detailed.log",0,True) If RetVal = 3010 Then LogToFile " -----> WARNING: Installation of Internet Explorer 11 has completed successfully, however, required reboot was suppressed!" RegWriteAdvanced "HKLM\SOFTWARE\Microsoft\Internet Explorer\MAIN\EnableAutoUpgrade",0,"REG_DWORD" WScript.Quit(0) ElseIf RetVal <> 0 Then LogToFile " -----> ERROR: Installation of Internet Explorer 11 has failed with error: " & RetVal Else LogToFile " -----> Installation of Internet Explorer 11 has completed successfully." RegWriteAdvanced "HKLM\SOFTWARE\Microsoft\Internet Explorer\MAIN\EnableAutoUpgrade",0,"REG_DWORD" End If Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 64-bit patch for KB2929437 (Security Update for Internet Explorer 11 Fixes Enterprise Mode) LogToFile " -----> Installing update KB2929437_x64 for Security Update for Internet Explorer 11 Fixes Enterprise Mode..." RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\Patches\IE11-Windows6.1-KB2929437-x64.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB2929437_x64") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If If MsiexecAvailable(30) Then 'install 64-bit patch for KB3078071 (Cumulative Security Update for Internet Explorer 11 for Windows 7 for x64-based Systems) LogToFile " -----> Installing KB3078071 Cumulative Security Update for Internet Explorer 11 for Windows 7 for x64-based Systems" RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\Patches\IIE11-Windows6.1-KB3078071-x64.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB3078071_x64") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If f MsiexecAvailable(30) Then 'install 64-bit patch for KB3087985 (Cumulative Security Update for Internet Explorer 11 for Windows 7 for x64-based Systems) LogToFile " -----> Installing KB3087985 Cumulative Security Update for Internet Explorer 11 for Windows 7 for x64-based Systems" RetVal = oShell.Run("wusa.exe " & Chr(34) & CurrentDir & "\Patches\IE11-Windows6.1-KB3087985-x64.msu" & Chr(34) & " /quiet /norestart /log",0,True) Results("KB3087985_x64") Else LogToFile " -----> MSIEXEC could not become available within 30 seconds. Exit installer" WScript.Quit(103) End If End If End If WScript.Quit(RetVal) '--------------------------------------------------------------------------------------------- '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\END LOCALIZED SCRIPT LOGIC//////////////////////////////////// '--------------------------------------------------------------------------------------------- '--------------------------------------------------------------------------------------------- '///////////////////////////BEGIN LOCALIZED FUNCTIONS-SUBROUTINES\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ '--------------------------------------------------------------------------------------------- Function CHeckIEVer Dim sFile, strQuery, objFile, colFiles, IEver sFile = strProgFiles & "\Internet Explorer\iexplore.exe" strQuery = "Select * from CIM_Datafile Where Name = '" + Replace(sFile, "\", "\\") + "'" Set colFiles = oWMIService.ExecQuery(strQuery) For Each objFile in colFiles CHeckIEVer = Left(objFile.Version,2) Next End Function Function Results(KBname) Select Case RetVal Case 9009 LogToFile " -----> WARNING: " & KBname & " is already installed; skipping installation." Case 2359302 LogToFile " -----> WARNING: " & KBname & " is already installed; skipping installation." Case -2145124329 LogToFile " -----> WARNING: " & KBname & " is not required for this system; skipping installation." Case Else LogToFile " -----> Install of " & KBname & " has completed with return code: " & RetVal End Select End Function '--------------------------------------------------------------------------------------------- '\\\\\\\\\\\\\\\\\\\\\\\\\\END LOCALIZED FUNCTIONS-SUBROUTINES//////////////////////////////// '--------------------------------------------------------------------------------------------- '--------------------------------------------------------------------------------------------- '//////////////////////////BEGIN STANDARD FUNCTIONS-SUBROUTINES\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ '--------------------------------------------------------------------------------------------- ' Determine CPU architecture of the installed OS of the computer ' ------------------------------------------------------------------------------------------------------ Sub GetOSArch ' Determine CPU architecture Dim strOSbitValue strOSbitValue = RegRead("HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0\Identifier") ' 32 bit OS If (InStr(strOSbitValue, "x86")) Then OSbit = "32" 'LogToFile " OS Bit Level = " & OSbit '64 bit OS ElseIf (InStr(strOSbitValue, "64")) Then OSbit = "64" 'LogToFile " OS Bit Level = " & OSbit Else 'Log the Error LogToFile " -----> The current operating system bit level cannot be determined - please investigate manually" WScript.Quit(100) End If End Sub ' Subroutine to get the name of the installed OS of the computer ' ------------------------------------------------------------------------------------------------------ Sub GetOSName Dim colItems, oItem, theValue Set colItems = oWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem",,48) For Each oItem in colItems OSName = oItem.Caption Next 'OSName = theValue 'LogToFile " OS Name = " & OSName End Sub ' Function to get the domain that the computer is part of ' ------------------------------------------------------------------------------------------------------ Function GetComputerDomain() On Error Resume Next Dim OpSysSet, i Set OpSysSet = GetObject("winmgmts:\root\cimv2").ExecQuery("select * from Win32_ComputerSystem") For Each i in OpSysSet ' There should only be one anyway, but we'll do this to be sure to be sure. GetComputerDomain = i.Domain Next End Function ' Stores all local IP addresses into the IPAddress(i) array ' ------------------------------------------------------------------------------------------------------ Sub GetLocalIP Dim objWMIService, IPConfigSet, IPConfig, i Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set IPConfigSet = objWMIService.ExecQuery("Select IPAddress from Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True'") For Each IPConfig in IPConfigSet If Not IsNull(IPConfig.IPAddress) Then For i = LBound(IPConfig.IPAddress) To UBound(IPConfig.IPAddress) If Not Instr(IPConfig.IPAddress(i), ":") > 0 Then strIPs = strIPs & IPConfig.IPAddress(i) & " " End If Next End If Next End Sub ' Check and wait for X number of seconds for Msiexec.exe to become available for use ' Pass a number in seconds when calling. ie. If WaitforMSI(30) Then.... ' ------------------------------------------------------------------------------------------------------ Function MsiexecAvailable(MaxWait) Dim Counter, oWMIServiceMSI, colProcesses, objProcess Counter = 0 Do Until MsiexecAvailable Or Counter > MaxWait Set oWMIServiceMSI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2") Set colProcesses = oWMIServiceMSI.ExecQuery ("Select * From Win32_Process Where Name='msiexec.exe'") ' Check if any process is currently running If (colProcesses.Count>0) Then ' One ore more msiexec.exe processes are running For Each objProcess In colProcesses ' Check each process found and verify If (InStr (objProcess.Commandline,"/V")=0) Then WScript.sleep 1000 Counter = Counter + 1 Exit For Else If (colProcesses.Count=1) Then _ MsiexecAvailable = True End If Next Else MsiexecAvailable = True End If Loop End Function ' Writes a registry item (regtype = REG_SZ, REG_BINARY, ...) 'Examples: 'RegWriteAdvanced "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoRestartShell",1,"REG_DWORD" ' --------------------------------------------------------------------------------------------------- Function RegWriteAdvanced(Name, iValue, RegType) On Error Resume Next RegWriteAdvanced = oShell.RegWrite(Name, iValue, RegType) If Err Then RegWriteAdvanced = Err.Number Err.Clear Else RegWriteAdvanced = 0 End If End Function ' Reads a registry item ' This will read the value into a variable when used ' Example: ' myvar = Regread("HKLM\Software\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\Au Options") ' If myvar = whatever then do something .... ' ------------------------------------------------------------------------------------------------------ Function RegRead(Name) On Error Resume Next RegRead = oShell.RegRead(Name) If Err Then If Err.Number = -2147024894 Then ' registry value or keydoesn't exist ' do Nothing RegRead = "" LogToFile " -----> Having issues reading the registry key - " & Name Else LogToFile " -----> RegRead" & " - " & Err.Number & ": " & Left(Err.Description, Len(Err.Description) - 0) RegRead = "" End If Err.Clear Else ' niks End If End Function ' Generates a folder path is does not exist ' --------------------------------------------------------------------------------------------------- Function GeneratePath(pFolderPath) GeneratePath = False If Not oFSO.FolderExists(pFolderPath) Then If GeneratePath(oFSO.GetParentFolderName(pFolderPath)) Then GeneratePath = True Call oFSO.CreateFolder(pFolderPath) End If Else GeneratePath = True End If End Function ' Sets basic logging settings within script ' --------------------------------------------------------------------------------------------------- Sub SetupGlobalLogging '********** Create bak file if needed ********** If oFSO.FileExists("C:\Support\Logs\" & AppName & ".bak") Then oFSO.DeleteFile("C:\Support\Logs\" & AppName & ".bak") End If If oFSO.FileExists("C:\Support\Logs\" & AppName & ".txt") Then oFSO.MoveFile "C:\Support\Logs\" & AppName & ".txt", "C:\Support\Logs\" & AppName & ".bak" End If '********** Create Install Log Folder ********** GeneratePath("C:\Support\Logs") GeneratePath("C:\Support\Packages") 'Specify the log file location here. Path 'must contain a trailing backslash. If you 'would like to log to the same location as 'the currently running script, set this 'value to "relative" or uncomment out the 'line below. sLogFileLocation = "C:\Support\Logs\" 'sLogFileLocation = "relative" 'Specify the log file name here. sLogFileName = AppName & ".txt" '---------LogToFile Configuration--------- 'NOTE: The values specified here must be 'set before calling the LogToFile sub. 'You can disable logging globally by 'setting the bEnableLogging option to false. bEnableLogging = True 'Setting this to true will time stamp Each 'message that is logged to the log file 'with the current date and time. bIncludeDateStamp = True 'This will set the log file name to the 'current date and time. You can use this 'option to create incremental log files. bPrependDateStampInLogFileName = False 'You can set whether or not you would like 'the script to append to an existing file, 'or if you would like it to overwrite 'existing copies. To overwrite set the 'sOverWriteORAppend variable to "overwrite" sOverWriteORAppend = "overwrite" 'Here you can set the maximum number of 'lines you like to record. If the maximum 'is reached the beginning of the log file 'will be pruned. Setting this to a value 'of 0 will disable this function. vLogMaximumLines = 0 'This is just like limiting the log file 'to a number of lines but limits by the 'total size of the log file. This value 'is in bytes. Setting this to 0 will 'disable this function. vLogMaximumSize = 0 '-------END LogToFile Configuration------- End Sub ' Sets advanced settings for logging within script ' --------------------------------------------------------------------------------------------------- Sub LogToFile(Message) 'Anywhere you'd like to log a message within the script you'd simply 'Add LogToFile "Your Message" to log the relevant information If bEnableLogging = False Then Exit Sub Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 Dim oLogFSO, oLogShell, oLogFile Dim sNow, sLogFile Set oLogFSO = CreateObject("Scripting.FileSystemObject") If sLogFileLocation = "relative" Then Set oLogShell = CreateObject("Wscript.Shell") 'sLogFileLocation = "C:\Support\Logs\" 'sLogFileLocation = CreateObject("Scripting.FileSystemObject").GetAbsoluteCurrentDir(".") & "\" sLogFileLocation = oLogFSO.GetParentFolderName(Wscript.ScriptFullName) & "\" 'WScript.Echo sLogFileLocation Set oLogShell = Nothing End If If bPrependDateStampInLogFileName Then sNow = Replace(Replace(Now(),"/","-"),":",".") sLogFileName = sNow & " - " & sLogFileName bPrependDateStampInLogFileName = False End If sLogFile = sLogFileLocation & sLogFileName If sOverWriteORAppend = "overwrite" Then Set oLogFile = oLogFSO.OpenTextFile(sLogFile, ForWriting, True) sOverWriteORAppend = "append" Else Set oLogFile = oLogFSO.OpenTextFile(sLogFile, ForAppending, True) End If If bIncludeDateStamp Then Message = Now & " " & Message End If oLogFile.WriteLine(Message) oLogFile.Close If vLogMaximumLines > 0 Then Set oReadLogFile = oLogFSO.OpenTextFile(sLogFile, ForReading, True) sFileContents = oReadLogFile.ReadAll aFileContents = Split(sFileContents, vbCRLF) If Ubound(aFileContents) > vLogMaximumLines Then sFileContents = Replace(sFileContents, aFileContents(0) & _ vbCRLF, "", 1, Len(aFileContents(0) & vbCRLF)) Set oLogFile = oLogFSO.OpenTextFile(sLogFile, ForWriting, True) oLogFile.Write(sFileContents) oLogFile.Close End If oReadLogFile.Close End If If vLogMaximumSize > 0 Then Set oReadLogFile = oLogFSO.OpenTextFile(sLogFile, ForReading, True) sFileContents = oReadLogFile.ReadAll oReadLogFile.Close sFileContents = RightB(sFileContents, (vLogMaximumSize*2)) Set oLogFile = oLogFSO.OpenTextFile(sLogFile, ForWriting, True) oLogFile.Write(sFileContents) oLogFIle.Close End If oLogFSO = Null End Sub '--------------------------------------------------------------------------------------------- '\\\\\\\\\\\\\\\\\\\\\\\\\\\END STANDARD FUNCTIONS-SUBROUTINES//////////////////////////////// '---------------------------------------------------------------------------------------------