Scalable-Infrastructure-for.../2a. WindowsUpdate.ps1

84 строки
2.8 KiB
PowerShell

function Get-WIAStatusValue($value)
{
switch -exact ($value)
{
0 {"NotStarted"}
1 {"InProgress"}
2 {"Succeeded"}
3 {"SucceededWithErrors"}
4 {"Failed"}
5 {"Aborted"}
}
}
$needsReboot = $false
$UpdateSession = New-Object -ComObject Microsoft.Update.Session
$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
###################### Create or Set Log file #########################
$datetime = Get-Date -UFormat "%Y%m%d%H%M%S"
$filename = "WinUpdate$datetime.txt"
$Location = "C:\UpdateLogs"
$LocationFile = "C:\UpdateLogs\$filename"
If((Test-Path $Location) -eq $False)
{
New-Item -Path "C:\" -name "UpdateLogs" -ItemType "directory"
} # End of folder exists test
If((Test-Path $LocationFile) -eq $False)
{
New-Item -Path $Location -Name $filename -ItemType File
} # End of file exist test
Else
{
"The $LocationFile is already there."
}
#######################################################################
######################### Perform Update ##############################
Write-Output " - Searching for Updates" | add-content $LocationFile
$SearchResult = $UpdateSearcher.Search("IsAssigned=1 and IsHidden=0 and IsInstalled=0")
Write-Output " - Found [$($SearchResult.Updates.count)] Updates to Download and install" | add-content $LocationFile
$needsReboot = @()
foreach($Update in $SearchResult.Updates)
{
# Add Update to Collection
$UpdatesCollection = New-Object -ComObject Microsoft.Update.UpdateColl
if ( $Update.EulaAccepted -eq 0 )
{
$Update.AcceptEula()
}
$UpdatesCollection.Add($Update) | out-null
#Download
Write-Output " + Downloading Update $($Update.Title)" | add-content $LocationFile
$UpdatesDownloader = $UpdateSession.CreateUpdateDownloader()
$UpdatesDownloader.Updates = $UpdatesCollection
$DownloadResult = $UpdatesDownloader.Download()
$Message = " - Download {0}" -f (Get-WIAStatusValue $DownloadResult.ResultCode)
Write-Output $message | add-content $LocationFile
#Install
Write-Output " - Installing Update" | add-content $LocationFile
$UpdatesInstaller = $UpdateSession.CreateUpdateInstaller()
$UpdatesInstaller.Updates = $UpdatesCollection
$InstallResult = $UpdatesInstaller.Install()
$Message = " - Install {0}" -f (Get-WIAStatusValue $DownloadResult.ResultCode)
Write-Output $message | add-content $LocationFile
if ($installResult.rebootRequired){$needsReboot += "1"}
}
#Restart if needed
if($needsReboot.Contains("1"))
{
Write-Output "Restart Required" | add-content $LocationFile
restart-computer -Force
}
#######################################################################