152 lines
5.1 KiB
PowerShell
152 lines
5.1 KiB
PowerShell
#Requires -Version 3.0
|
|
<#PSScriptInfo
|
|
.VERSION 1.0
|
|
.GUID 6cf319d1-8c50-460b-99ee-71b11cf7270d
|
|
.AUTHOR
|
|
Jordan Borean <jborean93@gmail.com>
|
|
.COPYRIGHT
|
|
Jordan Borean 2017
|
|
.TAGS
|
|
PowerShell,Ansible,WinRM,WMF,Hotfix
|
|
.LICENSEURI https://github.com/jborean93/ansible-windows/blob/master/LICENSE
|
|
.PROJECTURI https://github.com/jborean93/ansible-windows
|
|
.RELEASENOTES
|
|
Version 1.0: 2017-09-27
|
|
Initial script created
|
|
#>
|
|
|
|
<#
|
|
.DESCRIPTION
|
|
The script will install the WinRM hotfix KB2842230 which fixes the memory
|
|
issues that occur when running over WinRM with WMF 3.0.
|
|
The script will;
|
|
1. Detect if running on PS version 3.0 and exit if it is not
|
|
2. Check if KB2842230 is already installed and exit if it is
|
|
3. Download the hotfix from Microsoft server's based on the OS version
|
|
4. Extract the .msu file from the downloaded hotfix
|
|
5. Install the .msu silently
|
|
6. Detect if a reboot is required and prompt whether the user wants to restart
|
|
|
|
Once the install is complete, if the install process returns an exit
|
|
code of 3010, it will ask the user whether to restart the computer now
|
|
or whether it will be done later.
|
|
|
|
See https://github.com/jborean93/ansible-windows/tree/master/scripts for more
|
|
details.
|
|
.PARAMETER Verbose
|
|
[switch] - Whether to display Verbose logs on the console
|
|
.EXAMPLE
|
|
powershell.exe -ExecutionPolicy ByPass -File Install-WMF3Hotfix.ps1
|
|
.EXAMPLE
|
|
powershell.exe -ExecutionPolicy ByPass -File Install-WMF3Hotfix.ps1 -Verbose
|
|
#>
|
|
|
|
[CmdletBinding()]
|
|
Param()
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
if ($verbose) {
|
|
$VerbosePreference = "Continue"
|
|
}
|
|
|
|
Function Run-Process($executable, $arguments) {
|
|
$process = New-Object -TypeName System.Diagnostics.Process
|
|
$psi = $process.StartInfo
|
|
$psi.FileName = $executable
|
|
$psi.Arguments = $arguments
|
|
Write-Verbose -Message "starting new process '$executable $arguments'"
|
|
$process.Start() | Out-Null
|
|
|
|
$process.WaitForExit() | Out-Null
|
|
$exit_code = $process.ExitCode
|
|
Write-Verbose -Message "process completed with exit code '$exit_code'"
|
|
|
|
return $exit_code
|
|
}
|
|
|
|
Function Download-File($url, $path) {
|
|
Write-Verbose -Message "downloading url '$url' to '$path'"
|
|
$client = New-Object -TypeName System.Net.WebClient
|
|
$client.DownloadFile($url, $path)
|
|
}
|
|
|
|
Function Extract-Zip($zip, $dest) {
|
|
Write-Verbose -Message "extracting '$zip' to '$dest'"
|
|
try {
|
|
Add-Type -AssemblyName System.IO.Compression.FileSystem > $null
|
|
$legacy = $false
|
|
} catch {
|
|
$legacy = $true
|
|
}
|
|
|
|
if ($legacy) {
|
|
$shell = New-Object -ComObject Shell.Application
|
|
$zip_src = $shell.NameSpace($zip)
|
|
$zip_dest = $shell.NameSpace($dest)
|
|
$zip_dest.CopyHere($zip_src.Items(), 1044)
|
|
} else {
|
|
[System.IO.Compression.ZipFile]::ExtractToDirectory($zip, $dest)
|
|
}
|
|
}
|
|
|
|
$tmp_dir = $env:temp
|
|
$kb = "KB2842230"
|
|
if ($PSVersionTable.PSVersion.Major -ne 3) {
|
|
Write-Verbose -Message "$kb is only applicable with Powershell v3, no action required"
|
|
exit 0
|
|
}
|
|
|
|
$hotfix_installed = Get-Hotfix -Id $kb -ErrorAction SilentlyContinue
|
|
if ($hotfix_installed -ne $null) {
|
|
Write-Verbose -Message "$kb is already installed"
|
|
exit 0
|
|
}
|
|
|
|
if (-not (Test-Path -Path $tmp_dir)) {
|
|
New-Item -Path $tmp_dir -ItemType Directory > $null
|
|
}
|
|
$os_version = [Version](Get-Item -Path "$env:SystemRoot\System32\kernel32.dll").VersionInfo.ProductVersion
|
|
$host_string = "$($os_version.Major).$($os_version.Minor)-$($env:PROCESSOR_ARCHITECTURE)"
|
|
switch($host_string) {
|
|
# These URLS point to the Ansible Core CI S3 bucket, MS no longer provide a link to Server 2008 so we need to
|
|
# rely on this URL. There are no guarantees this will stay up in the future.
|
|
"6.0-x86" {
|
|
$url = "https://s3.amazonaws.com/ansible-ci-files/hotfixes/KB2842230/464091_intl_i386_zip.exe"
|
|
}
|
|
"6.0-AMD64" {
|
|
$url = "https://s3.amazonaws.com/ansible-ci-files/hotfixes/KB2842230/464090_intl_x64_zip.exe"
|
|
}
|
|
"6.1-x86" {
|
|
$url = "https://s3.amazonaws.com/ansible-ci-files/hotfixes/KB2842230/463983_intl_i386_zip.exe"
|
|
}
|
|
"6.1-AMD64" {
|
|
$url = "https://s3.amazonaws.com/ansible-ci-files/hotfixes/KB2842230/463984_intl_x64_zip.exe"
|
|
}
|
|
"6.2-x86" {
|
|
$url = "https://s3.amazonaws.com/ansible-ci-files/hotfixes/KB2842230/463940_intl_i386_zip.exe"
|
|
}
|
|
"6.2-AMD64" {
|
|
$url = "https://s3.amazonaws.com/ansible-ci-files/hotfixes/KB2842230/463941_intl_x64_zip.exe"
|
|
}
|
|
}
|
|
|
|
$filename = $url.Split("/")[-1]
|
|
$compressed_file = "$tmp_dir\$($filename).zip"
|
|
Download-File -url $url -path $compressed_file
|
|
Extract-Zip -zip $compressed_file -dest $tmp_dir
|
|
$file = Get-Item -Path "$tmp_dir\*$kb*.msu"
|
|
if ($file -eq $null) {
|
|
Write-Error -Message "unable to find extracted msu file for hotfix KB"
|
|
exit 1
|
|
}
|
|
|
|
$exit_code = Run-Process -executable $file.FullName -arguments "/quiet /norestart"
|
|
if ($exit_code -eq 3010) {
|
|
Write-Verbose "need to restart computer after hotfix $kb install"
|
|
Restart-Computer -Force
|
|
} elseif ($exit_code -ne 0) {
|
|
Write-Error -Message "failed to install hotfix $($kb): exit code $exit_code"
|
|
} else {
|
|
Write-Verbose -Message "hotfix $kb install complete"
|
|
}
|
|
exit $exit_code |