powershell
sethayes
·
step04
·
Powershell
·
Total Size: 9.94 KB
·
·
Created: 5 years ago
·
Edited: 5 years ago
Param (
$global:RestartRequired = 0,
$global:MoreUpdates = 0,
$global:MaxCycles = 10
)
$Log = "C:\Users\Public\Log.txt"
filter timestamp {"$(Get-Date -Format G) | $_"}
Function Check-ContinueRestartOrEnd() {
$RegistryKey = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
$RegistryEntry = "InstallWindowsUpdates"
switch ($global:RestartRequired) {
0 {
$prop = (Get-ItemProperty $RegistryKey).$RegistryEntry
If ($prop) {
Write-Output "Restart Registry Entry Exists - Removing It" | timestamp
Write-Output "Restart Registry Entry Exists - Removing It" | timestamp | Out-File $Log -Append
Remove-ItemProperty -Path $RegistryKey -Name $RegistryEntry -ErrorAction SilentlyContinue
If (Test-Path C:\Users\Public\step05.ps1) {
& "C:\Users\Public\step05.ps1"
}
}
Check-WindowsUpdates
If (($global:MoreUpdates -eq 1) -and ($script:Cycles -le $global:MaxCycles)) {
Stop-Service $script:ServiceName -Force
Set-Service -Name $script:ServiceName -StartupType Disabled -Status Stopped
Install-WindowsUpdates
}
ElseIf ($script:Cycles -gt $global:MaxCycles) {
Write-Output "Exceeded Cycle Count - Stopping" | timestamp
Write-Output "Exceeded Cycle Count - Stopping" | timestamp | Out-File $Log -Append
}
Else {
Write-Output "Done Installing Windows Updates" | timestamp
Write-Output "Done Installing Windows Updates" | timestamp | Out-File $Log -Append
Set-Service -Name $script:ServiceName -StartupType Automatic -Status Running
}
}
1 {
$prop = (Get-ItemProperty $RegistryKey).$RegistryEntry
If (-not $prop) {
Write-Output "Restart Registry Entry Does Not Exist - Creating It" | timestamp
Write-Output "Restart Registry Entry Does Not Exist - Creating It" | timestamp | Out-File $Log -Append
Set-ItemProperty -Path $RegistryKey -Name $RegistryEntry -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File $($script:ScriptPath)"
}
Else {
Write-Output "Restart Registry Entry Already Exists" | timestamp
Write-Output "Restart Registry Entry Already Exists" | timestamp | Out-File $Log -Append
}
Write-Output "Restart Required - Restarting..." | timestamp
Write-Output "Restart Required - Restarting..." | timestamp | Out-File $Log -Append
Restart-Computer -Force -Confirm:$false
}
default {
Write-Output "Unsure If A Restart is Required" | timestamp
Write-Output "Unsure If A Restart is Required" | timestamp | Out-File $Log -Append
break
}
}
}
Function Install-WindowsUpdates() {
$script:Cycles++
Write-Output "Evaluating Available Updates:" | timestamp
Write-Output "Evaluating Available Updates:" | timestamp | Out-File $Log -Append
$UpdatesToDownload = New-Object -ComObject "Microsoft.Update.UpdateColl"
ForEach ($Update in $SearchResult.Updats) {
If (($null -ne $Update) -and (!$Update.IsDownloaded)) {
[bool]$addThisUpdate = $false
If ($Update.InstallationBehavior.CanRequestUserInput) {
Write-Output "> Skipping: $($Update.Title) because it requires user input" | timestamp
Write-Output "> Skipping: $($Update.Title) because it requires user input" | timestamp | Out-File $Log -Append
}
Else {
If (!($Update.EulaAccepted)) {
Write-Output "> Note: $($Update.Title) has a License Agreement that Must be Accepted. Accepting the License." | timestamp
Write-Output "> Note: $($Update.Title) has a License Agreement that Must be Accepted. Accepting the License." | timestamp | Out-File $Log -Append
$Update.AcceptEula()
[bool]$addThisUpdate = $true
}
Else {
[bool]$addThisUpdate = $true
}
}
If ([bool]$addThisUpdate) {
Write-Output "Adding: $($Update.Title)" | timestamp
Write-Output "Adding: $($Update.Title)" | timestamp | Out-File $Log -Append
$UpdatesToDownload.Add($Update) | Out-Null
}
}
}
If ($UpdatesToDownload.Count -eq 0) {
Write-Output "No Updates to Download..." | timestamp
Write-Output "No Updates to Download..." | timestamp | Out-File $Log -Append
}
Else {
Write-Output "Downloading Updates..." | timestamp
Write-Output "Downloading Updates..." | timestamp | Out-File $Log -Append
$Downloader = $UpdateSession.CreateUpdateDownloader()
$Downloader.Updates = $UpdatesToDownload
$Downloader.Download()
}
$UpdatesToInstall = New-Object -ComObject 'Microsoft.Update.UpdateColl'
[bool]$rebootMayBeRequired = $false
Write-Output "The Following Updates are Downloaded and Ready to Be Installed:" | timestamp
Write-Output "The Following Updates are Downloaded and Ready to Be Installed:" | timestamp | Out-File $Log -Append
ForEach ($Update in $SearchResult.Updates) {
If (($Update.IsDownloaded)) {
Write-Output "> $($Update.Title)" | timestamp
Write-Output "> $($Update.Title)" | timestamp | Out-File $Log -Append
$UpdatesToInstall.Add($Update) | Out-Null
If ($Update.InstallationBehavior.RebootBehavior -gt 0) {
[bool]$rebootMayBeRequired = $true
}
}
}
If ($UpdatesToInstall.Count -eq 0) {
Write-Output "No Updates Available to Install..." | timestamp
Write-Output "No Updates Available to Install..." | timestamp | Out-File $Log -Append
$global:MoreUpdates = 0
$global:RestartRequired = 0
If (Test-Path C:\Users\Public\step05.ps1) {
& C:\Users\Public\step05.ps1
}
break
}
If ($rebootMayBeRequired) {
Write-Output "These Updates May Require a Reboot" | timestamp
Write-Output "These Updates May Require a Reboot" | timestamp | Out-File $Log -Append
$global:RestartRequired = 1
}
Write-Output "Installing Updates..." | timestamp
Write-Output "Installing Updates..." | timestamp | Out-File $Log -Append
$Installer = $script:UpdateSession.CreateUpdateInstaller()
$Installer.Updates = $UpdatesToInstall
$InstallationResult = $Installer.Install()
Write-Output "Installation Result: $($InstallationResult.ResultCode)" | timestamp
Write-Output "Reboot Required: $($InstallationResult.RebootRequired)" | timestamp
Write-Output "Listing of Updates Installed and Individual Installation Results:" | timestamp
Write-Output "Installation Result: $($InstallationResult.ResultCode)" | timestamp | Out-File $Log -Append
Write-Output "Reboot Required: $($InstallationResult.RebootRequired)" | timestamp | Out-File $Log -Append
Write-Output "Listing of Updates Installed and Individual Installation Results:" | timestamp | Out-File $Log -Append
If ($InstallationResult.RebootRequired) {
$global:RestartRequired = 1
}
Else {
$global:RestartRequired = 0
}
For ($i = 0; $i -lt $UpdatesToInstall.Count; $i++) {
New-Object -TypeName PSObject -Property @{
Title = $UpdatesToInstall.Item($i).Title
Result = $InstallationResult.GetUpdateResult($i).ResultCode
}
}
Check-ContinueRestartOrEnd
}
Function Check-WindowsUpdates() {
Write-Output "Checking for Windows Updates" | timestamp
Write-Output "Checking for Windows Updates" | timestamp | Out-File $Log -Append
$Username = $env:USERDOMAIN + "\" + $env:USERNAME
New-EventLog -Source $ScriptName -LogName 'WindowsPowershell' -ErrorAction SilentlyContinue
$Message = "Script: " + $ScriptPath + "`nScript User: " + $Username + "`nStarted: " + (Get-Date).toString()
Write-EventLog -LogName 'WindowsPowershell' -Source $ScriptName -EventID "104" -EntryType "Information" -Message $message
Write-Output $message | timestamp
Write-Output $message | timestamp | Out-File $Log -Append
$script:UpdateSearcher = $script:UpdateSession.CreateUpdateSearcher()
$script:SearchResult = $script:UpdateSearcher.Search("IsInstalled=0 and Type='Software' and IsHidden=0")
If ($SearchResult.Updates.Count -ne 0) {
$script:SearchResult.Updates | Select-Object -Property Title, Description, SupportUrl, UninstallationNotes, RebootRequired, EulaAccepted | Format-List
$global:MoreUpdates = 1
}
Else {
Write-Output "There are No Applicable Entries" | timestamp
Write-Output "There are No Applicable Entries" | timestamp | Out-File $Log -Append
$global:RestartRequired = 0
$global:MoreUpdates = 0
}
}
$script:ScriptName = $MyInvocation.MyCommand.ToString()
$script:ScriptPath = $MyInvocation.MyCommand.Path
$script:UpdateSession = New-Object -ComObject 'Microsoft.Update.Session'
$script:UpdateSession.ClientApplicationID = 'Packer Windows Update Installer'
$script:UpdateSearcher = $script:UpdateSession.CreateUpdateSearcher()
$script:SearchResult = New-Object -ComObject 'Microsoft.Update.UpdateColl'
$script:Cycles = 0
$script:ServiceName = "OpenSSHd"
Stop-Service $script:ServiceName -Force
Set-Service -Name $script:ServiceName -StartupType Disabled -Status Stopped
Check-WindowsUpdates
If ($global:MoreUpdates -eq 1) {
Install-WindowsUpdates
}
Else {
Check-ContinueRestartOrEnd
}
0 bits
•
917 views
Are you sure you want to delete?