From 24c0c6509fb670170e5d2def57b6d9acf063f603 Mon Sep 17 00:00:00 2001 From: David Wuibaille Date: Fri, 31 Oct 2025 08:55:43 +0100 Subject: [PATCH] Auto-commit: 2025-10-31 08:55:43 --- .gitignore | 8 + Connect-IntegratedDatabase/readme.md | 42 + Dashboard/readme.md | 37 + Dashboard/report.ps1 | 231 + auto-approval/approval.ps1 | 123 + auto-approval/readme.md | 31 + cleanup-server/CleanupWSUS.ps1 | 32 + cleanup-server/readme.md | 28 + generate-windows-update-log/readme.md | 10 + install-msu-web-download/installmsu.ps1 | 72 + install-msu-web-download/installmsuv2.ps1 | 250 + install-msu-web-download/installmsuv3.ps1 | 329 + install-msu-web-download/readme.md | 41 + report-failed-computers/Display.ps1 | 73 + report-failed-computers/readme.md | 27 + report-top-error-computers/DisplayToError.ps1 | 61 + report-top-error-computers/readme.md | 40 + reset-windows-update-agent/CleanFull.ps1 | 68 + reset-windows-update-agent/Cleanuplight.ps1 | 51 + reset-windows-update-agent/readme.md | 43 + sql-maintenance/Maintenance.sql | 118 + sql-maintenance/readme.md | 38 + .../2.2.0.3/PSGetModuleInfo.xml | Bin 0 -> 26706 bytes .../2.2.0.3/PSWUSettings.xml.tmp | Bin 0 -> 1250 bytes .../2.2.0.3/PSWindowsUpdate.Format.ps1xml | 616 + .../2.2.0.3/PSWindowsUpdate.dll | Bin 0 -> 320056 bytes .../2.2.0.3/PSWindowsUpdate.dll-Help.xml | 10653 ++++++++++++++++ .../2.2.0.3/PSWindowsUpdate.psd1 | Bin 0 -> 47542 bytes .../2.2.0.3/PSWindowsUpdate.psm1 | Bin 0 -> 35606 bytes uninstall-kb-pswindowsupdate/readme.md | 34 + uninstall-kb-pswindowsupdate/uninstallKB.ps1 | 36 + uninstall-kb-remove-windows-package/readme.md | 19 + .../remove.ps1 | 33 + 33 files changed, 13144 insertions(+) create mode 100644 Connect-IntegratedDatabase/readme.md create mode 100644 Dashboard/readme.md create mode 100644 Dashboard/report.ps1 create mode 100644 auto-approval/approval.ps1 create mode 100644 auto-approval/readme.md create mode 100644 cleanup-server/CleanupWSUS.ps1 create mode 100644 cleanup-server/readme.md create mode 100644 generate-windows-update-log/readme.md create mode 100644 install-msu-web-download/installmsu.ps1 create mode 100644 install-msu-web-download/installmsuv2.ps1 create mode 100644 install-msu-web-download/installmsuv3.ps1 create mode 100644 install-msu-web-download/readme.md create mode 100644 report-failed-computers/Display.ps1 create mode 100644 report-failed-computers/readme.md create mode 100644 report-top-error-computers/DisplayToError.ps1 create mode 100644 report-top-error-computers/readme.md create mode 100644 reset-windows-update-agent/CleanFull.ps1 create mode 100644 reset-windows-update-agent/Cleanuplight.ps1 create mode 100644 reset-windows-update-agent/readme.md create mode 100644 sql-maintenance/Maintenance.sql create mode 100644 sql-maintenance/readme.md create mode 100644 uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSGetModuleInfo.xml create mode 100644 uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWUSettings.xml.tmp create mode 100644 uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.Format.ps1xml create mode 100644 uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.dll create mode 100644 uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.dll-Help.xml create mode 100644 uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.psd1 create mode 100644 uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.psm1 create mode 100644 uninstall-kb-pswindowsupdate/readme.md create mode 100644 uninstall-kb-pswindowsupdate/uninstallKB.ps1 create mode 100644 uninstall-kb-remove-windows-package/readme.md create mode 100644 uninstall-kb-remove-windows-package/remove.ps1 diff --git a/.gitignore b/.gitignore index fff215c..6eba7e8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,11 @@ config*.json .env.* *.key *.pem +# Ignore local config.json +config.json + +# Ignore log files +*.log + +# Ignore CSV exports +*.csv diff --git a/Connect-IntegratedDatabase/readme.md b/Connect-IntegratedDatabase/readme.md new file mode 100644 index 0000000..50299b3 --- /dev/null +++ b/Connect-IntegratedDatabase/readme.md @@ -0,0 +1,42 @@ +# Connect to WSUS Integrated Database (WID) + +Connect locally to the WSUS Windows Internal Database (WID) via the named pipe to run maintenance or reporting against the `SUSDB` database. WID does not allow remote connections—run tools **on the WSUS server** with administrative privileges. + +## Prerequisites +- Run on the WSUS server, **elevated** (Run as Administrator). +- One of: SSMS, `sqlcmd`, or the PowerShell `SqlServer` module. +- Pipe (WID on Server 2012+): `\\.\pipe\MICROSOFT##WID\tsql\query` + Database: `SUSDB` + +## SSMS (GUI) +1. Start SSMS “Run as administrator”. +2. Server type: Database Engine + Server name: `\\.\pipe\MICROSOFT##WID\tsql\query` + Authentication: Windows Authentication +3. Connect and open a new query window. + +Quick smoke test: +```sql +SELECT @@VERSION AS SqlEngineVersion, DB_NAME() AS CurrentDatabase; +SELECT TOP (5) name, create_date FROM sys.tables ORDER BY create_date DESC; +``` +## sqlcmd (CLI) +```bat +:: Run locally on the WSUS server (elevated) +sqlcmd -S np:\\.\pipe\MICROSOFT##WID\tsql\query -d SUSDB -E -Q "SELECT TOP (1) GETDATE() AS ConnectedAt;" +``` + +## PowerShell (Invoke-Sqlcmd) +```PowerShell +Import-Module SqlServer + +$Instance = "\\.\pipe\MICROSOFT##WID\tsql\query" +$Database = "SUSDB" + +# One-liner test +Invoke-Sqlcmd -ServerInstance $Instance -Database $Database -Query "SELECT TOP (1) GETDATE() AS ConnectedAt;" + +# Run a maintenance script +$FileSql = ".\Maintenance.sql" # e.g., reindex/cleanup queries +Invoke-Sqlcmd -ServerInstance $Instance -Database $Database -InputFile $FileSql +``` \ No newline at end of file diff --git a/Dashboard/readme.md b/Dashboard/readme.md new file mode 100644 index 0000000..6f8de0d --- /dev/null +++ b/Dashboard/readme.md @@ -0,0 +1,37 @@ +# WSUS HTML Report (PowerShell) + +Generates a **single-page HTML dashboard** for WSUS: target-group inventory, KB deployment status (timeline + donuts), per-KB computer states, and a table of computers with failed updates. + +## Features +- Computers by **Target Group** (table + pie). +- KB status per group: **Installed vs Missing** and **approval age timeline**. +- Per-KB list of affected computers (hidden sections you can expand). +- **Failed** updates: computers in error. + +## Requirements +- Run on the **WSUS server** as Administrator. +- Module: `PSWriteHTML` + ```powershell + Install-Module PSWriteHTML -Scope CurrentUser + ``` +- WSUS API available (either the `UpdateServices` module or + `Microsoft.UpdateServices.Administration.dll` at + `"%ProgramFiles%\Update Services\Tools\Microsoft.UpdateServices.Administration.dll"`). +- The script uses `-Online` (CDN assets). Remove that flag if your server has no internet. + +## Quick start +```powershell +# 1) Save the script as: C:\Scripts\Wsus-Report.ps1 +# 2) Run it (elevated) +powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\Wsus-Report.ps1 +# Output: +# C:\exploit\report\default.htm +``` + +## Customize +- Output path: `$outFile` (default `C:\exploit\report\default.htm`). +- Exclusions for titles (ARM64, SSU, Flash, etc.) in the KB section. +- Table/chart IDs if you embed multiple reports. + +## Full article +https://blog.wuibaille.fr/2024/10/creating-a-wsus-dashboard/ diff --git a/Dashboard/report.ps1 b/Dashboard/report.ps1 new file mode 100644 index 0000000..e2a12f0 --- /dev/null +++ b/Dashboard/report.ps1 @@ -0,0 +1,231 @@ +#Requires -RunAsAdministrator +$ErrorActionPreference = 'Stop' + +# ****************************** MODULE IMPORT & INITIALIZATION ****************************** +# HTML reporting module +Import-Module -Name PSWriteHTML -ErrorAction Stop + +Write-Host "Starting WSUS report generation..." + +# Load WSUS admin assembly explicitly (no deprecated LoadWithPartialName) +$wsusDll = "$env:ProgramFiles\Update Services\Tools\Microsoft.UpdateServices.Administration.dll" +if (Test-Path $wsusDll) { Add-Type -Path $wsusDll } else { throw "WSUS Admin DLL not found: $wsusDll" } + +# Connect to local WSUS and pull data +$wsusServer = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer() +$updates = $wsusServer.GetUpdates() +$computers = $wsusServer.GetComputerTargets() +$targetGroups = $wsusServer.GetComputerTargetGroups() + +# Map groupId -> groupName for quick lookups +$groupHashTable = @{} +$targetGroups | ForEach-Object { $groupHashTable[$_.ID] = $_.Name } + +Write-Host "Retrieved WSUS data: Updates, Computers, and Target Groups." + +# Ensure output folder exists +$outFile = "C:\exploit\report\default.htm" +$outDir = Split-Path $outFile -Parent +if (-not (Test-Path $outDir)) { New-Item -Path $outDir -ItemType Directory -Force | Out-Null } + +# ****************************** REPORT GENERATION START ****************************** +New-HTML -TitleText 'WSUS Report' { + + # ****************************** COMPUTERS BY TARGET GROUP ****************************** + # Build a simple dataset: group name + computer count (skip 'All Computers') + $DataTable = New-Object System.Collections.Generic.List[Object] + foreach ($group in $targetGroups) { + $computersCount = $group.GetComputerTargets().Count + if ($computersCount -gt 0 -and $group.Name -ne 'All Computers') { + $DataTable.Add([PSCustomObject]@{ + TargetName = $group.Name + Total = $computersCount + }) + } + } + Write-Host "Populated DataTable with computer counts per Target Group." + + New-HTMLSection -HeaderText 'Computers By TargetGroup' { + # Table + New-HTMLPanel { + New-HTMLTable -DataTable $DataTable -HideFooter -DataTableID 'IDtargetGroup' { + # Bind events to the correct table ID + New-TableEvent -ID 'IDtargetGroup' -SourceColumnID 0 -TargetColumnId 0 + } + } + # Pie chart per group + New-HTMLPanel { + New-HTMLChart { + New-ChartToolbar -Download + foreach ($row in $DataTable) { New-ChartPie -Name $row.TargetName -Value $row.Total } + } + } + } + + # ****************************** COMPUTER LIST (HIDDEN) ****************************** + $ListeComputersWSUS = @() + foreach ($computer in $computers) { + foreach ($tg in $computer.GetComputerTargetGroups()) { + if ($tg.Name -ne 'All Computers') { + $ListeComputersWSUS += [PSCustomObject]@{ + TargetName = $tg.Name + ComputerName = $computer.FullDomainName + } + } + } + } + New-HTMLSection -HeaderText 'Computers' -Invisible { + New-HTMLTable -DataTable $ListeComputersWSUS -DataTableID 'AllComputertargetGroup' -HideFooter + } + + # ****************************** DEPLOYMENT STATUS OF KB UPDATES ****************************** + $DateNow = Get-Date + $ListeKB = @() + $MaxDaysReport = 90 # (kept for future filtering if needed) + + foreach ($update in $updates) { + foreach ($approval in $update.GetUpdateApprovals()) { + foreach ($tg in $targetGroups) { + if ($tg.Id -eq $approval.ComputerTargetGroupId) { + $DateKB = $approval.GoLiveTime + $LastChange = New-TimeSpan -Start $DateKB -End $DateNow + $ActionType = $approval.Action + + if ($ActionType -eq 'Install') { + $KBTitre = $update.Title + $installKB = 0; $MissKB = 0 + + # Summaries per group for this update + foreach ($sum in $update.GetSummaryPerComputerTargetGroup()) { + $groupName = $groupHashTable[$sum.ComputerTargetGroupId] + if ($tg.Name -eq $groupName) { + $installKB = $sum.InstalledCount + $sum.InstalledPendingRebootCount + $MissKB = $sum.UnknownCount + $sum.NotInstalledCount + $sum.DownloadedCount + $sum.FailedCount + } + } + + # Keep only meaningful KBs (exclude ARM64, SSU, Flash, specific KBs) + if (($installKB -ne 0 -or $MissKB -ne 0) -and + ($KBTitre -notmatch 'ARM64') -and + ($KBTitre -notmatch 'Servicing Stack Update') -and + ($KBTitre -notmatch 'Flash Player') -and + ($KBTitre -notlike '*KB4470788*') -and + ($KBTitre -notlike '*KB4499728*')) { + $ListeKB += [PSCustomObject]@{ + KBTitre = $KBTitre + KBGroup = $tg.Name + KBChang = $LastChange.Days + ActionType = $ActionType + installKB = $installKB + MissKB = $MissKB + } + } + } + } + } + } + } + + # Sort by age then title; get unique titles for chart grouping + $ListeKB = $ListeKB | Sort-Object KBChang, KBTitre + $groupedByTitle = @{} + foreach ($o in $ListeKB) { + if (-not $groupedByTitle.ContainsKey($o.KBTitre)) { $groupedByTitle[$o.KBTitre] = @() } + $groupedByTitle[$o.KBTitre] += $o + } + + foreach ($Title in $groupedByTitle.Keys) { + # Timeline per group (how many days since approval) + New-HTMLSection -HeaderText $Title { + New-HTMLChart -Title $Title -TitleAlignment center { + foreach ($o in $groupedByTitle[$Title]) { + New-ChartTimeline -DateFrom (Get-Date).AddDays(-$o.KBChang - 1) -DateTo (Get-Date) -Name $o.KBGroup + } + } + } + + # Donut charts (Installed vs Missing) per group – hidden + New-HTMLSection -HeaderText 'Computers' -Invisible { + foreach ($o in $groupedByTitle[$Title]) { + New-HTMLPanel { + New-HTMLChart -Title $o.KBGroup { + New-ChartLegend -Name "Installed","Missing" -Color Green,Red + New-ChartDonut -Name "Installed" -Value $o.installKB + New-ChartDonut -Name "Missing" -Value $o.MissKB + } + } + } + } + + # ------------------------- KB and Computers status table (hidden) ------------------------- + $updateScope2 = New-Object Microsoft.UpdateServices.Administration.UpdateScope + $updateScope2.ApprovedStates = [Microsoft.UpdateServices.Administration.ApprovedStates]::LatestRevisionApproved + $updateScope2.UpdateApprovalActions = [Microsoft.UpdateServices.Administration.UpdateApprovalActions]::Install + $updateScope2.UpdateSources = [Microsoft.UpdateServices.Administration.UpdateSources]::MicrosoftUpdate + $updateScope2.ExcludedInstallationStates = @('NotApplicable','Installed','InstalledPendingReboot') + + $allComputers = $wsusServer.GetComputerTargets() + $resultsComputerStatus = @() + + foreach ($pc in $allComputers) { + $updatelist = $pc.GetUpdateInstallationInfoPerUpdate($updateScope2) + foreach ($ui in $updatelist) { + $updInfo = $ui.GetUpdate() + $approvalGroup = $ui.GetUpdateApprovalTargetGroup().Name + if ($approvalGroup -ne 'All Computers' -and $updInfo.IsApproved) { + $resultsComputerStatus += [pscustomobject][Ordered]@{ + ComputerName = $pc.FullDomainName + Status = $ui.UpdateInstallationState + ApprovalTargetGroup= $approvalGroup + Approved = $updInfo.IsApproved + Title = $updInfo.Title + } + } + } + } + + New-HTMLSection -HeaderText 'Computers' -Invisible { + foreach ($o in $groupedByTitle[$Title]) { + New-HTMLPanel { + $specific = $resultsComputerStatus | + Where-Object { $_.Title -like "*$Title*" -and $_.ApprovalTargetGroup -like "*$($o.KBGroup)*" } | + Select-Object ComputerName, Status + New-HTMLTable -DataTable $specific -HideFooter -HideButtons + } + } + } + } + + # ****************************** COMPUTERS IN ERROR ****************************** + $computersInError = @() + $updateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope + $updateScope.IncludedInstallationStates = 'Failed' + $computerScope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope + $computerScope.IncludedInstallationStates = 'Failed' + + $computersInError = $wsusServer.GetComputerTargets($computerScope) | ForEach-Object { + $compName = $_.FullDomainName + $failedTitles = ($_.GetUpdateInstallationInfoPerUpdate($updateScope) | ForEach-Object { + $_.GetUpdate().Title + }) -join ', ' + if ($failedTitles) { + [pscustomobject]@{ + Computername = $compName + TargetGroups = ($_.GetComputerTargetGroups() | Select-Object -ExpandProperty Name) -join ', ' + Updates = $failedTitles + } + } + } | Sort-Object Computername + + New-HTMLSection -HeaderText 'Computers in ERROR' { + New-HTMLTable -DataTable $computersInError -DataTableID 'NewIDtoSearchInChartERR' -HideFooter + } + + # ****************************** FOOTER ****************************** + New-HTMLFooter { + New-HTMLText -Text ("Report generated (GMT): {0:u}" -f (Get-Date).ToUniversalTime()) -Color Blue -Alignment center + } + +} -FilePath $outFile -Online + +Write-Host "WSUS report has been generated successfully at $outFile" diff --git a/auto-approval/approval.ps1 b/auto-approval/approval.ps1 new file mode 100644 index 0000000..749c1b0 --- /dev/null +++ b/auto-approval/approval.ps1 @@ -0,0 +1,123 @@ +$SyncApprovals = @( + # Sync TESTERS -> PILOT + @{ + "Source" = "Pilot" # Source group: TESTERS + "Target" = "Global1" # Target group: PILOT + "MinDays" = 5 # Minimum number of days before synchronization + }, + + # Sync PILOT -> PROD + @{ + "Source" = "Global1" # Source group: PILOT + "Target" = "Global2" # Target group: PROD + "MinDays" = 5 # Minimum number of days before synchronization + } +) + +$logFolder = "C:\logs" +$maxLogs = 60 + +# Ensure the log folder exists (create if missing) +If (-not (Test-Path $logFolder)) { + New-Item -Path $logFolder -ItemType Directory + Write-Host "The directory $logFolder has been created." +} else { + Write-Host "The directory $logFolder already exists." +} + +# Limit the number of log files (keep the most recent $maxLogs) +$logFiles = Get-ChildItem -Path $logFolder -Filter "WSUS-ManageApprovals*.log" | Sort-Object LastWriteTime -Descending +if ($logFiles.Count -gt $maxLogs) { + $logFiles | Select-Object -Skip $maxLogs | Remove-Item -Force +} + +# Build current log file path +$logFile = Join-Path $logFolder ("WSUS-ManageApprovals" + (Get-Date -format "yyyyMMdd-HHmmss") + ".log") + +# Connect to the WSUS server +Try { + [reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | Out-Null + $wsusServer = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer() + $subscription = $wsusServer.GetSubscription() + $wsusServerConfig = $wsusServer.GetConfiguration() + $targetGroups = $wsusServer.GetComputerTargetGroups() + $updates = $wsusServer.GetUpdates() +} Catch { + Write-Output "Error connecting to the WSUS server: $_" | Add-Content -Path $logFile + Exit +} + +# Start a WSUS synchronization (non-blocking) +Try { + $subscription.StartSynchronization() + Write-Output "Synchronization successfully started." | Add-Content -Path $logFile +} Catch { + Write-Output "Error during WSUS synchronization: $_" | Add-Content -Path $logFile + Exit +} + +# Filter working updates (exclude declined) and accept EULAs if needed +$workingUpdates = $updates | Where-Object { -not $_.IsDeclined } +Foreach ($update in $workingUpdates) { + # Accept license agreement if required + If ($update.RequiresLicenseAgreementAcceptance) { + $update.AcceptLicenseAgreement() + Write-Output "License accepted for: $($update.Title)" | Add-Content -Path $logFile + } +} + +# Approve updates to target groups after MinDays since source approval GoLiveTime +Write-Output "********** Approve KB **********" | Add-Content -Path $logFile +Foreach ($update in $workingUpdates) { + $approvals = $update.GetUpdateApprovals() + Foreach ($syncApproval in $SyncApprovals) { + $sourceGroup = $targetGroups | Where-Object { $_.Name -eq $syncApproval.Source } + + # Ensure source group exists and action is Install + If ($sourceGroup) { + $sourceApproval = $approvals | Where-Object { $_.ComputerTargetGroupId -eq $sourceGroup.ID } + If ($sourceApproval -and $($sourceApproval.Action) -eq "Install") { + # Check if enough days have passed since GoLiveTime + $LastChangeKB = (New-TimeSpan -Start $sourceApproval.GoLiveTime -End (Get-Date)).Days + If ($LastChangeKB -ge $syncApproval.MinDays) { + $targetGroup = $targetGroups | Where-Object { $_.Name -eq $syncApproval.Target } + $targetApproval = $approvals | Where-Object { $_.ComputerTargetGroupId -eq $targetGroup.ID } + + # Approve the update if it's not already approved for installation + If ($($targetApproval.Action) -ne "Install") { + Write-Output "Approving: $($syncApproval.Target) => $($update.Title) - $LastChangeKB days" | Add-Content -Path $logFile + $update.Approve("Install", $targetGroup) | Out-Null + } + } + } + } else { + Write-Output "Source group $($syncApproval.Source) not found." | Add-Content -Path $logFile + } + } +} + +# Decline superseded updates if a superseding one is installed for the expected target groups +Write-Output "********** Disable Superseded Updates **********" | Add-Content -Path $logFile +$workingUpdates = $workingUpdates | Where-Object { $_.IsSuperseded } +Foreach ($update in $workingUpdates) { + Write-Output "$($update.Title)" | Add-Content -Path $logFile + + # Find updates that supersede the current update + Foreach ($Supersede in $update.GetRelatedUpdates([Microsoft.UpdateServices.Administration.UpdateRelationship]::UpdatesThatSupersedeThisUpdate)) { + Write-Output "----- Replaced By: $($Supersede.Title)" | Add-Content -Path $logFile + $approvals = $Supersede.GetUpdateApprovals() + + # If a superseding update is approved for Install in Global2, decline the superseded one + Foreach ($approval in $approvals) { + Foreach ($targetGroup in $targetGroups) { + If (($targetGroup.Id -eq $approval.ComputerTargetGroupId) -and ($($approval.Action) -eq "Install")) { + Write-Output "---------- $($targetGroup.Name)" | Add-Content -Path $logFile + if ($($targetGroup.Name) -eq "Global2") { # fixed: target group is Global2 + Write-Output "---------- Declining: $($update.Title)" | Add-Content -Path $logFile + $update.Decline() + } + } + } + } + } +} diff --git a/auto-approval/readme.md b/auto-approval/readme.md new file mode 100644 index 0000000..98ad3b0 --- /dev/null +++ b/auto-approval/readme.md @@ -0,0 +1,31 @@ +# WSUS – Automate Patch Assignment to Groups + +PowerShell script to automatically **promote WSUS approvals** across groups after a delay, accept EULAs, and decline superseded updates when a newer update is approved in production. + +## What it does +- Sync approvals after X days: + - `Pilot → Global1` + - `Global1 → Global2` +- Accept license agreements when required. +- Decline superseded updates if a superseding update is approved for **Global2**. +- Write rotating logs to `C:\Logs` (keeps the latest 60 files). + +## Requirements +- Run on the WSUS server with **Administrator** privileges. +- WSUS installed (PowerShell `UpdateServices` module or the WSUS Admin DLL available). +- Existing WSUS groups: `Pilot`, `Global1`, `Global2` (adjust names if different). + +## Configuration +Edit the top of the script: +- `\$SyncApprovals` – define source/target groups and `MinDays`. +- `\$logFolder`, `\$maxLogs` – logging folder and retention. +- Superseded-decline rule currently targets `Global2`. + +## Quick start +```powershell +# Run the script (no parameters) +.\Wsus-ManageApprovals.ps1 +``` + +## Full documentation +https://blog.wuibaille.fr/2024/10/automate-assign-patch-to-group/ \ No newline at end of file diff --git a/cleanup-server/CleanupWSUS.ps1 b/cleanup-server/CleanupWSUS.ps1 new file mode 100644 index 0000000..bc6b433 --- /dev/null +++ b/cleanup-server/CleanupWSUS.ps1 @@ -0,0 +1,32 @@ +#Requires -RunAsAdministrator +[CmdletBinding()] +param( + [string]$ServerName = 'localhost', + [int]$Port = 8530, + [switch]$UseSsl +) + +# Load the WSUS admin assembly explicitly if the module isn't present +$wsusDll = "$env:ProgramFiles\Update Services\Tools\Microsoft.UpdateServices.Administration.dll" +if (-not (Get-Module -ListAvailable UpdateServices)) { + if (Test-Path $wsusDll) { Add-Type -Path $wsusDll } else { throw "WSUS Admin DLL not found: $wsusDll" } +} + +try { + $wsusServer = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer($ServerName, [bool]$UseSsl, $Port) + $cleanupInterface = $wsusServer.GetCleanupManager() + $cleanupScope = New-Object Microsoft.UpdateServices.Administration.CleanupScope + $cleanupScope.DeclineSupersededUpdates = $true + $cleanupScope.DeclineExpiredUpdates = $true + $cleanupScope.CleanupObsoleteComputers = $true + $cleanupScope.CleanupObsoleteUpdates = $true + $cleanupScope.CompressUpdates = $true + $cleanupScope.CleanupUnneededContentFiles = $true + + $cleanupInterface.PerformCleanup($cleanupScope) + Write-Host "WSUS cleanup completed." +} +catch { + Write-Error "WSUS cleanup failed: $($_.Exception.Message)" + exit 1 +} diff --git a/cleanup-server/readme.md b/cleanup-server/readme.md new file mode 100644 index 0000000..66d3395 --- /dev/null +++ b/cleanup-server/readme.md @@ -0,0 +1,28 @@ +# WSUS Cleanup (PowerShell) + +Powershell scripts to run a safe, repeatable **WSUS** cleanup: +- Decline superseded/expired updates +- Remove obsolete updates/computers +- Compress updates +- Delete unneeded content files + +Works with the supported WSUS cmdlets (`UpdateServices` module). A legacy .NET fallback is included. + +--- + +## Requirements +- Run on the WSUS server in an **elevated** PowerShell session. +- WSUS PowerShell module: `UpdateServices` (installed with WSUS/RSAT). +- Port **8530** (HTTP) or **8531** (HTTPS). +- Expect long runtimes on large servers; schedule outside business hours. + +## Quick start + +```powershell +# Standard full cleanup (HTTP 8530) +.\Wsus-Cleanup.ps1 -Verbose + +# HTTPS on 8531 +.\Wsus-Cleanup.ps1 -UseSsl -Port 8531 -Verbose +``` + diff --git a/generate-windows-update-log/readme.md b/generate-windows-update-log/readme.md new file mode 100644 index 0000000..f972dbe --- /dev/null +++ b/generate-windows-update-log/readme.md @@ -0,0 +1,10 @@ +# Generate a Windows Update Log + +## Procedure + +1) Generate the Windows Update log file +Use the `Get-WindowsUpdateLog` cmdlet in PowerShell to merge the Windows Update ETL files into a single log file. + +2) Locate the generated log file +`Get-WindowsUpdateLog` creates `WindowsUpdate.log` on your Desktop by default. + diff --git a/install-msu-web-download/installmsu.ps1 b/install-msu-web-download/installmsu.ps1 new file mode 100644 index 0000000..188bafb --- /dev/null +++ b/install-msu-web-download/installmsu.ps1 @@ -0,0 +1,72 @@ +# MSU Prerequisite Check and Install Script + +$LogPath = "C:\Windows\Temp\MSU_Install.log" + +function Write-Log { + param([string]$Message) + $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + Add-Content -Path $LogPath -Value "$timestamp $Message" + Write-Host $Message +} + +# Check 1: Reboot pending +$RebootRegKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired' +if (Test-Path $RebootRegKey) { + Write-Log "Pending reboot detected." + exit 101 +} else { + Write-Log "No pending reboot." +} + +# Check 3: Free space on C: +$minFreeGB = 5 +$drive = Get-PSDrive -Name C +if ($null -eq $drive -or ($drive.Free/1GB) -lt $minFreeGB) { + Write-Log "Insufficient free space on C:. Required: ${minFreeGB}GB" + exit 103 +} else { + Write-Log ("Sufficient free space on C:. Free: {0:N2}GB" -f ($drive.Free/1GB)) +} + +# MSU download info +$MSUFile = "windows10.0-kb5060531-x64.msu" +$MSUUrl = "https://catalog.s.download.windowsupdate.com/c/msdownload/update/software/secu/2025/06/windows10.0-kb5060531-x64_83789c3b9350e10e207370622c4ef54dd685ee02.msu" +$ScriptDir = "c:\windows\temp" +$MSUPath = Join-Path $ScriptDir $MSUFile + +# Always delete the MSU file before download +if (Test-Path $MSUPath) { + Write-Log "Deleting existing MSU file: $MSUPath" + Remove-Item -Path $MSUPath -Force -ErrorAction SilentlyContinue +} + +try { + Write-Log "Downloading MSU from $MSUUrl using System.Net.WebClient" + $sw = [System.Diagnostics.Stopwatch]::StartNew() + $wc = New-Object System.Net.WebClient + $wc.DownloadFile($MSUUrl, $MSUPath) + $sw.Stop() + $downloadTime = "{0:N2}" -f $sw.Elapsed.TotalSeconds + + if (-not (Test-Path $MSUPath)) { + Write-Log "Failed to download MSU (file not found after download)" + exit 104 + } else { + Write-Log "Download completed: $MSUPath" + Write-Log "Download time: $downloadTime seconds" + } +} catch { + Write-Log "Failed to download MSU with WebClient: $_" + exit 104 +} + +Write-Log "Starting installation of $MSUPath" + +# Install the MSU silently, no restart +$process = Start-Process -FilePath "wusa.exe" -ArgumentList "`"$MSUPath`" /quiet /norestart" -Wait -PassThru +$exitCode = $process.ExitCode + +Write-Log "wusa.exe exit code: $exitCode" + +# Return the exit code as the script's own exit code +exit $exitCode diff --git a/install-msu-web-download/installmsuv2.ps1 b/install-msu-web-download/installmsuv2.ps1 new file mode 100644 index 0000000..05d7390 --- /dev/null +++ b/install-msu-web-download/installmsuv2.ps1 @@ -0,0 +1,250 @@ +#requires -version 5.1 +<# + MSU Prereq + Install + WS logging + STRICT selection by FULL BUILD (major.UBR) + - Mapping is downloaded from https://nas.wuibaille.fr/WS/patchs/msu.json + - Supports multiple packages per build (e.g., SSU then LCU) + - JSON needs only: { "": { "packages": [ { "url": "...", "type": "LCU", "order": 20 }, ... ] } } + - No defaults: if build key missing -> exit 111 + - If JSON cannot be downloaded and no cache -> exit 112 + - If cached JSON invalid -> exit 113 +#> + +# -------- Settings -------- +$ErrorActionPreference = 'Stop' +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$ProgressPreference = 'SilentlyContinue' + +$ComputerName = $env:COMPUTERNAME +$LogPath = "C:\Windows\Temp\MSU_Install.log" +$ApiUrl = "https://nas.wuibaille.fr/WS/message.php" +$SendLogsToWS = $true + +# Remote JSON map + local cache +$MsuMapUrl = "https://nas.wuibaille.fr/WS/patchs/msu.json" +$MsuMapCache = "C:\Windows\Temp\msu.json" + +# Optional: force a build key like '17763.7786' +$OverrideBuildFull = $null + +# -------- Helpers -------- +function Write-Log { + param([Parameter(Mandatory)][string]$Message) + $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + $fullMessage = "[$ComputerName] $Message" + Add-Content -Path $LogPath -Value "$timestamp $fullMessage" -Encoding UTF8 + Write-Host $fullMessage + if ($SendLogsToWS) { + try { + $body = @{ message = $fullMessage } | ConvertTo-Json -Depth 2 + $null = Invoke-RestMethod -Uri $ApiUrl -Method POST -Body $body -ContentType "application/json" -TimeoutSec 10 -ErrorAction Stop + } catch { + Write-Warning ("[$ComputerName] Webservice log failed: {0}" -f $_.Exception.Message) + } + } +} + +function Get-BuildFull { + # Returns PSCustomObject with BuildMajor, UBR, BuildFull="major.UBR" + $cvPath = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' + $cv = Get-ItemProperty -LiteralPath $cvPath + + $buildStr = [string]$cv.CurrentBuild + if ([string]::IsNullOrWhiteSpace($buildStr)) { $buildStr = [string]$cv.CurrentBuildNumber } + $buildMajor = [int]$buildStr + + $ubr = 0; try { $ubr = [int]$cv.UBR } catch {} + + [PSCustomObject]@{ + BuildMajor = $buildMajor + UBR = $ubr + BuildFull = ('{0}.{1}' -f $buildMajor, $ubr) + } +} + +function Get-MSUMapFromJson { + # Downloads JSON (and caches it). On failure, tries cache; else exits. + Write-Log ("Fetching MSU map: {0}" -f $MsuMapUrl) + try { + $json = Invoke-RestMethod -Uri $MsuMapUrl -Method GET -TimeoutSec 15 -ErrorAction Stop + try { ($json | ConvertTo-Json -Depth 10) | Out-File -FilePath $MsuMapCache -Encoding UTF8 -Force } catch {} + return $json + } catch { + Write-Log ("Online map fetch failed: {0}" -f $_.Exception.Message) + if (Test-Path -LiteralPath $MsuMapCache) { + Write-Log ("Using cached map: {0}" -f $MsuMapCache) + try { + $raw = Get-Content -LiteralPath $MsuMapCache -Raw -ErrorAction Stop + $json = $raw | ConvertFrom-Json -ErrorAction Stop + return $json + } catch { + Write-Log ("Cached map is invalid: {0}. Exiting 113." -f $_.Exception.Message) + exit 113 + } + } else { + Write-Log "No cached map available. Exiting 112." + exit 112 + } + } +} + +function Ensure-PackagesArray { + param( + [Parameter(Mandatory)]$Entry, + [Parameter(Mandatory)][string]$KeyForErrors + ) + <# + Accepts: + - { "packages": [ { "url": "...", "type": "LCU", "order": 20 }, ... ] } + - { "url": "..." } (single package) + - "https://..." (single package as string) + Returns: array of package objects with at least .url + #> + if ($Entry -is [string]) { + if ($Entry -notmatch '^https?://') { throw "Invalid entry for build '$KeyForErrors': expected URL string." } + return @(@{ url = $Entry; type = $null; order = $null }) + } + + $props = @($Entry.PSObject.Properties.Name) + if ($props -contains 'packages') { + $arr = @($Entry.packages) + if (-not $arr -or $arr.Count -eq 0) { throw "Entry for build '$KeyForErrors' has empty 'packages'." } + foreach ($p in $arr) { + if (-not $p.url) { throw "One package in build '$KeyForErrors' is missing 'url'." } + } + return $arr + } + + if ($props -contains 'url') { + return @(@{ url = [string]$Entry.url; type = $Entry.type; order = $Entry.order }) + } + + throw "Invalid entry format for build '$KeyForErrors'. Expected 'packages' array or 'url' string/property." +} + +function Sort-Packages { + param([Parameter(Mandatory)][array]$Packages) + # Priority: explicit 'order' asc, else by 'type' (SSU=10, LCU=20, NET=30, other=50) + $prio = @{ 'SSU' = 10; 'LCU' = 20; 'NET' = 30 } + return $Packages | Sort-Object ` + @{ Expression = { if ($_.order -ne $null -and "$($_.order)" -match '^\d+$') { [int]$_.order } else { 999 } } }, + @{ Expression = { $t = ("" + $_.type).ToUpper(); if ($prio.ContainsKey($t)) { $prio[$t] } else { 50 } } } +} + +function Resolve-PackagesForBuild { + param( + [Parameter(Mandatory)]$BuildInfo, + [Parameter(Mandatory)]$JsonMap, + [string]$OverrideBuildFull + ) + $key = if ([string]::IsNullOrWhiteSpace($OverrideBuildFull)) { $BuildInfo.BuildFull } else { $OverrideBuildFull } + + # Convert root object to hashtable keyed by build strings + $map = @{} + foreach ($p in $JsonMap.PSObject.Properties) { $map[$p.Name] = $p.Value } + + if (-not $map.ContainsKey($key)) { throw ("No MSU mapping defined for full build '{0}'." -f $key) } + + $entry = $map[$key] + $packages = Ensure-PackagesArray -Entry $entry -KeyForErrors $key + $packages = Sort-Packages -Packages $packages + return @{ Key=$key; Packages=$packages } +} + +function Test-IsAdmin { + $wi = [Security.Principal.WindowsIdentity]::GetCurrent() + $wp = [Security.Principal.WindowsPrincipal]::new($wi) + return $wp.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) +} + +function Filename-FromUrl { + param([Parameter(Mandatory)][string]$Url) + try { + $u = [Uri]$Url + $name = [IO.Path]::GetFileName($u.AbsolutePath) + if ([string]::IsNullOrWhiteSpace($name)) { $name = "update.msu" } + } catch { $name = "update.msu" } + if ($name -notmatch '\.msu$') { $name = "$name.msu" } + return $name +} + +# -------- Script start -------- +if (-not (Test-IsAdmin)) { Write-Log "Warning: Script is not running elevated." } + +# Build detection +$b = Get-BuildFull +Write-Log ("Detected OS: Build={0}" -f $b.BuildFull) + +# Load mapping + resolve package list +$msuJson = Get-MSUMapFromJson +try { + $sel = Resolve-PackagesForBuild -BuildInfo $b -JsonMap $msuJson -OverrideBuildFull $OverrideBuildFull + Write-Log ("Selected {0} package(s) for Build={1}" -f $sel.Packages.Count, $sel.Key) +} catch { + Write-Log ("MSU selection error: {0}. Exiting 111." -f $_.Exception.Message) + exit 111 +} + +# Checks +try { + $RebootRegKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired' + if (Test-Path $RebootRegKey) { Write-Log "Pending reboot detected. Exiting 101."; exit 101 } +} catch { Write-Log ("Error while checking free space: {0}" -f $_.Exception.Message); exit 199 } + +try { + $minFreeGB = 5 + $drive = Get-PSDrive -Name C -ErrorAction Stop + $freeGB = [math]::Round(($drive.Free/1GB),2) + if ($freeGB -lt $minFreeGB) { Write-Log ("Insufficient free space: required {0}GB, available {1}GB. Exiting 103." -f $minFreeGB, $freeGB); exit 103 } +} catch { Write-Log ("Error while checking free space: {0}" -f $_.Exception.Message); exit 198 } + +# Download + install each package in order +$ScriptDir = "C:\Windows\Temp" +if (-not (Test-Path -LiteralPath $ScriptDir)) { New-Item -ItemType Directory -Path $ScriptDir -Force | Out-Null } + +$anyNeedReboot = $false +$anyInstalled = $false + +foreach ($pkg in $sel.Packages) { + $url = [string]$pkg.url + if ([string]::IsNullOrWhiteSpace($url)) { Write-Log "Package without URL encountered. Aborting (bad JSON)."; exit 113 } + $type = ("" + $pkg.type) + $fileName = Filename-FromUrl -Url $url + $destPath = Join-Path $ScriptDir $fileName + + Write-Log ("Downloading {0}{1} from {2}" -f (if ($type) { "[$type] " } else { "" }), $fileName, $url) + try { + $wc = New-Object System.Net.WebClient + try { + $wc.Headers['User-Agent'] = ("MSU-Installer/1.0 ({0})" -f $ComputerName) + if (Test-Path -LiteralPath $destPath) { Remove-Item -LiteralPath $destPath -Force -ErrorAction Stop } + $wc.DownloadFile($url, $destPath) + } finally { if ($wc) { $wc.Dispose() } } + if (-not (Test-Path -LiteralPath $destPath)) { Write-Log "Download failed: file not found after download. Exiting 104."; exit 104 } + } catch { + Write-Log ("Failed to download package {0}: {1}. Exiting 104." -f $fileName, $_.Exception.Message) + exit 104 + } + + Write-Log ("Installing {0}{1}" -f (if ($type) { "[$type] " } else { "" }), $fileName) + try { + $proc = Start-Process -FilePath "wusa.exe" -ArgumentList "`"$destPath`" /quiet /norestart" -Wait -PassThru + $code = $proc.ExitCode + Write-Log ("wusa.exe exit code: {0} for {1}" -f $code, $fileName) + + if ($code -eq 3010) { $anyNeedReboot = $true; $anyInstalled = $true } + elseif ($code -eq 0) { $anyInstalled = $true } + elseif ($code -eq 2359302) { } # already installed, continue + else { + Write-Log ("Installation failed for {0} with code {1}. Aborting." -f $fileName, $code) + exit $code + } + } catch { + Write-Log ("Installation failed for {0}: {1}" -f $fileName, $_.Exception.Message) + exit 195 + } +} + +# Overall exit code policy +if ($anyNeedReboot) { exit 3010 } +elseif ($anyInstalled) { exit 0 } +else { exit 2359302 } diff --git a/install-msu-web-download/installmsuv3.ps1 b/install-msu-web-download/installmsuv3.ps1 new file mode 100644 index 0000000..c0787e9 --- /dev/null +++ b/install-msu-web-download/installmsuv3.ps1 @@ -0,0 +1,329 @@ +#requires -version 5.1 +<# + Auto-install latest OS cumulative updates using PSWindowsUpdate (no JSON) + - Forces Windows Update public service (-WindowsUpdate) + - Installs SSU (if present) first, then latest non-Preview LCU + - ASCII-only logs; messages sanitized before sending to web service +#> + +# -------- Settings -------- +$ErrorActionPreference = 'Stop' +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$ProgressPreference = 'SilentlyContinue' + +$ComputerName = $env:COMPUTERNAME +$LogPath = "C:\Windows\Temp\MSU_Install.log" +$ApiUrl = "https://nas.wuibaille.fr/WS/message.php" +$SendLogsToWS = $true + +# Optional WS retry tunables (defaults: 6 tries, 1s delay) +$script:WsMaxRetries = 6 +$script:WsRetryDelaySec = 1 + +# Module install policy +$AllowInstallPSWindowsUpdate = $true + +# -------- Utilities -------- +function Sanitize-Ascii { + param([string]$Text) + if ($null -eq $Text) { return "" } + + $t = $Text + $t = $t -replace [char]0x2013, "-" # en dash + $t = $t -replace [char]0x2014, "-" # em dash + $t = $t -replace [char]0x2026, "..." # ellipsis + $t = $t -replace [char]0x2018, "'" # left single quote + $t = $t -replace [char]0x2019, "'" # right single quote + $t = $t -replace [char]0x201C, '"' # left double quote + $t = $t -replace [char]0x201D, '"' # right double quote + $t = $t -replace [char]0x00A0, " " # nbsp + $t = $t -replace [char]0x2022, "-" # bullet + $t = [System.Text.RegularExpressions.Regex]::Replace($t, '[^\x09\x0A\x0D\x20-\x7E]', '') + return $t +} + +# -------- Logging -------- +function Write-Log { + param([Parameter(Mandatory)][string]$Message) + + $msg = Sanitize-Ascii $Message + $full = "[$env:COMPUTERNAME] $msg" + $ts = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + + Add-Content -Path $LogPath -Value "$ts $full" -Encoding UTF8 + Write-Host $full + + if (-not $SendLogsToWS) { return } + + $payload = @{ message = $full } | ConvertTo-Json -Compress + $bytes = [System.Text.Encoding]::UTF8.GetBytes($payload) + + $max = if ($script:WsMaxRetries) { [int]$script:WsMaxRetries } else { 6 } + $delay = if ($script:WsRetryDelaySec) { [int]$script:WsRetryDelaySec } else { 1 } + + $ok = $false + $lastErr = $null + + for ($attempt = 1; $attempt -le $max -and -not $ok; $attempt++) { + try { + $null = Invoke-RestMethod -Uri $ApiUrl -Method POST -Body $bytes ` + -ContentType 'application/json; charset=utf-8' -TimeoutSec 10 -ErrorAction Stop + $ok = $true + } catch { + $lastErr = $_.Exception.Message + if ($attempt -lt $max) { Start-Sleep -Seconds $delay } + } + } + + if (-not $ok) { + Write-Warning "[$env:COMPUTERNAME] Webservice log failed after $max attempts: $lastErr" + } +} + +# -------- Prereqs -------- +function Test-IsAdmin { + $wi = [Security.Principal.WindowsIdentity]::GetCurrent() + $wp = [Security.Principal.WindowsPrincipal]::new($wi) + return $wp.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) +} + +function Get-BuildFull { + $cv = Get-ItemProperty -LiteralPath 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' + $buildStr = [string]$cv.CurrentBuild + if ([string]::IsNullOrWhiteSpace($buildStr)) { $buildStr = [string]$cv.CurrentBuildNumber } + $major = [int]$buildStr + $ubr = 0; try { $ubr = [int]$cv.UBR } catch {} + [PSCustomObject]@{ BuildMajor=$major; UBR=$ubr; BuildFull=("{0}.{1}" -f $major,$ubr) } +} + +# -------- PSWindowsUpdate bootstrap (silent) -------- +function Ensure-PSWindowsUpdate { + try { + Import-Module PSWindowsUpdate -ErrorAction Stop + $m = Get-Module PSWindowsUpdate + Write-Log ("PSWindowsUpdate module loaded (v{0})." -f $m.Version) + return $true + } catch {} + + if (-not $AllowInstallPSWindowsUpdate) { + Write-Log "PSWindowsUpdate module not found and auto-install is disabled. Exiting 120." + exit 120 + } + + $scope = if (Test-IsAdmin) { 'AllUsers' } else { 'CurrentUser' } + + try { + $nuget = Get-PackageProvider -Name NuGet -ListAvailable -ErrorAction SilentlyContinue | + Sort-Object Version -Descending | Select-Object -First 1 + if (-not $nuget -or ([Version]$nuget.Version -lt [Version]"2.8.5.201")) { + Write-Log "Installing NuGet provider silently..." + Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Scope $scope -ErrorAction Stop + } + + $repo = Get-PSRepository -Name PSGallery -ErrorAction SilentlyContinue + if (-not $repo) { + Write-Log "Registering PSGallery repository..." + try { Register-PSRepository -Default -ErrorAction Stop } catch {} + $repo = Get-PSRepository -Name PSGallery -ErrorAction SilentlyContinue + } + if ($repo -and $repo.InstallationPolicy -ne 'Trusted') { + Write-Log "Setting PSGallery as Trusted..." + Set-PSRepository -Name PSGallery -InstallationPolicy Trusted -ErrorAction SilentlyContinue + } + + try { + $psget = Get-Module -ListAvailable PowerShellGet | Sort-Object Version -Descending | Select-Object -First 1 + if (-not $psget -or ([Version]$psget.Version -lt [Version]"2.2.5")) { + Write-Log "Updating PowerShellGet silently..." + Install-Module PowerShellGet -Scope $scope -Force -AllowClobber -ErrorAction Stop + } + } catch { + Write-Log ("PowerShellGet update failed (continuing): {0}" -f $_.Exception.Message) + } + + Write-Log "Installing PSWindowsUpdate silently..." + Install-Module PSWindowsUpdate -Scope $scope -Force -AllowClobber -ErrorAction Stop + + Import-Module PSWindowsUpdate -ErrorAction Stop + $m = Get-Module PSWindowsUpdate + Write-Log ("PSWindowsUpdate installed and loaded (v{0})." -f $m.Version) + return $true + } catch { + Write-Log ("Failed to install/load PSWindowsUpdate: {0}. Exiting 120." -f $_.Exception.Message) + exit 120 + } +} + +# -------- Discovery & Install using PSWindowsUpdate -------- +function Get-AvailableOSUpdates { + # Returns: @{ SSU = ; LCU = ; Raw = } + try { + $raw = Get-WindowsUpdate -WindowsUpdate -UpdateType Software -IgnoreReboot -ErrorAction Stop + } catch { + Write-Log ("Windows Update query failed: {0}" -f $_.Exception.Message) + Write-Log "This system may be WSUS-managed or blocked by policy/network. Exiting 121." + exit 121 + } + + if (-not $raw) { + return [PSCustomObject]@{ SSU=$null; LCU=$null; Raw=@() } + } + + $filtered = $raw | Where-Object { + $_.Title -and + ($_.Title -notmatch 'Preview') -and + ($_.Title -notmatch 'for\s*\.NET') -and + ($_.Categories -notcontains 'Drivers') -and + ($_.Categories -notcontains 'Definition Updates') + } + + $norm = { + param($s) + if (-not $s) { return '' } + $t = Sanitize-Ascii $s + return $t.ToLowerInvariant() + } + + $ssu = $filtered | Where-Object { + $t = & $norm $_.Title + ($t -match 'servicing stack update' -or $t -match 'pile de maintenance') + } | Sort-Object -Property LastDeploymentChangeTime -Descending | Select-Object -First 1 + + $lcu = $filtered | Where-Object { + $t = & $norm $_.Title + ($t -match 'cumulative update' -or $t -match 'mise a jour cumulative') + } | Sort-Object -Property LastDeploymentChangeTime -Descending | Select-Object -First 1 + + [PSCustomObject]@{ SSU=$ssu; LCU=$lcu; Raw=$filtered } +} + +function Install-OneWU { + param([Parameter(Mandatory)]$UpdateObject) + + $updateId = $UpdateObject.UpdateID + $title = Sanitize-Ascii $UpdateObject.Title + $kb = $UpdateObject.KB + + $kbPrefix = if ($kb) { "$kb " } else { "" } + Write-Log ("Installing: {0}{1}" -f $kbPrefix, $title) + + try { + if ($updateId) { + $res = Install-WindowsUpdate -WindowsUpdate -UpdateID $updateId -AcceptAll -IgnoreReboot -Confirm:$false -ErrorAction Stop + } elseif ($kb) { + $res = Install-WindowsUpdate -WindowsUpdate -KBArticleID $kb -AcceptAll -IgnoreReboot -Confirm:$false -ErrorAction Stop + } else { + $res = Install-WindowsUpdate -WindowsUpdate -AcceptAll -IgnoreReboot -Confirm:$false -ErrorAction Stop | + Where-Object { (Sanitize-Ascii $_.Title) -eq $title } + } + } catch { + Write-Log ("Install failed for {0}{1}: {2}" -f $kbPrefix, $title, $_.Exception.Message) + return [PSCustomObject]@{ + Title = $title; KB = $kb; Result = 'Failed'; HResult = $null; RebootRequired = $false + } + } + + # Build a clean result array without inline 'if' + $out = @() + foreach ($o in @($res)) { + $rTitle = Sanitize-Ascii $o.Title + + $rKB = $null + if ($o.PSObject.Properties['KB'] -and $o.KB) { $rKB = $o.KB } + elseif ($o.PSObject.Properties['KBArticleID'] -and $o.KBArticleID) { $rKB = $o.KBArticleID } + + $rResult = $null + if ($o.PSObject.Properties['Result'] -and $o.Result) { $rResult = $o.Result } else { $rResult = $o.ResultCode } + + $rHResult = $null + if ($o.PSObject.Properties['HResult']) { $rHResult = $o.HResult } + + $rReboot = $false + if ($o.PSObject.Properties['RebootRequired']) { $rReboot = [bool]$o.RebootRequired } + + $out += [PSCustomObject]@{ + Title = $rTitle + KB = $rKB + Result = $rResult + HResult = $rHResult + RebootRequired = $rReboot + } + } + return ,$out # ensure array even if single item +} + +# =================== Main =================== +if (-not (Test-IsAdmin)) { Write-Log "Warning: script is not running elevated." } + +try { + $RebootRegKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired' + if (Test-Path $RebootRegKey) { Write-Log "Pending reboot detected. Exiting 101."; exit 101 } +} catch { Write-Log ("Error while checking pending reboot: {0}" -f $_.Exception.Message); exit 199 } + +try { + $minFreeGB = 5 + $drive = Get-PSDrive -Name C -ErrorAction Stop + $freeGB = [math]::Round(($drive.Free/1GB),2) + if ($freeGB -lt $minFreeGB) { Write-Log ("Insufficient free space: required {0}GB, available {1}GB. Exiting 103." -f $minFreeGB, $freeGB); exit 103 } +} catch { Write-Log ("Error while checking free space: {0}" -f $_.Exception.Message); exit 198 } + +$build = Get-BuildFull +Write-Log ("Detected OS: Build={0}" -f $build.BuildFull) + +Ensure-PSWindowsUpdate | Out-Null + +$updates = Get-AvailableOSUpdates + +# Plan (pre-calc strings to avoid inline if in -f) +if ($updates.SSU) { + $kbPrefix = if ($updates.SSU.KB) { "$($updates.SSU.KB) " } else { "" } + $title = Sanitize-Ascii $updates.SSU.Title + Write-Log ("Plan: SSU -> {0}{1}" -f $kbPrefix, $title) +} +if ($updates.LCU) { + $kbPrefix = if ($updates.LCU.KB) { "$($updates.LCU.KB) " } else { "" } + $title = Sanitize-Ascii $updates.LCU.Title + Write-Log ("Plan: LCU -> {0}{1}" -f $kbPrefix, $title) +} + +if (-not $updates.SSU -and -not $updates.LCU) { + Write-Log "No OS SSU/LCU updates available (system appears up-to-date)." + exit 0 +} + +$needReboot = $false +$installed = $false +$failedAny = $false + +if ($updates.SSU) { + $r = Install-OneWU -UpdateObject $updates.SSU + foreach ($i in @($r)) { + $kbPrefix = if ($i.KB) { "$($i.KB) " } else { "" } + $hrSuf = if ($i.HResult) { " (HResult=$($i.HResult))" } else { "" } + $rbSuf = if ($i.RebootRequired) { " [RebootRequired]" } else { "" } + Write-Log ("Result: {0}{1} => {2}{3}{4}" -f $kbPrefix, $i.Title, $i.Result, $hrSuf, $rbSuf) + + if ($i.Result -match 'Succeeded') { $installed = $true } + elseif ($i.Result -match 'Failed|Aborted|Error') { $failedAny = $true } + if ($i.RebootRequired) { $needReboot = $true } + } +} + +if ($updates.LCU) { + $r = Install-OneWU -UpdateObject $updates.LCU + foreach ($i in @($r)) { + $kbPrefix = if ($i.KB) { "$($i.KB) " } else { "" } + $hrSuf = if ($i.HResult) { " (HResult=$($i.HResult))" } else { "" } + $rbSuf = if ($i.RebootRequired) { " [RebootRequired]" } else { "" } + Write-Log ("Result: {0}{1} => {2}{3}{4}" -f $kbPrefix, $i.Title, $i.Result, $hrSuf, $rbSuf) + + if ($i.Result -match 'Succeeded') { $installed = $true } + elseif ($i.Result -match 'Failed|Aborted|Error') { $failedAny = $true } + if ($i.RebootRequired) { $needReboot = $true } + } +} + +if ($failedAny) { Write-Log "One or more updates failed."; exit 195 } +if ($needReboot) { exit 3010 } +if ($installed) { exit 0 } +exit 0 diff --git a/install-msu-web-download/readme.md b/install-msu-web-download/readme.md new file mode 100644 index 0000000..89fca4b --- /dev/null +++ b/install-msu-web-download/readme.md @@ -0,0 +1,41 @@ +# MSU Direct Download & Silent Install (PowerShell) + +Download a specific **MSU** from Microsoft Update Catalog, run **pre-checks**, install with `wusa.exe /quiet /norestart`, and return the installer’s exit code. Logs to `C:\Windows\Temp\MSU_Install.log`. + +## What it checks +- **Pending reboot** → exits **101**. +- **Free space on C:** ≥ **5 GB** (default) → exits **103**. +- **Download** success from the Catalog URL → exits **104** on failure. +- Otherwise runs `wusa` and returns its native **exit code** (`0` OK, `3010` reboot required). + +## Quick start +1. Edit the variables at the top of the script: + - `$MSUUrl` (direct Catalog URL) + - `$MSUFile` (e.g. `windows10.0-kb5060531-x64.msu`) + - Optional: `$minFreeGB` +2. Run as Administrator: + ```powershell + powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Install-MSU.ps1 + ``` + +## Exit codes +- **0** = Installed successfully +- **3010** = Installed, reboot required (from `wusa`) +- **101** = Pending reboot detected +- **103** = Not enough free space on C: +- **104** = Download failed +- **others** = Native `wusa.exe` codes + +## Requirements +- Windows 10/11 or Server, **elevated** PowerShell. +- Outbound access to the Microsoft Update Catalog URL. +- `wusa.exe` available (built-in). + +## Notes +- The script deletes any existing MSU at the target path before downloading. +- If proxy/TLS blocks `WebClient`, switch to `Invoke-WebRequest` and enforce TLS 1.2: + ```powershell + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + Invoke-WebRequest -Uri $MSUUrl -OutFile $MSUPath -UseBasicParsing + ``` + diff --git a/report-failed-computers/Display.ps1 b/report-failed-computers/Display.ps1 new file mode 100644 index 0000000..da79f2d --- /dev/null +++ b/report-failed-computers/Display.ps1 @@ -0,0 +1,73 @@ +# Initializations +[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null +$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer() +$computerScope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope +$updateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope +$summariesComputerFailed = $wsus.GetSummariesPerComputerTarget($updateScope,$computerScope) | Where-Object FailedCount -NE 0 | Sort-Object FailedCount, UnknownCount, NotInstalledCount -Descending +$computers = Get-WsusComputer +$computersErrorEvents = $wsus.GetUpdateEventHistory([System.DateTime]::Today.AddDays(-7), [System.DateTime]::Today) | Where-Object ComputerId -ne [Guid]::Empty | Where-Object IsError -eq $true + +function Get-TimeStamp { + return "[{0:MM/dd/yy} {0:HH:mm:ss}]" -f (Get-Date) +} + +$csvFile = "$PSScriptRoot\WSUSFailedComputer_" + "{0:MMddyy}" -f (Get-Date) + ".csv" +Get-WsusComputer -ComputerUpdateStatus Failed | Export-Csv -Path $csvFile -NoTypeInformation +$ComputersErrorToday = Get-WsusComputer -ComputerUpdateStatus Failed + +$csvList = (Get-ChildItem -Path $PSScriptRoot -Filter *.csv).FullName +$AllCsv = $csvList | Import-Csv +$AllCsv = $AllCsv | Sort-Object "FullDomainName" + +$Ordinateur = @() +$CountError = 1 +$OldComputer = "XXXX" +Foreach ($csv In $AllCsv) { + $FullDomainName = $csv.FullDomainName + + $ExitError = $true + Foreach ($ComputerErrorToday In $ComputersErrorToday) { + $FullNameComputerErrorToday = $ComputerErrorToday.FullDomainName + if ($FullNameComputerErrorToday -eq $FullDomainName) { $ExitError = $false } + } + + If (-not $ExitError) { + If ($OldComputer -eq $FullDomainName) { + $CountError += 1 + } Else { + if ($OldComputer -ne "XXXX") { + $CountError = $CountError.ToString("0000") + $Ordinateur += "$CountError;$OldComputer" + } + $CountError = 1 + $OldComputer = $FullDomainName + } + } +} + +$Ordinateur = $Ordinateur | Sort-Object -Descending +$TotalAffiche = 10 +$NbAffiche = 0 +Foreach ($Computererror In $Ordinateur) { + If ($NbAffiche -lt $TotalAffiche) { + Write-Host $Computererror + + $NbAffiche += 1 + + $NomOrdinateur = $Computererror.Substring(5) + ForEach ($computerFailed In $summariesComputerFailed) { + $computer = $computers | Where-Object Id -eq $computerFailed.ComputerTargetId + + $Computername = $computer.FullDomainName + $ComputerIP = $computer.IPAddress + + if ($Computername -eq $NomOrdinateur) { + $computerUpdatesFailed = ($wsus.GetComputerTargets($computerScope) | Where-Object Id -EQ $computerFailed.ComputerTargetId).GetUpdateInstallationInfoPerUpdate($updateScope) | Where-Object UpdateInstallationState -EQ "Failed" + ForEach ($update In $computerUpdatesFailed) { + $outputText = $wsus.GetUpdate($update.UpdateId).Title + Write-Host "------------ $outputText" + } + } + } + } +} \ No newline at end of file diff --git a/report-failed-computers/readme.md b/report-failed-computers/readme.md new file mode 100644 index 0000000..c7efbdb --- /dev/null +++ b/report-failed-computers/readme.md @@ -0,0 +1,27 @@ +# WSUS – Failed Computers (Display.ps1) +Generate a CSV of client machines that had Windows Update installation errors over a recent time window, by querying **WSUS event history (errors only)**. Faster and more accurate than stitching multiple daily exports. If the `UpdateServices` module isn’t present, the script uses the WSUS Admin .NET DLL directly. + +--- + +## Requirements + +- Run on the **WSUS server**, in an **elevated** 64-bit Windows PowerShell (5.1). +- WSUS PowerShell module `UpdateServices` (installed with WSUS/RSAT) **or** the Admin DLL: + `C:\Program Files\Update Services\Tools\Microsoft.UpdateServices.Administration.dll` +- Local access to WSUS (HTTP 8530 or HTTPS 8531). + +--- + +## Install + +1. Copy the script here: `DisplayToErrorComputer/Display.ps1` +2. Unblock if downloaded from the internet: + ```powershell + Unblock-File .\Display.ps1 + ``` + +## How to run +Standard run (last 7 days, top 100): + ```powershell + .\Display.ps1 -Days 7 -Top 100 -Verbose + ``` \ No newline at end of file diff --git a/report-top-error-computers/DisplayToError.ps1 b/report-top-error-computers/DisplayToError.ps1 new file mode 100644 index 0000000..079693d --- /dev/null +++ b/report-top-error-computers/DisplayToError.ps1 @@ -0,0 +1,61 @@ +#Requires -RunAsAdministrator +$ErrorActionPreference = 'Stop' + +# ---- Parameters ---- +$Days = 7 # time window for error events +$Top = 10 # top N computers by error count +$OutCsv = "$PSScriptRoot\WSUS_FailedComputers_{0:yyyyMMdd}.csv" -f (Get-Date) + +# ---- Connect to WSUS (module if available, else DLL) ---- +if (Get-Module -ListAvailable UpdateServices) { + Import-Module UpdateServices -ErrorAction Stop + $wsus = Get-WsusServer +} else { + $dll = "$env:ProgramFiles\Update Services\Tools\Microsoft.UpdateServices.Administration.dll" + if (-not (Test-Path $dll)) { throw "WSUS Admin DLL not found: $dll" } + Add-Type -Path $dll + $wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer() +} + +# ---- Pull error events in the time window ---- +$from = (Get-Date).Date.AddDays(-[int]$Days) +$to = (Get-Date).Date +$events = $wsus.GetUpdateEventHistory($from, $to) | + Where-Object { $_.IsError -and $_.ComputerId -ne [Guid]::Empty } + +# ---- Aggregate per computer and take Top N ---- +$allComputers = $wsus.GetComputerTargets() +$compById = @{}; foreach ($c in $allComputers) { $compById[$c.Id] = $c } + +$topByCount = $events | Group-Object ComputerId | + Sort-Object Count -Descending | Select-Object -First $Top + +$result = foreach ($g in $topByCount) { + $c = $compById[$g.Name] + $lastEvt = $events | Where-Object { $_.ComputerId -eq $c.Id } | + Sort-Object CreationDate -Descending | Select-Object -First 1 + [pscustomobject]@{ + ComputerName = $c.FullDomainName + IPAddress = $c.IPAddress + Errors = $g.Count + LastError = $lastEvt.CreationDate + } +} + +# ---- Output: table + CSV ---- +$result | Format-Table -AutoSize +$result | Export-Csv -Path $OutCsv -NoTypeInformation -Encoding UTF8 +Write-Host "CSV: $OutCsv" + +# ---- For each top computer, list failed updates (titles) ---- +$updScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope +foreach ($item in $result) { + $pc = $allComputers | Where-Object { $_.FullDomainName -eq $item.ComputerName } + if (-not $pc) { continue } + $failed = $pc.GetUpdateInstallationInfoPerUpdate($updScope) | + Where-Object UpdateInstallationState -EQ 'Failed' + if ($failed) { + Write-Host "`n$($item.ComputerName) — failed updates:" + foreach ($u in $failed) { ($wsus.GetUpdate($u.UpdateId).Title) | ForEach-Object { Write-Host " - $_" } } + } +} \ No newline at end of file diff --git a/report-top-error-computers/readme.md b/report-top-error-computers/readme.md new file mode 100644 index 0000000..a28b96a --- /dev/null +++ b/report-top-error-computers/readme.md @@ -0,0 +1,40 @@ +# WSUS – Display Top Error Computers (PowerShell) + +Find the **top N computers** with the most Windows Update failures in the last **N days** from WSUS, list their failed updates, and export results to CSV. + +## What the script does +- Reads WSUS **event history** over a time window. +- Aggregates errors **per computer** and shows the **Top N**. +- Prints failed **KB titles per machine**. +- Exports a CSV: `WSUS_FailedComputers_YYYYMMDD.csv`. + +## Requirements +- Run **on the WSUS server**, in an **elevated** 64-bit PowerShell. +- WSUS API available: + - `UpdateServices` module **or** + - `"%ProgramFiles%\Update Services\Tools\Microsoft.UpdateServices.Administration.dll"`. + +## Usage +Save as `Top-ErrorComputers.ps1`, then run: +```powershell +powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Top-ErrorComputers.ps1 +``` + +## Configuration +Edit the variables at the top of the script: +- `$Days` – time window (default: `7`) +- `$Top` – number of computers to display (default: `10`) +- `$OutCsv` – export path + +## Output +- Console table: `ComputerName`, `IPAddress`, `Errors`, `LastError` +- CSV file at `$OutCsv` +- For each “top” computer, a list of **failed update titles** is printed below the table. + +## Optional: schedule (Task Scheduler) +```powershell +schtasks /Create /TN "WSUS Top Error Computers" ^ + /TR "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\Top-ErrorComputers.ps1" ^ + /SC DAILY /ST 02:00 /RU SYSTEM /RL HIGHEST /F +``` + diff --git a/reset-windows-update-agent/CleanFull.ps1 b/reset-windows-update-agent/CleanFull.ps1 new file mode 100644 index 0000000..88c628a --- /dev/null +++ b/reset-windows-update-agent/CleanFull.ps1 @@ -0,0 +1,68 @@ +# Script to stop update-related services, rename folders, and restart services + +$LogPath = "C:\Windows\Temp\WUA_Reset.log" +$Services = @("wuauserv", "cryptSvc", "bits", "msiserver") +$SoftwareDistribution = "C:\Windows\SoftwareDistribution" +$SoftwareDistributionOld = "C:\Windows\SoftwareDistribution.old" +$Catroot2 = "C:\Windows\System32\catroot2" +$Catroot2Old = "C:\Windows\System32\catroot2.old" + +function Write-Log { + param([string]$Message) + $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + Add-Content -Path $LogPath -Value "$timestamp $Message" +} + +# Stop services +foreach ($svc in $Services) { + try { + Write-Log "Stopping service: $svc" + Stop-Service -Name $svc -Force -ErrorAction Stop + } catch { + Write-Log "Failed to stop service $svc: $_" + } +} + +Start-Sleep -Seconds 3 + +# Rename SoftwareDistribution folder +if (Test-Path $SoftwareDistribution) { + try { + if (Test-Path $SoftwareDistributionOld) { + Remove-Item -Path $SoftwareDistributionOld -Recurse -Force + Write-Log "Removed existing $SoftwareDistributionOld" + } + Rename-Item -Path $SoftwareDistribution -NewName "SoftwareDistribution.old" + Write-Log "Renamed $SoftwareDistribution to $SoftwareDistributionOld" + } catch { + Write-Log "Failed to rename $SoftwareDistribution: $_" + } +} + +# Rename catroot2 folder +if (Test-Path $Catroot2) { + try { + if (Test-Path $Catroot2Old) { + Remove-Item -Path $Catroot2Old -Recurse -Force + Write-Log "Removed existing $Catroot2Old" + } + Rename-Item -Path $Catroot2 -NewName "catroot2.old" + Write-Log "Renamed $Catroot2 to $Catroot2Old" + } catch { + Write-Log "Failed to rename $Catroot2: $_" + } +} + +Start-Sleep -Seconds 2 + +# Start services +foreach ($svc in $Services) { + try { + Write-Log "Starting service: $svc" + Start-Service -Name $svc -ErrorAction Stop + } catch { + Write-Log "Failed to start service $svc: $_" + } +} + +Write-Log "Script completed." diff --git a/reset-windows-update-agent/Cleanuplight.ps1 b/reset-windows-update-agent/Cleanuplight.ps1 new file mode 100644 index 0000000..73c615c --- /dev/null +++ b/reset-windows-update-agent/Cleanuplight.ps1 @@ -0,0 +1,51 @@ +$global:LogPath = "C:\Windows\Temp\Wuauserv_Cleanup.log" +$ServiceName = "wuauserv" + +function Write-Log { + param([string]$Message) + $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + Add-Content -Path $global:LogPath -Value "$timestamp $Message" + write-host $Message +} + +function Clean-WUClientFolders { + Write-Log "Cleaning up Windows Update client folders" + $windir = $env:WINDIR + $WUDownload = Join-Path $windir "SoftwareDistribution\Download" + $WUDataStore = Join-Path $windir "SoftwareDistribution\Datastore" + + if (Test-Path $WUDownload) { + try { + Remove-Item $WUDownload -Recurse -Force + Write-Log "Deleted $WUDownload" + } catch { + Write-Log ("Failed to delete $WUDownload") + } + } + if (Test-Path $WUDataStore) { + try { + Remove-Item $WUDataStore -Recurse -Force + Write-Log "Deleted $WUDataStore" + } catch { + Write-Log ("Failed to delete $WUDataStore") + } + } +} + +try { + Write-Log "Stopping $ServiceName" + Stop-Service -Name $ServiceName -Force -ErrorAction Stop + Start-Sleep -Seconds 3 +} catch { + Write-Log ("Failed to stop $ServiceName") +} + +Clean-WUClientFolders + +try { + Write-Log "Starting $ServiceName" + Start-Service -Name $ServiceName -ErrorAction Stop + Write-Log "$ServiceName started" +} catch { + Write-Log ("Failed to start $ServiceName") +} diff --git a/reset-windows-update-agent/readme.md b/reset-windows-update-agent/readme.md new file mode 100644 index 0000000..af2bdd8 --- /dev/null +++ b/reset-windows-update-agent/readme.md @@ -0,0 +1,43 @@ +# Reset Windows Update Components (PowerShell) + +Two maintained scripts to fix stuck Windows Update on Windows 10/11 and Server: + +- **cleanlight.ps1** — quick cache cleanup (fast, minimal). +- **cleanFull.ps1** — full component reset (deeper, reversible). + +## What each script does +- `cleanlight.ps1` + - Stops `wuauserv` + - Deletes `%WINDIR%\SoftwareDistribution\Download` and `...\Datastore` + - Restarts `wuauserv` + - Log: `C:\Windows\Temp\Wuauserv_Cleanup.log` + +- `cleanFull.ps1` + - Stops `wuauserv`, `bits`, `cryptSvc`, `msiserver` + - Renames `%WINDIR%\SoftwareDistribution` → `SoftwareDistribution.old` + - Renames `%WINDIR%\System32\catroot2` → `catroot2.old` + - Restarts services + - Log: `C:\Windows\Temp\WUA_Reset.log` + +> Note: Both approaches reset the **local** Windows Update history view. The first scan afterward can be longer. + +## Requirements +- Run **as Administrator** on the affected device. +- Use **64-bit** PowerShell path. +- Close the Windows Update UI before running. + +## Usage +```powershell +# Light cleanup +C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\cleanlight.ps1 + +# Full reset +C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\cleanFull.ps1 +``` + +## After running +- Trigger a scan: `USOClient StartScan` (Win10/11) or wait for the next schedule. +- Optionally delete `*.old` folders after a few days if disk space matters. +- Check logs (paths above) if issues persist; see also `C:\Windows\WindowsUpdate.log` and `C:\Windows\Logs\CBS\CBS.log`. + + diff --git a/sql-maintenance/Maintenance.sql b/sql-maintenance/Maintenance.sql new file mode 100644 index 0000000..522e032 --- /dev/null +++ b/sql-maintenance/Maintenance.sql @@ -0,0 +1,118 @@ +USE SUSDB; +GO +SET NOCOUNT ON; + +-- Rebuild or reorganize indexes based on their fragmentation levels +DECLARE @work_to_do TABLE ( + objectid int + , indexid int + , pagedensity float + , fragmentation float + , numrows int +) + +DECLARE @objectid int; +DECLARE @indexid int; +DECLARE @schemaname nvarchar(130); +DECLARE @objectname nvarchar(130); +DECLARE @indexname nvarchar(130); +DECLARE @numrows int +DECLARE @density float; +DECLARE @fragmentation float; +DECLARE @command nvarchar(4000); +DECLARE @fillfactorset bit +DECLARE @numpages int + +-- Select indexes that need to be defragmented based on the following +-- * Page density is low +-- * External fragmentation is high in relation to index size +PRINT 'Estimating fragmentation: Begin. ' + convert(nvarchar, getdate(), 121) +INSERT @work_to_do +SELECT + f.object_id + , index_id + , avg_page_space_used_in_percent + , avg_fragmentation_in_percent + , record_count +FROM + sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'SAMPLED') AS f +WHERE + (f.avg_page_space_used_in_percent < 85.0 and f.avg_page_space_used_in_percent/100.0 * page_count < page_count - 1) + or (f.page_count > 50 and f.avg_fragmentation_in_percent > 15.0) + or (f.page_count > 10 and f.avg_fragmentation_in_percent > 80.0) + +PRINT 'Number of indexes to rebuild: ' + cast(@@ROWCOUNT as nvarchar(20)) + +PRINT 'Estimating fragmentation: End. ' + convert(nvarchar, getdate(), 121) + +SELECT @numpages = sum(ps.used_page_count) +FROM + @work_to_do AS fi + INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id + INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id + +-- Declare the cursor for the list of indexes to be processed. +DECLARE curIndexes CURSOR FOR SELECT * FROM @work_to_do + +-- Open the cursor. +OPEN curIndexes + +-- Loop through the indexes +WHILE (1=1) +BEGIN + FETCH NEXT FROM curIndexes + INTO @objectid, @indexid, @density, @fragmentation, @numrows; + IF @@FETCH_STATUS < 0 BREAK; + + SELECT + @objectname = QUOTENAME(o.name) + , @schemaname = QUOTENAME(s.name) + FROM + sys.objects AS o + INNER JOIN sys.schemas as s ON s.schema_id = o.schema_id + WHERE + o.object_id = @objectid; + + SELECT + @indexname = QUOTENAME(name) + , @fillfactorset = CASE fill_factor WHEN 0 THEN 0 ELSE 1 END + FROM + sys.indexes + WHERE + object_id = @objectid AND index_id = @indexid; + + IF ((@density BETWEEN 75.0 AND 85.0) AND @fillfactorset = 1) OR (@fragmentation < 30.0) + SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE'; + ELSE IF @numrows >= 5000 AND @fillfactorset = 0 + SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD WITH (FILLFACTOR = 90)'; + ELSE + SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD'; + PRINT convert(nvarchar, getdate(), 121) + N' Executing: ' + @command; + EXEC (@command); + PRINT convert(nvarchar, getdate(), 121) + N' Done.'; +END + +-- Close and deallocate the cursor. +CLOSE curIndexes; +DEALLOCATE curIndexes; + + +IF EXISTS (SELECT * FROM @work_to_do) +BEGIN + PRINT 'Estimated number of pages in fragmented indexes: ' + cast(@numpages as nvarchar(20)) + SELECT @numpages = @numpages - sum(ps.used_page_count) + FROM + @work_to_do AS fi + INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id + INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id + + PRINT 'Estimated number of pages freed: ' + cast(@numpages as nvarchar(20)) +END +GO + + +--Update all statistics +PRINT 'Updating all statistics.' + convert(nvarchar, getdate(), 121) +EXEC sp_updatestats +PRINT 'Done updating statistics.' + convert(nvarchar, getdate(), 121) +GO \ No newline at end of file diff --git a/sql-maintenance/readme.md b/sql-maintenance/readme.md new file mode 100644 index 0000000..ac7936c --- /dev/null +++ b/sql-maintenance/readme.md @@ -0,0 +1,38 @@ +# WSUS SUSDB Maintenance (Reindex + Update Stats) + +Keep **SUSDB** fast: rebuild/reorganize fragmented indexes, then run `sp_updatestats`. Run off-hours; back up first. + +## Requirements +- Admin on the WSUS server. +- Either **SqlServer** PowerShell module (`Install-Module SqlServer`) or **sqlcmd** tools. +- WID instance uses the named pipe: `np:\\.\pipe\MICROSOFT##WID\tsql\query`. + +## Quick start +1) Save the SQL script as: `C:\Scripts\WSUSDBMaintenance.sql` (same as in this repo/article). +2) Run one of the following: + +```powershell +# PowerShell (SqlServer module) — SQL Server instance +Invoke-Sqlcmd -ServerInstance 'localhost' -Database 'SUSDB' ` + -InputFile C:\Scripts\WSUSDBMaintenance.sql -AbortOnError + +# PowerShell (SqlServer module) — WID (local only) +Invoke-Sqlcmd -ServerInstance 'np:\\.\pipe\MICROSOFT##WID\tsql\query' ` + -Database 'SUSDB' -InputFile C:\Scripts\WSUSDBMaintenance.sql -AbortOnError +``` + +```powershell +# sqlcmd CLI — SQL Server +sqlcmd -S localhost -d SUSDB -i C:\Scripts\WSUSDBMaintenance.sql -b + +# sqlcmd CLI — WID (local only) +sqlcmd -S np:\\.\pipe\MICROSOFT##WID\tsql\query -d SUSDB -i C:\Scripts\WSUSDBMaintenance.sql -b +``` + +## Schedule (optional) +```powershell +schtasks /Create /TN "WSUS DB Maintenance" ^ + /TR "powershell.exe -NoProfile -Command Invoke-Sqlcmd -ServerInstance 'np:\\.\pipe\MICROSOFT##WID\tsql\query' -Database SUSDB -InputFile C:\Scripts\WSUSDBMaintenance.sql -AbortOnError" ^ + /SC MONTHLY /D 1 /ST 02:00 /RU "SYSTEM" /RL HIGHEST /F +``` + diff --git a/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSGetModuleInfo.xml b/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSGetModuleInfo.xml new file mode 100644 index 0000000000000000000000000000000000000000..48902445fcc7f6d8ff9d86216efc3b9fba7ba918 GIT binary patch literal 26706 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 literal 0 HcmV?d00001 diff --git a/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.Format.ps1xml b/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.Format.ps1xml new file mode 100644 index 0000000..7642280 --- /dev/null +++ b/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.Format.ps1xml @@ -0,0 +1,616 @@ + + + + + PSWindowsUpdate + + PSWindowsUpdate.WindowsUpdate + + + + + 12 + + + 10 + + + 9 + + + Right + 6 + + + + + + + + ComputerName + + + Status + + + KB + + + Size + + + Title + + + + + + + + PSWindowsUpdate + + PSWindowsUpdate.OfflineMSU + + + + + 1 + + + 10 + + + + 11 + + + Right + 8 + + + + + + + X + + + Result + + + Title + + + LastUpdated + + + Size + + + + + + + + PSWindowsUpdate + + PSWindowsUpdate.WindowsUpdateJob + + + + + 1 + + + 12 + + + 10 + + + 9 + + + Right + 6 + + + + + + + + X + + + ComputerName + + + Result + + + KB + + + Size + + + Title + + + + + + + + PSWindowsUpdate + + PSWindowsUpdate.History + + + + + 12 + + + 14 + + + 10 + + + 19 + + + + + + + + ComputerName + + + Operationname + + + Result + + + Date + + + Title + + + + + + + + PSWindowsUpdate + + PSWindowsUpdate.ServiceManager + + + + + 36 + + + 9 + + + + 9 + + + + + + + + ServiceID + + + IsManaged + + + IsDefaultAUService + + + Name + + + + + + + + PSWindowsUpdate + + PSWindowsUpdate.AgentInfo + + + + + 12 + + + 15 + + + 15 + + + 10 + + + + + + + + ComputerName + + + PSWindowsUpdate + + + PSWUModuleDll + + + ApiVersion + + + WuapiDllVersion + + + + + + + + PSWindowsUpdate + + PSWindowsUpdate.InstallerStatus + + + + + 12 + + + + + + + + ComputerName + + + IsBusy + + + + + + + + PSWindowsUpdate + + PSWindowsUpdate.LastResults + + + + + 12 + + + 10 + + + + + + + + ComputerName + + + LastSearchSuccessDate + + + LastInstallationSuccessDate + + + + + + + + PSWindowsUpdate + + PSWindowsUpdate.WUJob + + + + + 12 + + + 20 + + + + + + + + + + ComputerName + + + Name + + + + $_.Definition.Actions[1].Arguments -replace '-Command "|"$' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.dll b/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.dll new file mode 100644 index 0000000000000000000000000000000000000000..1afc87f423c8a3b99518537710c1571e26c8303f GIT binary patch literal 320056 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%0A6)mQ!&Tw=bV4m-D$<{y2~e4(-Kw7Ej10 z=!CKEl__wb6<`%5D#eXL5vH@VH#4XF8JPY3k8K9_!e~-B?&eE}66HO*oM>a>zR-wB z%N1#)y3AODmEP1Y^%_BTX}`juw*;!Xi^!pSm7a1hZF`#7Gx922CIx-qLjh*WtMsY59_Nulc z;A#=$77yXyv(Q^OekfDt_m(HCQ|BoICX_N3g|_KA6IkDsUu*6S*XxH;2;2jCssFj? z>C7KfPXaYRcQX6$*=cfdKY={ie?L0IOm9OWJm`d_BY{|?E^#`)tOZx(DezXdAYWx@ zfpQdca%=b8!7a2&GrAQP_P0WVb&wiayF!S6gIEEn6wd@tx=I7IXHa_PTEg}rzP=vk z*C+ z&F%+-6YkCkXdLtxrTts9Ij}9K{QzyfrdY;2?b+gr1alBzVQfRx6F>e~VMAykGN;niX9;ul?PJ=%4@*ar%)YRT z)}GeAs23fl__Q&5Y+$9ENotiTS&z8yLgR7+MW0l@%2hJ7mOdNx?J~?ZJaeQ|$|=*K z55Bx&?%A@|v#$3)UOFlulxR&|*WhFWtBG*^&ND-~h&#g4?X8#kE%)1c>ews&fAhdL z?g_OMay71qQ1juD_AQw`>Gqt9|AqmK=(nU~@{+9p_BY!nt*tI-`z9fBj^U2fwbj$| zlFbwN==#06xrOU9cc)L5#ST-%IX;=jR=X12V}D=LyI~L|la5)SuB-u@Hu@yH+u4Yg za1Q>Mh*!Cjc;?T_43J)!`<1$?Pn;G37pQK}DSZhY)bI>2B|K+D-ctQebwSd&IJA9_ zm8yx+lqEvUgv|DULYMrR@7XYEf6i!yux?s1Y^b~0eH!DdFSCuD`YRW~ztDCM*S08> zhdmPOQ@!oBtLLmzZ^I8t4G$mGgfG~Ck0+Mp45nFQ?HztCo<+-|G)pajbkgk1?iH;G z?1!3i+VUf^*RAA);G!$pR`k>;7Nl21dzHe0L4VYq$Wz#gyG5%GK5dFTt!|5W_BHel zS{jdPle?-M!*?AG%(JJ2E3k7rg%J!iGNd@wgf%JBcKTJFVT<19Z?4~bYYX|1%=sqm zBwV3lro}hu?JoMA@zn;@E&}d^xyZuB*N89G#~!O?iWcN?wC%&J$6Nw0TL1eyiT%Hx z(F5rLV9davc}(H<8S4GQxPu?nrg6fWj1Z9R?<; zeS)@$!>~{sm2*(RsH9Hz3?#N6=$pESdYz+=Q)I1OgV2!lE%aP`!kBBX0+w<|ctJ_+ z;Jk!In#hYuTmjGIUi7GTd-5A%1;ZZ)lMu|_d{cESH-j?fyle_5oUX_oRfq2c{HDj7 z*d=N_p?!W3Iv=#20j9iA!+1h+3ZGV}HLf7q(GI85!>ILZUjF=3gCkoJIG){*5 z_Dx-j1I3Tdy+FP%^`+evDUA7afD^ zD&rr|gZ0?!Ec0p}gEG53b1M^WE4kOMlVhQUbwvS)Z6f!P}A1KYXA#JzMP!ZT)(N zl>a$?XG?k3)1}nQefyolI6R$--@Rt3`)TpZpT9ylZNczcxLxl}!)UudkkKwf>Y}uO zyAbNRZUsh%bk=tg!jEirm@abezJ$ zoCa<;K`Qi)A(bFi8L5;~c+;C@Y8-QpFD{89t{O8Ku1!Ws218OnmP&?R7gYp5Q3OOG zn_Lxyf$)8bNOE)LH-PWXw0X=7Q*7L(q3yUDBtnC!of8e+zDVI2OTD9;OZ=riO`^ye z2xE|r8=5LZ#Gyeh-?(Tt-$TvKN-9nop$$bh)?Qzy-l%#eC-Jgf!iO(u4dW`NlY3DT zG54MWXzNmwds(|epPot?HbUG=8KD+POC@8s$wpZ??>Na2(usiwhnc{ia zp62i_HLU~-<69rZ!=!A-lh})f{98iAKS`^4tj!&%y8`=fbS9jSh+bD0A!K%t4eDH= zsltD6Ay1}D`p30l^nI>I&%3L0J%~jNw@9eT6K=GjP{MF60L$AF8gaWftNqp=M|s6s zvD`_Z{*av0Jec3aC}aVKznC2!Z6MUKYlWV|9Mszjc^)J)!M^YRT=riI4_Uj-)XcOMvUBp z*uy3CNgek=^#7PVKaQC^gr|LRxqaftZ}j@&DToVc8CyJAXP=d`_=|q>|VeQk!#Xhv?}nhx`(-Yx>wD$ml{9Pu;&dj3pa-^W~YyF zD(IQr&zR@2+q`SABy^k7$9=$DS~>26b%1ql|M*s1d$-nFSg`c4c>x|y(^1?Ztz3p@ z-LCc-!0lP!(fRmXsI25-Th0T|t_d8qh9}XD%vyUMo-tp9UU*6NKJ@qyFtc#0j%Myk z!(v`$VeUMQo=NW#ihJxvbTs^&$0SZ6;!PkK(K1B3MM;$&esTcP55)j0zY2XE=N&>F zH2lTe>|0==yV=Szp|IB6&pN6D)Mt6%X&yGM+f$&h-97^)ir?NtaOOQ*S-H%v+;FnJ8<->irx|n-=@R~*gW7rq;sQg@ z9tAWy_#TEGr)JFNhdCwHLDUnafMB$NwL9>TT6w}J+*UKm=iX^itTre0 zJD6JYr`gLMi9pIrt(3u!k+^&3*z5yjQhuzH)mFz)PGaT9ewYW+t@CG6gU7Ol&10;j z&YSR12`Mx0&7a_P7aEyvv}K=;JCGYl0J~E$XkO}I&q8$s28oA3!B0b3co=zNIz=-Y zD5#2!A;B$V-&gOarYEfM|o&oXafb}Dsl*z+&uxhNN7)>o}coVg@Lmw zus8Qk;hCQvV*9h%`X~J0bRH|>BF(k>9Vw;2JjR3;X}FqlRms9yCsic~%Sm9|l^S~( zDW$OwdmUj(4ygu{uxA{}JJ(Q4!eGDch#!L!9|sK*Va*`QS)$5?Z(1A#1`Ywol-rOD zNib2J#~VK%g=Z?8|$ZW}!NfDnHt&~w2{=~Fq2>L2(tk!=Hpi#YR4u4$_M{d||9)MYl#~Y4YTTi`? zbu=!W!MyYXvLr=BByL;S_88ilL$u1NXU;NvZbmOxnAv|8%H!%t(7sZn+1REa6dI4l;kCGmig4OxIc4shV4`w&bP$9j)?nApFkhOz3P zZFHuSjvc@$A{Nj@wFmzfZe7H<(4P(*!s#Y^qYT441s7|g)EThrrL zknn??_xAUGFWtHz!5x{>W84?zJ7j|XCi8Ci)i2Em4p@$daN8ozD|Fznhj<7p?) z{c*sO@Z>*y=;YQ%ft>hzoPE#8o{2y#B26M(iGfaMON(x#sBSKt6TUXN`64G{ zU zsA$@y$--gns?t+5f>m*)$3f8OC#uN*T%_q5bgKpd6X=}p7q zSVtk{ljN?%vpRO;S%sn)-!)Z^Hw4I0G^MA2p0)~d`jK_k5JxENGFp&PX!I!%Lr&wF z&?LErPXY1VPPyes#L#$dl^f43?``6@JMIQTH{r*Rx>qnR1#F7o#9!_)eStdvVU)0z z5a+HEk6FfjrpKhP+nU+@y^iO4{Kj+5dz+Bt9`m**bHqTx=orT4?0DAnwDB$}%Z}my zQMBdrD zc@WpX!j(OXu*U}>@bS{m^QiSv{2COARPS!(tP6#cJI?`N147ZO>G-2YrU# z3`#`)dA^E~RRvKwO3g%O51H|`V823KGFNVN-otTL02gIQXw)%@d6J_hAs47`Wm_k0?NTLGZxn`AY&VII_PLQDpO z@GBmGF@)w1@?Pe~@YWdGy&eY1IRI$_d8$b?;n&a$HAj*owygj)?n62IvEI)x7T_BC zJqU196+eXjW|3Y`W;28*9WN|BAf(iebPxzbwdX$gSo!td$CCF4<3-clb*j%f&+#1Q)djPQmG7qks|95dH_=7K06rT@jYzxW)JXn-lsj-u!Y={=E zh(~7tMSK00u6@h?rIU;f10u6RMrTC1ns4e&X8R>x`~U*RlSMD=3U`=KBn)H@X>6hSlWXe_SHhms>*$R+WDwhj$XU;EL<BOgbl2Qw#cy-# zV}Rr1_zufspvg4$9pck%kKwPB?_nl^_na83KMB10EES7C=r3m%;Gv>m{Q%)`>X(tPTL+|chBbx#K zLX){WJ@pak5nkHck{ncL1$d4LMXv0TWcvRrcs0bB(vnG99f3NjEnx$^pRPrI#+?6r zKM9}bARx`ag3C5#K*WAPj0~SdggOz)PUynCh;7yA6Ik1FMm-|I^!}(5U{~`PiN+Q> z3e8?S;yT74`zE>MNHoZIkY5J7$?ttQSd-uDf~+qNoZ5W%oSYqQzN&T{#F`+U$|c$`@tM+v@QSL63>w@Dp< z3Xa3E(0c{*SV7Jzp1biXI8UmgRCJYu@O09o zLUYkeG4n^@pX)tyYMJLSd%C2#AL5+vW8P^;zs}w|iPAg39iw4_$5!ttP!r+)@Vzv| z85uqV+oCz{=FM+tr7?v#Qx%+{hCC(oWeTPx^Ck=T5Pm)l%{$DLgRFCr$2i12#Vul- zjZk6lbaa!ds;iK!%&tZqIb>#B3+Urs;`}&fIf9i`@NX1zF9Y*ym^+WP)|<^=QXjqY zm1=_K>V9>O7X`VU^t{K5tk^>}zX1tARa2T|xjYwQ?huV==!e$mwouC8;z*Y%EYZ4X zFS=QZ>V7*>ZJo}^V&gqEnoMHCgmGj%Tzg%}@B#or)vzL9A3lwyq`_d+NzXl&>oINGVARbdO0Lc?-shUY1Iz_SwtCMjt#|QrzOn_0KW6 zGX)ZrKNYy{TL#Yc2;pK#e@-wIdI+Eekozfs=PCRn)|bTwgg0KWKdu-uLn|$Oh8>o{ zmL9=IRiFo%1OAqhGE#7w#a{-uEXcW?M1C4;n#0Dv*B)5nq0g5sLE)hzfC*YP2hi)k zU3AC?kV+L>i}REoh}lf@K10Dn&P$k-8+o*Opwlv|nPj~$snSSd)ey_vl$`M61|*J- z$=Vs{nf8f{lb8YcVK)Z~VXwz57-=+vf1^MfniExe;4^;=2$9{FGY5hw0ZK~Y#|GK5F>KiYXMW3Bd>3$&_IZBCY1A( zEz-+Q8#E;?l3=#YhX}}SEJN8{A^H&^35zPALNn?c6b?!35-FZl{5Uo-jvfR@FP#WN z$Y^wxUbJ!SEL<(vS**=)CK?mRix1N{&^#JE(9mW!ztwI=$bEPaxMa%wB;w&g(St#; zlL5Pw{n&zUkm&QsDC$x)CLJR9DB<%BB3uLYq!%RWO6K$WcRl6<8&ci_4*jT}@fWEW z{P(oC;2IYBcDu;DVKkPF5avP^O2dAZO=RtjmyxPhJ7AhJr#*?iymgadyo!&UkKGc|-KerQ!U`)KG zMow&|rd-97ip4W1nTF^?0f*v_+5GD=md(RVZpv*|(yTuQuCWn{p?Pwe54t@0i-HI> zWX1fn{!BDcZJDk>4N2rCI9lY)>u_?fi#Gv;GmXz4L!TFHJG4U9}>%}{^fRvVr znjC6M=tN)a$>y6a$Id$+jtixSR>jSVmOeO$XpTzxBz`Z@hAumG*Qr&h-b2=a(6`3{ z$u1(KPo`z(?oP1I%Tb%p^gK_ekmqTjG8KH4>q*7v;1n5TV-$ymA9*FGrEwyyei6oM z*-;8gml>n+2{rvn36DGF4YEIy5IvY7#8pVA;>lehe6y0t5Tq1quHamik?EW(pl>Qa zkzZRHXF9(2rOdh4Tq$i5l{r&}npsXk7R&?53mMA5-Kx@c`7#Eh_I>#;#E0yxYmon{ zlsTRzG0x(KkDa~O3%>$G@CU!6LBpb>++&ydXu`(O+#^Mj(=aV1xYvU<=G7?(H+}?)* zE*C;;hq`=7e(6b=GG;w*4c5M)$1pux9x#HE06pCG=J7R3*HnWc-KW^7W-A|LR`=CQgDQZA7^(}W z_{psy7TPTec__6>^Q!p<8+td0*Vo+*fGHIDKPnhd1*{3ne0&i=Bk&9xr zc*UjCG01p#>o!y(kPmc7s@~yF6Mo-yXsU`zu3w%_)u<@sD7s`Be1F0ah=-?q_H@H; zzANu=lFs>d6Hdx^UH10SrEN<}Tk~lux5&~{d&kDP8uE`YWK+*rp(H1CO{)HCHsA5m zE{yshwM8z7HfG%?ma5*XHfl?m)kMf6M6ZM8u6awM*Tm1 zl0u%vPjQ5Havxr1zs^eg37qu)Kq1G! z2opa}*O^QSF~UkEeizN6V#U@UTFjq)RtR<$M~Xx)3Wa*9h6bBcb{}b@C%dy&Qy*TI z4RLprBa<@c&my#Y&VzVN0E?|2OjohESrdD?wg|1U3Kh#N)Am?eLn&UdK7S4n3FCkg zo~*2c-ANv4mEdnJIKt)k=K7?u1dFo(>g0QIek)Jf;E^Q{;UEN`5>h z|F9Mm8ljcGXoR1~R-Y*YBm@e##j-_r(ADsv0U`vak1dugSXJ@H-U{AX)Ns%ndn*=j zn5e$`%B33GTyjQ6dec~p;I zI`U(W0-Qir(mXMcRH4w zP1()H9th?F7yjw$kED7?EB zkp9{|we(33f~9q2LHV`vz&`ryZ?}w$RyU;~&QxQ?D;~^!tNRur`Kiy%; zN(gz(i#N}G=4D|;8I-1GMt8@~hAVcirABmCkQJ=dm@wb5zZpOyYO*N`JAwyBu0A?s6~M(eloGQMMt2l*;G zBSL+{rrK$I!b|TuVM_c6VT_M~SOAl1QBa_@zbeC%KiKd?9z`-;7qMi&ij$U@o${bE z5*J7C`|1!;N_`-CD1DR^JPwZ5DN`QhK~iriQ9Q>+i=Qdfv6a-Mx11rIq0x(6#d&R1 z)>m>!on3iB=A&^LVtAA`8;|&;3&3N1o8-w2UFc^b`AD%zT} zj$LY~52GhEn2;My1PIL(th4kq9ncGTOTU&zZK>C{B#FfuK0?b2L1_895;EQSJR+jF zuJ1T4L4Qvr9brH)yZc!7v}kxx@44lXOMb?~SGb8`;V~v#QI7_%$uJI6uf-6cP`G)l zL;1q;8XiRMi2gcb7L)iM`Lh~<%Y_Y1K@d-mzH_K-F(`LoO?4d8a3 zaK~@4=#3yXhZ0w4Tr#8flvz_!mVgm+6(g1A5@m?RDh%e29vZTgZ)LZ_B!X@p67j^k zkYt5S2+u6+@@E5+))uaOom~|=3`vg*E>RhQVSZ-wt1X!Lvvk~A>YO^IkUZ&DXFnmY zl${%^Rt)<~J=#a;vbQ8o$(SxVEx=}(Fh5n~$Mvdpoy{N438=>?Z6UhCuDBg~T9-9h{ zrjMEAAqkk;{L0=&p3s}XI210*2`{8-q>a9OK(e7h!agogRrmeL#09-XsL}$hFll7h zD=#?so{OAc!liv}4*xTPO0Royx9A_SWPuWci(WCC@8ido)tIP+*mgj;(z8j(auIrE zbWp;1N%gqg5PkEsmQZ3>X2Lha6HiIn2Vi&vI1VL2&gOc?^rN5v74l5kTZ1CJ@bd2M z0Kk5Q+X5h5hVClMd|Q=UtTXI60br{OFKN!FO9hFO`?zX=*?OsZEtCd7{`idqcx-;# zb{0I0y}NCw;ahPn_a{CppO5r-s)@A&R3dtlTOr+kKAU!fM0zjzS7 zz8A05Uhl@n;oF;U+0NpRVk%s`-R%$vDlb`v?;=%g>ktfz8)UuJ9!o0+tZVCiwWpch zS$-9J8oO&c+gY3ae!HEmJN6o~V6~i(4Lb#w>&f3DSkNoJ0J{}cQd5B1#q3vnZG@e< zww?9Z@5n2`QCrzoXUlR!yGu53DSu5+WykwnQ%GU67qQ;9on<|;B??+Cn5WOOb;_|k zKct}ye)A>FEalBxuDIO$UT&z&rR`nNru$tkKg?&zjm1iP;zAYBisy6!(m+S?ltux| zUBip7;jI%I$%beg^Bf{$!XZN~HC&c?@k(z|AZ-OAAH2B$oba%52OaToVjTH0m#)7& zHiKOL_0jFz*R)u|UU^qq?OR-lyZUcKG*!q6P3>uqs&DtqU-#UHiCx7WbNr!jN-@{1Mv^p(O2jW+{I!?@?&?%xm1D zn*I-=wZc}VANiKa9@{&2ggnpn&(8`!Y6`<#6<4^8v3KguS!*U&YpV1%&tm5GzB)b8 z>7LnUE9gs4d&1ty!6`p+JxaO_e(;l`CwF8Xva@xRa1ZzkUi_V2_F?5bX9-VR;$^%$ z#?VrK`A(ik^H!po0q@53wT8RqGkeFmoBjFagb4{p1+!KGx&xybSC_^BO0^c7eJNLF zzV{4vfWh4i>zR`;fDs>k>-rHqnavN-nlTrP!l7=MCkoRyufBJpkq)cj+T4QAWFQ2W zQo|UQn)1j&qv&Iy^3(5|-^PVLjdMX&Si4dChP5__?lhn7IDtWJ2|Qi=;AGm|!yQpN zp_g(g?c3g!-t;z05wGLluD|r@{kpt=^7I$jc|Pd(=mck^u&?iy_fUlF^;_HeJJ0DK zY+>L0_7bTuKKQu#Hg@q83fof5U1Z598t?1ZH9_=XcboHb*f z<=3IoAMn%fgK{iV0|qtO7#K1?lIRY0Ss@m#gpjs<<40fbB%`pG2)JH)q)BTm3WtQ= zvKIdh_F}IuFJauPn5}t&ko9lbSkhTV&pKCoR3F6nY|BHeZ?i`-3`WiI%T3bbD8Ig; zCHh$pzD2*oBA^?tk*0?SQEuBOy;j`*9FhGY19BlYR)TyEXM-OOc?c9wS)4OyVsGx% z$Ts2#<9gJmLQ9$&PtD2mz!%Po424=fKXP~;)@F(eHo*8iFeY@4a<|OR?AT_vnCs zl$x0xbbeUz*KB@@KlNr`x_}Auh;ths#i1?Z`<*AT9Sn#b#YUaO0h>X}n1DHy@!Pxn z9ZPZYg_XY3q2a>jWw}zhh{yF^R&-rLSG>(M**gmpj(&&)icI&zF`@kS=f-H9Z z+X1+F@m3#nY0CZoBM=Tb9DX>#VN#z^R^VqjmZ6s5H{XV|mYkpsi@}iuAF0d{V<~EO z(V7&WZ<)J$yYBJ$n)uUj`w=UjY4sFSx)$>8|$v~A|_|b`{<9i0qiF>lewe6 z-0~AQo*#Q7?_UI@_>*qugFG*PeBK?34DX{_A9>*r(j`V>gB=_gBA5p7gd$cRf|w$J|_B z!w!lu4ry;*`L_CdxJQ3pc^`X1`L~PJu3@ifrA=0hJ?UB32mV-Th~M?U;Cj8AyP{G} zs-};*UK0*XS%Rh=4=XX(o^^e|lq{1>V-@E!SwHqDx4e)3DAm<-`pYfvqrXeooh#TU z{{EXkzufY^_J#qSG)M9bn3`!h@AAM4Gr8r1T^0);0>`~Ll znpH}ocA4xB)|^w?$Na3s#Z&0*Hs;r(rjNZ2-{j9hxV`RK*XLa6Hl-`xTYEg$oSNYq z^Bm5HUv^36xKmdil=ZnMe1}q4yxMqAQl)+N#j7qJ{f_%emG-edt9vK2!um30ee9`y zCy!tCtlQ?EGN>VjU20Fgnm*viZwjU$1^DHZ_Ca5XAKKSdH#_jC-17ZShCiOj@S$2n zU7waOvv(CcOf``=-IR-xL+fwb5^wcAv(vRp^v&H{w8!sRTYKFjnK`I4gz|lKnaLY4v(HJ;jWVDgy_6yN)@|FY0nu`a6*H zmym8dzO0VL4q9*pr08NFuIPIjxX*RCH+1i5dt;OpH95jVTM`4V9L#>&8hpqoEa&AMwqfbi@Gybr zByrGw_*WrBsH(Gut{!U(8x>fj>q5)B86Skrb?aTU{n=5|m?5)zQ@>6hb!Tg61jEht z!eFHKX8xc}uit1;4?#X=4$@INq;K}J)-e)~m}EmTVB6c_`$+iP*!s&3c~CR^h&U*28x>-uBvb(TO+;S<@yZDz2Bv9 zU)rq!dti6jVaJ%m80PMD|16chce=ilvSfbA&xK^>XKT{)3(M^sYB=TYo3jQm3RfG} zOP?6g!O?$PYBM{dTt*$0+->qQY3c1p&o*$!r{}{^aB2_I2cYNX64V^Cr-KfAnpxH3 z_re>cB_>|CQpNi6+J8sA9r>}?%)^Hf8h_2cI1M|P%r zzSZk;0=>^ZXlStGO%8_q(1>NfNv;ldbwJUPrg091duNfe#zeZ2bfeFrbc5Gw?$BdL z_9D>*TegQg0iR#e`?fSx&0(!-9N@b%f?^z-;th}IsH7Bk%qec*&Achwg~NSH4!7CE zXWNtB`Bg$|S8O&v>f#be^ZegG)aUK~unGCT^0RQO^`7e9WIEde$zJs7u3&Qe$V<4n z3@Fve`gjwMsV{1K_k7Js>rvX?djjyypMJT4cr#1f1_+0zQzRPSD%a+oI5Ww61TYpc$+x|qi0lbrx zQY<|p=xm_pInXa!qb5*qzvVa$a9TSIC|OyBv738af%);5o2uRXa<>80{XQU>=T|(} z1xqhOJk!ri>irnTgZJNBf%c)78)*Gca2r69P$i3PTLURY`JUJg$ijCOfIs&S7l7e( zw*gLx0Jq>gC(41|GPsn+xI-cMwrZ>3`rzLuxVD5VgC021v^z1k^|UUq$~pQ&vFBnN1>3>UhT z(gwx=pbfQ~ZvODgeVqE6+%^`x??yc)cmP_{Z`;2oTGQ|JwgDbo6QdD2tsK)flV77t zf7xv_`IFhkLdEh+0dW!NO=p`LN|h$aqV8wPsqif9^m{TF!M4zQIs; z8oT&|W`!s8DvwjI?ORm6X^BtYlM4GX`zTsFm7Q;0O3m;f9IkM=zWCK_>h2hg$`oky z=RovxX$fQcxJ>7#9K=1Sbe(JOdUzhagwvr1kP(PikP;~Bsj>Rm1V)&xzbgAyC_2$ppW|MZ7<`Oaz7>eo!^g-p+761A3$v$Y#}Yj0!N zGoR8o$6k;bs}@0Kq261flr;=-b#$2!h4`sOLb$Lq3s;^n>L_%0Fsj0CckHpce-t%@ z0Bd_}^qcFi0`S~YdBuf?ncfaMNfpEduxoQ;tUCZTO0C;vv1apvxV2vDg*f`J==2JY_C60yOtg1vw)P;$=QVDpR_TFdr{x^_0GjnF%nR)w^a{`a8bo&nDc7r<{ zQe*hm2VDFJQ|K9F^q?9VBkDDR*A%|N@U0JDB(Bi4St2dEcefb;)uWr7Z_rvrBX6L%tEujurm=S>MfsU^B?9>I@ea+dPbI9_eAWP}t_N6!t(0d>r7> z4YS38Ltp${xNiOPZxWJ75LmAFtmEbp8-G)NV)JS?Ali92KI-t2rbd!Pe}O!4UB zK%ziR=mN#pi9_;cTcNULC(|Br;*cTgK=vfDP@V(22`w^V0FVVSUjXCLhe9QhSg={^ z&9*pFSiTI~6-rS&Nv#<5Sbi)fi#?ESp3Jr^fCw568V?#0Tqm&2(3T!xGaV56AHyP zFg%mU!3(Wqn^&?3w6o1~;l^C(fFnR(%QkOho42yfJ0Wu~{{P+l3K)W(vf}_3WM6h1 z5P;%Lf~qS$taUuB0l-D5B?^s1W-^%^DqzRM%ES3$E>IuZWibgn0sRpPfsnv68}V=} z9_|Iq`mz833-Jr|h~>heq6_MrRfNh|W$2Ez1uDhxbzqQT)YTZyRgi_Vs-+Rbyqm?s z(SkU)@&|DRARoU_m|tT!v$XMJn-9Ps5cNt3)S(n250V4(1pJB@f`Z@RqGoNifUNfF z=HtNehyf1(KR{vjKo(-RLV^J+B)r-7qL!g-%MG?=4BKLWDmIQpT#6b-7u)9#ZP+SK zV_QsrtcU}!)nu_-vCXG(Ch`RiVv?xPIS(r+55Tb+55w><0zwaK2PYsXT;Lxx3zZCG zBSbb1h|vX!XLl4Kq`brqO^ebV)-;f0B+BVPbX-tjm>@K^;nFxH-~~urLK+6wQ9d=? z$rO-d8QC9+HF1Ia{v-;`36SaR4hqnA1IfD#@)(FUJ*+t%a1YuV_^m1$hWRueF7#%& zAu19|0OXVSqtSs$96`e20{_-@hGqRBn*ffv`)2KZ)uD zwgyZGZsq-0epEUbLQ9bo&cc==h(c{(WLHmyQw7b40TZ=rbbCHAK2AF*c(q%3Mt^C@T=|Vz@ry$HwhD!G&IeojwtZ$Bq8;=6pAnqw%#GL zjC>NG?}anz#$nny9(;RS%qzHBRvZH1OTu`S4m zR<=Jxl8KZQ>WlduP|f1NVq1NF_$7o6tUq#%5HtiBU6%r(2(tv)$ST2?#X^oC7y+cV zQ8}bCEe<}Q!lS!D6J)cINu~h9Lh+3(9;0@JVIz#AfkS{36<1__ zxN@9-Y+(8Vm;Gx!$|7ZyU z{@}1JzQ7@WU>%%gd|}YQtiUV?@wm?k-FK%@z}aE3d>Bq_^H~q`MYj1W1tj4Z@lRoS zG8o`7uq`#%77x_EA6yY`Ej4hb$l?KafpfhPk*qtBn`PY#^1uWhI)F3^s|Ldnk=z25 zwt?}382Y-BfXj9w_pHRjdK?*VWW{$91|8XP+y}=aG*rF@_*a!7AxacNhn$dhz#$!{ z&{>WQs)tny{}dMnxY5IWd2WA-*H^9Ax2gBpJQPnIr zDjhh`jml&&99TYJU0}dK0UqKmA2cW*HiOCZq4@cL$A;T|4{LMqMwu|rApu0DBMkNu z#Rqb00)p`p{-B~NdJz6(x)WZ4#-R8@1K_K>Q-F)XPq~JgKt3fjiFcOAWY}B+#3*?v z7y#8kS{MvJ2WSO61{C1ff9k*?`#B&X@PXS@wnaptI5Hd%4%pUKkOMdyL2+Ub{eieM z-dO+uai$Z31QB8csH6jUI_42*j^x86bcqvT41A$ixR+1}2!{xw1$5WLI86j5j=KF7gPh>Y#4MQq&$YWG9cmSz+@tU zbO7u^wOS149{^^e*#N)?z;J=8OjH%FPzy8|g9aR^2d#h*Jj9!c7&r%V+!;)eCl5;+ zxFK+#$%2^#q)?vO0y7I&Uxph#X@TnL1Q$UFGSCOatq(2-=>U|3a-0}6#E;-M-Gw<6 z9z{tCLKEH?Y8+ZY<=B>dwq+oqH(XedW0T0SVg?(UvVcnR_OJ{CT?m(vNGtv!gKYt$ zGy%ufbe1#BXi#~i5gE3cMBd1+c?b;P5>zIPeh8X|gIX;lI)w4D^Lt_^AGP&o;91AGTKh{nkMFuz;D05Zkc8C4wmYGjR?>G5AON z$f-IwM_(t#;Ew{+%mwa&$tjS8hik(jB9OtcpdpEf55p1H`-F>xIE}DoW0B)UWFqZh zeu#%7oRN5rV4DlzpOA#P#6rmsnFmtN>>S|7>By9T0Rz3^%W?+2hcqpKEevOXUAHV` zTfol%TLwkfdLyHa?r+3nP;sCwt7@8U*$V0pnRv@i_-Dbo3#y6_O%1FEQnV6Jgdv*` zsij0Fx&V{bAubVUT86`@h2~9uUo9=dEbg`e0tWVE1ljLF*Y>h42VlI&Mph~X-GLR7 zik(6V8bP;@g6Jy6&zFfzCd{)fB?Om17GQ^IQzH1%6?+IV*R(#xdurM1$$-Tdl47>-+5LjWQ` zK%_ypp!qqd3qL3W;{`tH!f0mWZ&U+UxMmBWfr)rMhtR(ifQC4V=STIUGO38Jl~)F! z6)?7yK4{tjO8{UYNMu)6WG1Lcps0wI5GW%<_mxwi609JPEkf6&@6jh~x13{wEQNTa}69tYaa7KX( z3Y<{j3W0wZ>}sG@l)3wv*$7c4{XS7I^NVFoINX(N7gnCRW^Crhq++%vDWdWqLSfGSefp*~V0@0T30U&d5pEXKPKF*|C`@-cg&K zrp+*YErHNixyoO`FeXSAB}Of?^7tg0AH#cmU;9C~_4A0Tj9;z{-Q~0F+jvfCqtjED8$I zg4rs>zfW91 z3nDv3__j{??K0wa8J;L662+i5(E2&-qpgtb@p!=|3fhU?1 z2^?h>j7VVk9Ty_uf+x`G4b;IGabS4@QfL(eEy1&x?i>bMvHsaV{kMQ0fY*6}*I$B% z#dvrJ52v9Hz)BioK0kz4U{=V2&3G+ z!9&mnfO;va1{A;(KuJ{l6doSKZ=~X37M@dt$1mbVhZ03U;y2FXH&)>B7kGRLlT1QR z4tO(U@K|Cg)jDNsvm!Gy)Ok967V;8eQ?oO3jbtdtKyDSui%fEhis_V=kp$UsSxH)x zo4zhBSSK z364EE;J{mwNit<-R(^I`N~(#oZz+e5@pxQ5#^-Y)(sW?oIjyz5lC&Wlxxv7}3mG}t zdLy_3`Xm6-kW8vC)h7w1Qf(4fqLWCt!bE|9n}~_^TmhfY6Uz7^o>-7bBDuhD_#u4o zrUWEX1exR;5~+^WWP=})o0;7^*zR!k6^4jHcz_p{*Vmh>G-H-Qn~!`JFI0>3^$rIw zjWC4}MS=)&9q|au9>Ir+ZXwSUzXisFh#9&xir*!Bo=YVlhizkKLM?CBi zwmsr$k9gT5)$Ng*_6P_Q0l9%aLbpd?3Ps#gl;qwi&gN4_;H;WW1#$3>$;ryf%r+TgQZsW5Nm1FE;Bp$l zXRWT%Cu_kAkJ2Kh0gn_sWW*Az@JyZ7U;`AUij6amw)w9F)O5t|@*MD3aUVQHnVFHC zmYp7!o~6~9f;oRy_M4X~_}O`YfR~sokc!0GB!O6{7l>RdHHTQR0TO$V{wg93GZWms zwxI&Bbc#%(t24BT2E9|KxM+QPrYS8Wh4LpT`lpZF{2J)qT5oc%q{|Ze^8XUu88&|S z#}hn|Ah=&uf>*)<(EBBU9oI_v|GQCRK1qz(rBj?dE6rvD{;e#IEJa;{)-|fqTAl)0 zC@dox-b`aYMvU39Q(T)gm=$N||CVR!SgW;YfhU?KOE-b@n(i&jJAjYIM zbUAyYAs|*o_f0!7)L#Md5nTh}AA>-~UOlPYO86Ox76wDP;?yjBU!nH}s`UH(@RUL4J;lZ%KX|VRm$%eEHeMC&$zm?3$Ju#OPbYvl)BQZ16LN9gk|)FjR?Zb{3T(f!*YLQX6`>) zOmPJT0!T;Gp}zXcuJXT?g!rJ&e;w5S8pVQ->ol3<0KS0U1TMZZGd(La103OhwQ|8N zK4?i7&@TTgv?Z?mVL<;2lt0dL&q0)k#ZG3YxCnfC^sgzz_8G{Z`^PK9*02VvP>59; zkyy@E%9Uy^kEc>{WilC`i(x#OLMD(4HCM9yJoKR3VVb zp&Jq@AMl8`t`sW8d{}=MVE|YtATrCpHWYBS`0&u5PsDXXOBCblTPy?pb3bkAazimh+(Zb+l z2QgxdFXdxuo{TF|$fSTp6`!l%tEF6xN~u(;H5xdIp&&}~6JBjhR+ zO0>%%kt=x$o<^Xwl@uxkDluOOq=1&WLclRsAyY`Wm`te<;8YY!2$(9FR3+l6MO>v! zA%v13de90F5lV{j#XO}3)7U8^6>9{13>ZNzKs4k5ObL)&fC)5wu>uqGKx)v~qO_(| zqK;Gyv{WO&d^zf|TF8|PRWe``fj}HLGUzz~HZ=I8tM6@Cn2_zz^Mu9L0e5gS@BLv=6sMQLoTBeW+gf@8= z%f%8gPpIIErF_7(My=$^LaK&sTpm6#Y1fk`o>BSc)8Tq*^?5+z@*kzy(h@HXmstTsDEZ$j(i`fQ@- zd<{sBPzk6}$$^J4o`5S81N-nXrBa|#2{DaSWWyw+B%lwud=q8Am%-1aAoBBC$dP zbwm=ek}DK|T9*l+wnik?D-4-iV zASx=*dU6{~A*KXj;d9j(2#-(*$`;sP&c%3Yz6i9ON+7V=Ado2;CIVFP0UH1l(|~M) z77$|^0m#2V%(u&hT&0#u6fk0mLIl0zOGI2Lh%{2Rm|7&`Nrgh2J`u}hd zeuDl1%<=_XkrLD#>{2V0La@|MFw2NdGZ}2C#UvVuPyoG^NH8F=QZC{uL_Fv>NV|+L zmGZtRHc(zlu?CEYS_xeii^ZS<#X>G$DA9m!0KIPSvO*2+l~{<-1RNt&Ljb4;F5;=A zYOzeDRA_7pUoO#LAnKqZ`7)rH0MvtAt^!=}cmNGdkX&R#80cNTOevOfl}dy#J|9$$ z7!06P!WW7$Od%2~ZA>c=f(-|~%jF~MBm@VFD+2|}6=1-GLKUAcQ`^<5MktaiG(4_G z2IgO=kcq%B!InHwN-S23Fp*eoBdkQM5GZ)y)yUPr2cSuT2tZJ-R3MT{G*X^ip|+_p z9w1KvJ>rTH7QwaQ0}B9km0&)k0#I#AwT)arKY>Uf2kuaV(iaLf8c_cVjLXwVG;&NR z0Ju_ut@yA@3M{S!4Tqc{A(&bjBCLX^lwn{IL>fE$V+yb!0#M-+wG_qi^Gbv9j6-nhle=#_(LI{ye%DH?IU=z zb+teN!mJVlFRH)|CC*ONPZY_-I-M*TRFNL!oF~(BwPHS>tH*eWiO7x#c=~$yo*MGs zY?~4|T8PC=g+5i=H!TyaDN^)51I_mcoWUCb_`= z0^SJGSutM>9vgV5ax`tg zhb5PQfrMdUz^+p8z-_!N5b%|ti9{eDN(Gu`VxWzs0w}2jm8X)y*&&!^d_@%x#Q#rG z1v5Z2HTUSKHRR|u*_r84X<2$S>4wwOwf~T*$cNJ)zj53Ja6BYg%W$XN4w2og1i|^HZr_YsFgz=*`-znu*1p|Ox zB;s^cb{b4Em@z=#Ty3@|0x&qju_HL#1c&39urh@dsh%31nd=;vVa(F&;6VXB%+1`0?F)KLngJ96 zY*kDklh6q@cRLi@Sw15hj=-d40OZUJdlrKjgV9x^hduUeJts=5>uq$mKMP?m=4!(v zaoZs_Gt*#X5j@R_&NLWuvWyHOX=KJ_rDSW9^hU?8Si=<%65NW6{}-hgCU^*G6(Gg` z%}T)u9sVNhUXQ;SG|N64Bfxk2o55GwKmFT*E48p1VB4H+@-y;X0g*qa_$p(E_cLv{ zRP5EyX`NU&mYSl^R)H-2T(@i$71q=kcTTUEd0!&*0#U`1w{&=KI|v=or} zBqp4gMOBijL4I0tJ||J13`&dx2Z%EancAe9m9r}$H+L~=TbZV%_@OTY)bqb(-LJH{S1Q>y+uf=b}?@gx+2aqz<2Ut8fo$} z8p`_masL`4BGECb7(G2dKkn$dh^2-*uVPf6;6wqe|1|9;?*|;I()VqjW$adEKfY?3 ztI9ONT64F|#9rN0`ox@+ss%!_k`hTlCExm@Kygl$&e)Q|3guw0L7ADYG8iJ@j64b7 zWYFtFk_>2kB+{1vfKhcwHYoq}3mNaY4>$>xdrC+r_MLoGt_^%U-=LAazM&H0urx&K zNQ!|cHan8k@RqRpZa($^!sM$DN*!ue&60&i5DQPp_!-%Mhv_! z(EhWVe}oi;m%-pCOo=}sJa-B>AWeife3EUiYDK>!hh9Sp3Jcz8oeI4%0{PL~6u-R! zRR<|l2EF+jy;M~P_lfrsqI&k9xFcThO1!}JKmDv7dOaz68Wur?=O*A&7kXsxQx-n% ze84jC1DJRL2-*O3$zL%>ydhJEkN?{*>!7lK{+d=2-~e7f@fA+xSH`0H=m(Y27lSV> zF+jUsP##f;c;PL2i>RSO@BX~K5FA%Xwx*C|04E&Aoq|KKzY!EsFa>ZA&h6K?gnrB8 zkd^|DiI>;%;Mrjm_%S8?r%$2HM$oH@{USIo3CbawX2WZF5qA)uC>$5!2SrMYu=@sW8BMS*yN}_K$pE z$HD(y|3MhoLnFCBcVc0s<^Mka|6xFi%m;-+!mJ^U>5h$tw;BG{mCT?NTSI&y%ZEZH z^V~33x?|7bZOD2mjY4)HVcqCXjp<|>*(#xsX~mIPI99zvjvMAkC6kJ2^C)H##;a17 z##!DVZ`;V-@ zUTfp{fJVR9BZUQ(tZFgnX#)h))>En(nF2+F#C(jzNn$k}X z&o0L5b*UMdhRl>Sy^#|WA`js;zyeSiXHS16tN`YubI|4Mn-w@P$4|{fZ+ox>=3=a2_J|IjUE zOv$lsy_Zh7w^ebM({ASFnfmxs(a=e`NeA@et_tLLy?9}e+-QWQ4!?Q#3 zBFit&nms)DNT*jd?;f5wx~6qXzh8GmvC}TH;x(h2J`Q|euVm92%Ps|JLHYU5SjeH@ zG;i*X%lY*3*w$0ObUj9Q@40=5XmgL0>#d(mZ&SKpuJ`AaV-m;7;@ZoqZC$G?`m&h< zB1@icCAY+^}j(^`8Ny_j5TghyFR;Doxt+4;GF?}{BL%rkB_;5xegieDf z3H8$sheEFAV}p~Mn_B^ZGAgE`jDcpN!i%^`9rn%bT&=GA=#RsBXZP{XbSrN+uSu_# z5#`I7{!h<6cz>Vi`egG#f7ZGjhkk3F-(N8GBGGFvII-+y?|~OR_INPQvLdtxnl5?2 z_U7$rk8bHc$zM+z=(?l(#AXv_=(n9p2;UVxHkImL?Of?8+NfcIcar;ELjuzj&9@!j zakk&Xh@#8)l^=A`=3%t`0flid1}&aLKF~F&{KkplS&JGplYNkeOpDRi&EZ~nbFFUO z2~!?lOMMzTzsA%v%>qU|5wlw?9dv>+)?voP#SJpl>t-bmm$)tvjJvQT@>JXE%J2iF ziw(c|cQ$x+7&Iz&?wjXx^80nS%&1o2c5{1aThhCC*LFQ!_T+>UDD&SiD|MSqnb$dg zs%`rKw-UbOIVbt@GfB4ki`IMB;dqArx20_$PGp|8)BQ z>Gc1s(-l~&|FS->s;(>eTOgv~Igm+x7P3yX%gY6eyOY~R$?%1WQ zYp%28;b_jma;M0U&c2TYr%n#5mOa&@?(KPDlMVMbPj0u3yWp~5boe6Gm-yxf{gN(j ze&R3plYaT5>C((GyK3xOd+=qA+ubNff-h#aWn3x| zU2c{0a{uBQnX?t{({k<=j_$eR=>hhIQ76t#>(+4!^}w@Sy6DTvJI_Krwa>0x<_>#t zd{xmpA4m1C6X#}E|JZs{v2$?g{_DzAX0L>1FZ${}9HR#>I(Un;l)peFpH+edI=?UY7|=_9m_E?Flv) z{f~|KgR?xy_lCoW<4cxc#O|U6p=g+4dEK9vA&qbWi;uh}I2@8!CCQpi?JK&FJD~iP4b}4tP z#}@cd#?1(^W|z*4lFn?twBFPjt+>|%eb;7;?L~XrVP4ikr-5CZ*TgR^+r>-h zCpjf|B|o4lx{?-6zc%`uSBl5;7Drwl<+ZE_B8$O0@4&klQm&woan%U z>Ow;|kt*W!CNsTbjQ_wZ2G0|8&xyJ#S87q--ZCx^TeKSt`5mrm3a49y^=kIxOK!jVxCyUQob9f3BDm5$Fc;)Y;;u9W7LmXC(Faa<9ba34F<4gh>?9j5&+_}C(QO^hV_?ujc1KIg6yW3!xB*tUd=6wkx?=3T}@QYZU z>=D|x?ed&J=N)6uz6ojZORbippQp~BK62{l<;^#RonZ?e`0w+Lis*Vly^lV3R!sGg zElS=1`2yKp=Gn8W=C zxA#N`iw>~HoL{DEJgh-OQC+X8&&{GM?K?GDIofe`;NCA|4fAh2pdn6Fd5zTQct4zU3{$d#-xQU$&C} zMnpU9;?jEJk!ICSf4m*rmztKTt)m=Z81Td|V#n)gG5OOzCK;x?4APLAw@mmTe&0Wd z-jdut&^7)|!+r-sM=xG<%-g}S^}*j*hg#0>-{4xXWm9pqern#*EZQ%3;;fmhTkOODP6&M2*avW8c;`FHXiE{43H z+jUOEQG@QDxV3-agDH(tZ?7HI$@NRk4>OMEjtqIRgqoJyyHCSuCyx&Bi_a^RA07Ri zGu5s4P-8k6rmbL@=GqO@^!a9|z_@1m$aVLQ>eN={5#3LG!`W;_4W1frb-x>n81DHn}qXaeRR0m?7r1g%lQpon?OPPy6l0$ZIi2o5h6;>MLBrJNTTl zxc=h@ZO$Jy9EmA!Q1|&vUuXZbYvyenxG(jl==!E-e%pKR@4m7{``TBEPFV)cZgy;v zp_k$8;g%)mH@ohCA{#O{Y=|PT?&tfCw^OeA7bm6f=_Jg6%04I7&(rkXGLaWgJ>P9_;P9tCd3jAr=T2T*J>Kb@^3sNd z=^q+B@mV%SdfDmWXVo-MbF5<1QM0FO!&<)&qdqB+T>3I$W_a-GDf5qiP!44!(;LMl zNe?Y{d0x8V$T7~@uy&KDy%$+W|9aZjp-;2$?uSY?r6-nunk?#D6dLH=(6?qSW zT0`;voNbzs${xcGjl7uZQ}8n9Axqgi%B|+DvP1W)wd8 z{Z{Xh%WIC9ee%w-PW=MnK4u4Z&7J?MplMd}IQC@HWhd^)w$t0Tb&nRdc<)*2+VM-s zin0xdA3m%#x=pdi+E|W9^B@s@z?cT3_SR>x+GbVDO>jIk{p0<8(MwA0mMjh|S%*KH zL|ij<4<}veKd0DqWNpUV=6m>ivW{0WX5U>ksyfT?#En@cOGd>o!jd(_V8yn$UU8k_ zwSQpAV5NwUn=ymk7=anpagec)qakB8GH)53?)j9hQ_hUs~46`yW2Y3I}Z z`S|9CUd-4$(!boHMpCl`$KUyW)9M!Vp7=6lJad3~WJFm^OS}g7K!BvxSmA_*qZSy@hMqgj$~7_D#B&Hs@H$ zhxwj|Bc~O&idM%zIm1(Pay-r)Snyjz_TYzY`cG`~u$tu4+E(m%mzc+A9m&+N54~FA`*xw{uDkP^Zl5x<-cW4)@S1rOKGa^{JmHP&+~UUijd_ZM`MuVy z@NB=M$BQj41%v8zYT|s}Z|Rc6GneKo4s97+{rX_V2hTk1eBEZlnq!YXZ&)!j)`>eO zpvCSw-m-Z<{D{MOHSbl+FSD$h9npMRp4{tX8MfJSBFcSv*Og*n!`02Y-23oFIBUn& z)vapmsLxAdRW)AszoZ>%COXk>Lf}QyfYgP*{L_sWCaGk+Ao+I~uUPv8?7w2X9@XOhQVDc1%K9=v%-tGV%Y7dP9G_hEkRRWDx#2Tboh zcd1w2{>`IJA5$kQ-rWhl(ZN)6`5nRPDM`=k&lD#dOpbRLIVR+!!^DdYJ%eBF(_dG1 z+V5HYZvNA83)h~Tv}$XV{ITulZdm)i z^n6&$t2dXdiL3QIU~EyBY7HYBwPQcOu+;IcXc?!mwH=;~ozGR18Of1!5r z4cFX*b?&9PcbQMy;idZAihgWValEfUqFWI(EWKIDoO{2XZ@c~FqF6JHUh_h~V~GP^ z403HgyYnS~X0I)EJ3Fo}^<5p`=kcegmKWbYZhT>C{~6l_CwQDM`FK1RXqf1BG?$*cSrWc=d|Fkte)OvpNyguU;ElQkyd=4p=JNDmFax!XUH&3sP zGexHlw8a#g=X_LNZnxDZZtfw)w!Cis_ru#o4Of<>oOyQg-N$2=lnxC`S-+I)LbjfI zQ9W$rs7sPshnsqe(^kH6=NPJs!%F{N2_=U)14HH3b$mrJwHjZ1msqRszG@4K zk0lNYkmPGm`1hpM%THME) z&^xZ#-2(dE9AL*a3vaNDwtZqR$1$e|o>)A4XzUP|FEu)< zi*IQ9ZWy{j(0}?g-wCUqwwuJfy?GC}>+yRX`^JM7X7ze(r>7H?mAU zHf>%K+2~}`-49N3jtmQRiKzekgYD@rr}T{h<4=(eXLTfcOl*ktJNL4v}=-ZRsu z$8y?Ne>h;4i&uvr#fIe*W7aN8T4$YMh~lf}b+(?FxtAN;(tI#mJ8v~@w$FagfS^HL z{8inj4DDRl>fx03^bV`XF%M`L2n)7tY}&Z%jJubn54!X`Eci|B>yuZKUQvr*ju;zv z?ZLTC@80wlwd%ndJ6pC&J!eht^`%GUZ{PKBy0w0ie}~O+=B5W;K8bv|@8r%&4<6^e zztq@u$n3O;v=##u4sYr`P;V+%Ji0x1{EOnT9Z0uUCZ2^Q6m#IpXRl0cT27eiP`B-` z{!aC&(`Rw^Z3N@B2WDPNY#TkHP3UvF^&T;MhWYa6Z`~0KW(m-XJ4Fj@rlaJ)n_XWnK?gE@+M{! zG~xK=pKKKWbjazqjV@@)cI8u_+I*%tp$N)d!B!6R_)!^PFKPl1nblTYpgLW9r?b=%Y$kw`_sZ$^3szt$cDky z4mV#P9c^{VA91H(^7hjGn?5~DO$+ArnY*P?(fQj>%SU7C{Om=9H zoc^V*+x#Z(hNJs}$G^%O{b>8ub*dFXmwlW2wL3ETYm-dB;U3 z=kz%JWx$eocj8JD=Q>UP7+P}qS?D`?SU;CbL#|zU#QA*AZlLmDc4exvPS}E&^@uSc z#xKT-Lxu<2XFa;F3uu*h$}8q$M*Bntra&o}9t*aoVYi&~2S`w%E^UMZU|!+7YXPDolYf>GTwf3!E^*#1+>CX=oB? z9|~;4*FZxt!l{8j?!$j~E?H^939F|SwzWVZ;oDl?rH%HeL-^*Cr&h-vFW9|$iy(kh zU-&lu_`DC7e~CVnRkQ829xqwXLx&~!w67Ogeeb~t(czmV^rqO5wXTWYSw*LYK6MT| zI^FU1mTQwo^S8Q|WOYr=TG!b!`JAJ2W>%e-kA%JluDWA^X{~aMJ?r0~B}6_vQ&{iw z%|rc-#wOEeb7c%hL;kQ_RjX=Kb{^^D_pvFd#~O-Bu*aAi;3@b$lclR~sI~q~_PWUE zBlX%kI)_vGHdvCBpi$h;-1$^k`dYBDLG;r7u}&-AU*FPu1Er2?NE@rCPpiC)8tSOg zYbezhB)5FoeALN(pC;*!Y#oChy0-@hKQ`w`a{z!ccF6BhV73P#o^bL)B9hvUIZ*ym9T1OgvsuK;Xm}%}OCT>>V98>B@PdxMLI7>Wz=icsXb2x`IZd8k`36DDb*0qPZL$;yhU{2Fndg0^2uRK!MU#c0~^|!Qb=UrD+ z?{qYMj?b?2d!yd8@cXcF)5~?9Q@qzFF6g*S^I<^fLT;<_nNu${a`Y0G)?75%yD$8R z*AU5;8Ijc{n1!wT?%(iy;peC~`px6!)qbrzo%ib-vC=x{*o5VyzO4UPsB>F@&a6Gdr-0Ms z)uOWPA@Y%T_Fp^H_Tw~o5wEO+HK+pe!_#-srPF82AN+KG0UQ~FgTlheQZ?eX!K)^3|C zoRqxb-9mR4cmC^D8=M9UlICA3;@w}=FnzA`Q!8aGb}}w=UDoA`u|vjR$xZt8;z2Cy zh<`~v7v0S+4>5J$-Hd7a9#J#fZw+pe%{$sVp<&NG?I`aHBQ%rh47>kYoAWB;!{a{7 zX60$C@48EBlDi~rb@%;>z8wp@v3iVp@jl|&k-N(Wmrgr>4kJIjdSmiy6$(?D@bHsq7|2MiF1sJx&27BmjdFYbiVfo|o%7n)IS{+bvvqpY znk^j;oWVlBfu-^IG;9%-o?UzFfEjdBc%v}m#cQlj{rZNDKD=)H6FI9eqr+%@_wMz& zlUkW_yA^IZw##J>W+|@NvOC@YtsXBx9N-?yJUfTBlZ5lPot7P1txB(F|@~Csr&te&<2`*2MS(a zSm17GliYjz?PGJ+#V&jVE?uOiEqc1MGsyuuV(j4eR^GZ7})&e?a)3A zH3=sbhsr#koL^Trm)Fp1-KRF=wx?5GU!2f0YQo$Zw=S2@|BbnqEiH-rwO@R{ac7-B zrtXtU-pg|zJ{U15bSC$l=kgh&UFJ2tzNaj2#MrXj?U_^kMdRWwUgr;9(&SO(+r+zV z8n}MSGVbhDy|;$jwRT6=wP(jEb;hSfPiS!KaTj62s61WDdr|{8&8Jn|SKGGj__D;v zc3ju?bYZ)*+&x9B+lh7O2NefnqP4rXdMPf2caaR_9E!ZS>DZCWk({R9FVf20MKc~! zUhg3<&!7h$yq}XYf^v>S+UX&xeecPPWwg>^PBRimY^f)eHTmqmy+hIl>C8@x`W)Xf zcRgoYX4K;x%E@h%-;L_PAaPF3#3MA}q2`~}1p^#@S!LAnGKQa+nslziZ!RV4Xq$p& zycFjat>vyaoax-I{DUI9Z^y=MnIG0TPES#9T5v&A@?t{j;KruQJ=!;!tKBOQ&a9(6 zo)B5&b$fCBc6&}X>1`?FpYL|cF}%}}4*O?C7_rcq&tA!Cm(LxmeaL0-mYLSHMp;X5 nzMfdX^(#u_Y{-A_(tcb1g#)9z7!OU|G=pE`&RAA}1L^+(g^weo literal 0 HcmV?d00001 diff --git a/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.dll-Help.xml b/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.dll-Help.xml new file mode 100644 index 0000000..de42ff6 --- /dev/null +++ b/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.dll-Help.xml @@ -0,0 +1,10653 @@ + + + + + + Set-PSWUSettings + Set + PSWUSettings + + Save PSWUSettings. + + + + Use Set-PSWUSettings save PSWindowsUpdate module settings to XML file. + + + + + Set-PSWUSettings + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Properties + + Alternative report message propertie.s + + string + + System.String + + + + + + SaveAsSystem + + Invoke-WUJob to save credential as system user + + string + + System.String + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + SmtpCredential + + Save smtp credential to Credential Manager. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + SmtpEnableSsl + + Save enable ssl to PSWUSettings file. + + bool + + System.Boolean + + + False + + + + SmtpFrom + + Save smtp sernder to PSWUSettings file. + + string + + System.String + + + + + + SmtpPort + + Save smtp port to PSWUSettings file. + + int + + System.Int32 + + + 25 + + + + SmtpServer + + Save smtp server to PSWUSettings file. + + string + + System.String + + + + + + SmtpSubject + + Save alternative message subject to PSWUSettings file. + + string + + System.String + + + + + + SmtpTo + + Save smtp recipient to PSWUSettings file. + + string + + System.String + + + + + + Style + + Alternative report message format style. + + string + + System.String + + + + + + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + SmtpServer + + Save smtp server to PSWUSettings file. + + string + + System.String + + + + + + SmtpPort + + Save smtp port to PSWUSettings file. + + int + + System.Int32 + + + 25 + + + + SmtpEnableSsl + + Save enable ssl to PSWUSettings file. + + bool + + System.Boolean + + + False + + + + SmtpCredential + + Save smtp credential to Credential Manager. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + SmtpTo + + Save smtp recipient to PSWUSettings file. + + string + + System.String + + + + + + SmtpFrom + + Save smtp sernder to PSWUSettings file. + + string + + System.String + + + + + + SmtpSubject + + Save alternative message subject to PSWUSettings file. + + string + + System.String + + + + + + Properties + + Alternative report message propertie.s + + string + + System.String + + + + + + Style + + Alternative report message format style. + + string + + System.String + + + + + + SaveAsSystem + + Invoke-WUJob to save credential as system user + + string + + System.String + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + ---------- EXAMPLE 1 ---------- + Set Office 365 as smtp server for PSWindowsUpdate module. + +Set-PSWUSettings -SmtpServer smtp.office365.com -SmtpPort 587 -SmtpEnableSsl $true -SmtpSubject "PSWindowsUpdate Report" -SmtpTo mgajda@psmvp.pl -SmtpFrom mgajda@psmvp.pl -SmtpCredential (Get-Credential mgajda@psmvp.pl) + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Get-WindowsUpdate + Get + WindowsUpdate + + Get list of available updates meeting the criteria. + + + + Use Get-WindowsUpdate (aka Get-WUList) cmdlet to get list of available or installed updates meeting specific criteria. + Use Download-WindowsUpdate alias to get list of updates and download it. Equivalent Get-WindowsUpdate -Download. + Use Install-WindowsUpdate (aka Get-WUInstall) alias to get list of updates and install it. Equivalent Get-WindowsUpdate -Install. + Use Hide-WindowsUpdate alias to get list of updates and hide it. Equivalent Get-WindowsUpdate -Hide. + Use Show-WindowsUpdate (aka UnHide-WindowsUpdate) alias to get list of updates and unhide it. Equivalent Get-WindowsUpdate -Hide:$false. + There are two types of filtering update: Pre search criteria, Post search criteria. + - Pre search works on server side, like example: (IsInstalled = 0 and IsHidden = 0 and CategoryIds contains '0fa1201d-4330-4fa8-8ae9-b877473b6441' ) + - Post search work on client side after get the pre-filtered list of updates, like example $KBArticleID -match $Update.KBArticleIDs + Status info list:\r\n[A|R]DIMHUB\r\nA-IsAccetped\r\nR-IsRejected\r\n D-IsDownloaded\r\n F-DownloadFailed\r\n ?-IsInvoked\r\n I-IsInstalled\r\n F-InstallFailed\r\n ?-IsInvoked\r\n R-RebootRequired\r\n M-IsMandatory\r\n H-IsHidden\r\n U-IsUninstallable\r\n B-IsBeta + + + + + Get-WindowsUpdate + + + AcceptAll + + Do not ask confirmation for updates. Download or Install all available updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoReboot + + Do not ask for reboot if it needed. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnly + + Install only the updates that have status AutoSelectOnWebsites on true. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnWebSites + + Pre search criteria - native for WUAPI. Finds updates where the AutoSelectOnWebSites property has the specified value. + "AutoSelectOnWebSites=1" finds updates that are flagged to be automatically selected by Windows Update. + "AutoSelectOnWebSites=0" finds updates that are not flagged for Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + BrowseOnly + + Pre search criteria - native for WUAPI. "BrowseOnly=1" finds updates that are considered optional. "BrowseOnly=0" finds updates that are not considered optional. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Category + + Post search criteria. Finds updates that contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + CategoryIDs + + Pre search criteria - native for WUAPI. Finds updates that belong to a specified category (or sets of UUIDs), such as '0fa1201d-4330-4fa8-8ae9-b877473b6441'. + + string[] + + System.String[] + + + + + + ComputerName + + Specify one or more computer names for remote connection. Interactive remote connection works only for checking updates. For download or install cmdlet creates an Invoke-WUJob task. + + string[] + + System.String[] + + + + + + Criteria + + Pre search criteria - native for WUAPI. Set own string that specifies the search criteria. https://docs.microsoft.com/pl-pl/windows/desktop/api/wuapi/nf-wuapi-iupdatesearcher-search + + string + + System.String + + + + + + Debuger + + Debuger return original exceptions. For additional debug information use $DebugPreference = "Continue" + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + DeploymentAction + + Pre search criteria - native for WUAPI. Finds updates that are deployed for a specific action, such as an installation or uninstallation that the administrator of a server specifies. "DeploymentAction='Installation'" finds updates that are deployed for installation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + "DeploymentAction='Uninstallation'" finds updates that are deployed for uninstallation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + If this criterion is not explicitly specified, each group of criteria that is joined to an AND operator implies "DeploymentAction='Installation'". + + string + + System.String + + + + + + Download + + Get list of updates and download approved updates, but do not install it. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceDownload + + Forces the download of updates that are already installed or that cannot be installed. Works only with -Download. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceInstall + + A forced installation is an installation in which an update is installed even if the metadata indicates that the update is already installed. Before you use ForceInstall to force an installation, determine whether the update is installed and available. If an update is not installed, a forced installation fails. Works only with -Install. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Hide + + Get list of updates and hide/unhide approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreReboot + + Do not ask for reboot if it needed, but do not reboot automaticaly. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreRebootRequired + + Post search criteria. Finds updates that specifies the restart behavior that not occurs when you install or uninstall the update. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreUserInput + + Post search criteria. Finds updates that the installation or uninstallation of an update can't prompt for user input. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Install + + Get list of updates and install approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsAssigned + + Pre search criteria - native for WUAPI. Finds updates that are intended for deployment by Automatic Updates. "IsAssigned=1" finds updates that are intended for deployment by Automatic Updates, which depends on the other query criteria.At most, one assigned Windows-based driver update is returned for each local device on a destination computer. + "IsAssigned=0" finds updates that are not intended to be deployed by Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsHidden + + Pre search criteria - native for WUAPI. Finds updates that are marked as hidden on the destination computer. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsInstalled + + Pre search criteria - native for WUAPI. Finds updates that are installed on the destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsPresent + + Pre search criteria - native for WUAPI. When set to 1, finds updates that are present on a computer. + "IsPresent=1" finds updates that are present on a destination computer.If the update is valid for one or more products, the update is considered present if it is installed for one or more of the products. + "IsPresent=0" finds updates that are not installed for any product on a destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + KBArticleID + + Post search criteria. Finds updates that contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + MaxSize + + Post search criteria. Finds updates that have MaxDownloadSize less or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + MinSize + + Post search criteria. Finds updates that have MaxDownloadSize greater or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + NotCategory + + Post search criteria. Finds updates that not contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + NotKBArticleID + + Post search criteria. Finds updates that not contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + NotSeverity + + Post search criteria. Finds updates that not match part of severity. + + string[] + + System.String[] + + + + + + NotTitle + + Post search criteria. Finds updates that not match part of title (case sensitive). + + string + + System.String + + + + + + NotUpdateID + + Pre search criteria - native for WUAPI. Finds updates without a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + RecurseCycle + + Specify number of cycles for check updates after successful update installation or system startup. First run is always main cycle (-RecurseCycle 1 or none). Second (-RecurseCycle 2) and n (-RecurseCycle n) cycle are recursive. + + int + + System.Int32 + + + 0 + + + + RevisionNumber + + Pre search criteria - native for WUAPI. Finds updates with a specific RevisionNumber, such as '100'. This criterion must be combined with the UpdateID param. + + int + + System.Int32 + + + 0 + + + + RootCategories + + Post search criteria. Finds updates that contain a specified root category name 'Critical Updates', 'Definition Updates', 'Drivers', 'Feature Packs', 'Security Updates', 'Service Packs', 'Tools', 'Update Rollups', 'Updates', 'Upgrades', 'Microsoft'. + + string[] + + System.String[] + + + + + + ScheduleJob + + Specify time when job will start. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + ScheduleReboot + + Specify time when system will be rebooted. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + SendHistory + + Send install history (Get-WUHistory) report after successful update installation or system startup. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file (more preferred) in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ServiceID + + Use specific Service Manager if it's available. + Examples Of ServiceID: \r\n \r\n -- Windows Update 9482f4b4-e343-43b6-b170-9a65bc822c77 \r\n -- Microsoft Update 7971f918-a847-4430-9279-4a52d1efe18d \r\n -- Windows Store 117cab2d-82b1-4b5a-a08c-4d62dbee7782 \r\n -- Windows Server Update Service 3da21691-e39d-4da6-8a4b-b43877bcb1b7 + + string + + System.String + + + + + + Severity + + Post search criteria. Finds updates that match part of severity, such as 'Important', 'Critical', 'Moderate', etc... + + string[] + + System.String[] + + + + + + ShowPreSearchCriteria + + Show choosen search criteria. Only works for pre search criteria. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Title + + Post search criteria. Finds updates that match part of title (case sensitive), such as '.NET Framework 4'. + + string + + System.String + + + + + + UpdateID + + Pre search criteria - native for WUAPI. Finds updates with a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + UpdateType + + Pre search criteria - native for WUAPI. Finds updates with a specific type, such as 'Driver' and 'Software'. Default value contains all updates. + + string + + System.String + + + + + + WithHidden + + Pre search criteria - native for WUAPI. Finds updates that are both hidden and not on the destination computer. Overwrite IsHidden param. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + Get-WindowsUpdate + + + AcceptAll + + Do not ask confirmation for updates. Download or Install all available updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoReboot + + Do not ask for reboot if it needed. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnly + + Install only the updates that have status AutoSelectOnWebsites on true. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnWebSites + + Pre search criteria - native for WUAPI. Finds updates where the AutoSelectOnWebSites property has the specified value. + "AutoSelectOnWebSites=1" finds updates that are flagged to be automatically selected by Windows Update. + "AutoSelectOnWebSites=0" finds updates that are not flagged for Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + BrowseOnly + + Pre search criteria - native for WUAPI. "BrowseOnly=1" finds updates that are considered optional. "BrowseOnly=0" finds updates that are not considered optional. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Category + + Post search criteria. Finds updates that contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + CategoryIDs + + Pre search criteria - native for WUAPI. Finds updates that belong to a specified category (or sets of UUIDs), such as '0fa1201d-4330-4fa8-8ae9-b877473b6441'. + + string[] + + System.String[] + + + + + + ComputerName + + Specify one or more computer names for remote connection. Interactive remote connection works only for checking updates. For download or install cmdlet creates an Invoke-WUJob task. + + string[] + + System.String[] + + + + + + Criteria + + Pre search criteria - native for WUAPI. Set own string that specifies the search criteria. https://docs.microsoft.com/pl-pl/windows/desktop/api/wuapi/nf-wuapi-iupdatesearcher-search + + string + + System.String + + + + + + Debuger + + Debuger return original exceptions. For additional debug information use $DebugPreference = "Continue" + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + DeploymentAction + + Pre search criteria - native for WUAPI. Finds updates that are deployed for a specific action, such as an installation or uninstallation that the administrator of a server specifies. "DeploymentAction='Installation'" finds updates that are deployed for installation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + "DeploymentAction='Uninstallation'" finds updates that are deployed for uninstallation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + If this criterion is not explicitly specified, each group of criteria that is joined to an AND operator implies "DeploymentAction='Installation'". + + string + + System.String + + + + + + Download + + Get list of updates and download approved updates, but do not install it. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceDownload + + Forces the download of updates that are already installed or that cannot be installed. Works only with -Download. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceInstall + + A forced installation is an installation in which an update is installed even if the metadata indicates that the update is already installed. Before you use ForceInstall to force an installation, determine whether the update is installed and available. If an update is not installed, a forced installation fails. Works only with -Install. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Hide + + Get list of updates and hide/unhide approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreReboot + + Do not ask for reboot if it needed, but do not reboot automaticaly. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreRebootRequired + + Post search criteria. Finds updates that specifies the restart behavior that not occurs when you install or uninstall the update. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreUserInput + + Post search criteria. Finds updates that the installation or uninstallation of an update can't prompt for user input. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Install + + Get list of updates and install approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsAssigned + + Pre search criteria - native for WUAPI. Finds updates that are intended for deployment by Automatic Updates. "IsAssigned=1" finds updates that are intended for deployment by Automatic Updates, which depends on the other query criteria.At most, one assigned Windows-based driver update is returned for each local device on a destination computer. + "IsAssigned=0" finds updates that are not intended to be deployed by Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsHidden + + Pre search criteria - native for WUAPI. Finds updates that are marked as hidden on the destination computer. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsInstalled + + Pre search criteria - native for WUAPI. Finds updates that are installed on the destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsPresent + + Pre search criteria - native for WUAPI. When set to 1, finds updates that are present on a computer. + "IsPresent=1" finds updates that are present on a destination computer.If the update is valid for one or more products, the update is considered present if it is installed for one or more of the products. + "IsPresent=0" finds updates that are not installed for any product on a destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + KBArticleID + + Post search criteria. Finds updates that contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + MaxSize + + Post search criteria. Finds updates that have MaxDownloadSize less or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + MinSize + + Post search criteria. Finds updates that have MaxDownloadSize greater or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + NotCategory + + Post search criteria. Finds updates that not contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + NotKBArticleID + + Post search criteria. Finds updates that not contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + NotSeverity + + Post search criteria. Finds updates that not match part of severity. + + string[] + + System.String[] + + + + + + NotTitle + + Post search criteria. Finds updates that not match part of title (case sensitive). + + string + + System.String + + + + + + NotUpdateID + + Pre search criteria - native for WUAPI. Finds updates without a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + RecurseCycle + + Specify number of cycles for check updates after successful update installation or system startup. First run is always main cycle (-RecurseCycle 1 or none). Second (-RecurseCycle 2) and n (-RecurseCycle n) cycle are recursive. + + int + + System.Int32 + + + 0 + + + + RevisionNumber + + Pre search criteria - native for WUAPI. Finds updates with a specific RevisionNumber, such as '100'. This criterion must be combined with the UpdateID param. + + int + + System.Int32 + + + 0 + + + + RootCategories + + Post search criteria. Finds updates that contain a specified root category name 'Critical Updates', 'Definition Updates', 'Drivers', 'Feature Packs', 'Security Updates', 'Service Packs', 'Tools', 'Update Rollups', 'Updates', 'Upgrades', 'Microsoft'. + + string[] + + System.String[] + + + + + + ScheduleJob + + Specify time when job will start. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + ScheduleReboot + + Specify time when system will be rebooted. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + SendHistory + + Send install history (Get-WUHistory) report after successful update installation or system startup. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file (more preferred) in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Severity + + Post search criteria. Finds updates that match part of severity, such as 'Important', 'Critical', 'Moderate', etc... + + string[] + + System.String[] + + + + + + ShowPreSearchCriteria + + Show choosen search criteria. Only works for pre search criteria. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Title + + Post search criteria. Finds updates that match part of title (case sensitive), such as '.NET Framework 4'. + + string + + System.String + + + + + + UpdateID + + Pre search criteria - native for WUAPI. Finds updates with a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + UpdateType + + Pre search criteria - native for WUAPI. Finds updates with a specific type, such as 'Driver' and 'Software'. Default value contains all updates. + + string + + System.String + + + + + + WindowsUpdate + + Use Microsoft Update Service Manager - '7971f918-a847-4430-9279-4a52d1efe18d' + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + WithHidden + + Pre search criteria - native for WUAPI. Finds updates that are both hidden and not on the destination computer. Overwrite IsHidden param. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + Get-WindowsUpdate + + + AcceptAll + + Do not ask confirmation for updates. Download or Install all available updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoReboot + + Do not ask for reboot if it needed. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnly + + Install only the updates that have status AutoSelectOnWebsites on true. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnWebSites + + Pre search criteria - native for WUAPI. Finds updates where the AutoSelectOnWebSites property has the specified value. + "AutoSelectOnWebSites=1" finds updates that are flagged to be automatically selected by Windows Update. + "AutoSelectOnWebSites=0" finds updates that are not flagged for Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + BrowseOnly + + Pre search criteria - native for WUAPI. "BrowseOnly=1" finds updates that are considered optional. "BrowseOnly=0" finds updates that are not considered optional. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Category + + Post search criteria. Finds updates that contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + CategoryIDs + + Pre search criteria - native for WUAPI. Finds updates that belong to a specified category (or sets of UUIDs), such as '0fa1201d-4330-4fa8-8ae9-b877473b6441'. + + string[] + + System.String[] + + + + + + ComputerName + + Specify one or more computer names for remote connection. Interactive remote connection works only for checking updates. For download or install cmdlet creates an Invoke-WUJob task. + + string[] + + System.String[] + + + + + + Criteria + + Pre search criteria - native for WUAPI. Set own string that specifies the search criteria. https://docs.microsoft.com/pl-pl/windows/desktop/api/wuapi/nf-wuapi-iupdatesearcher-search + + string + + System.String + + + + + + Debuger + + Debuger return original exceptions. For additional debug information use $DebugPreference = "Continue" + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + DeploymentAction + + Pre search criteria - native for WUAPI. Finds updates that are deployed for a specific action, such as an installation or uninstallation that the administrator of a server specifies. "DeploymentAction='Installation'" finds updates that are deployed for installation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + "DeploymentAction='Uninstallation'" finds updates that are deployed for uninstallation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + If this criterion is not explicitly specified, each group of criteria that is joined to an AND operator implies "DeploymentAction='Installation'". + + string + + System.String + + + + + + Download + + Get list of updates and download approved updates, but do not install it. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceDownload + + Forces the download of updates that are already installed or that cannot be installed. Works only with -Download. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceInstall + + A forced installation is an installation in which an update is installed even if the metadata indicates that the update is already installed. Before you use ForceInstall to force an installation, determine whether the update is installed and available. If an update is not installed, a forced installation fails. Works only with -Install. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Hide + + Get list of updates and hide/unhide approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreReboot + + Do not ask for reboot if it needed, but do not reboot automaticaly. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreRebootRequired + + Post search criteria. Finds updates that specifies the restart behavior that not occurs when you install or uninstall the update. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreUserInput + + Post search criteria. Finds updates that the installation or uninstallation of an update can't prompt for user input. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Install + + Get list of updates and install approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsAssigned + + Pre search criteria - native for WUAPI. Finds updates that are intended for deployment by Automatic Updates. "IsAssigned=1" finds updates that are intended for deployment by Automatic Updates, which depends on the other query criteria.At most, one assigned Windows-based driver update is returned for each local device on a destination computer. + "IsAssigned=0" finds updates that are not intended to be deployed by Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsHidden + + Pre search criteria - native for WUAPI. Finds updates that are marked as hidden on the destination computer. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsInstalled + + Pre search criteria - native for WUAPI. Finds updates that are installed on the destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsPresent + + Pre search criteria - native for WUAPI. When set to 1, finds updates that are present on a computer. + "IsPresent=1" finds updates that are present on a destination computer.If the update is valid for one or more products, the update is considered present if it is installed for one or more of the products. + "IsPresent=0" finds updates that are not installed for any product on a destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + KBArticleID + + Post search criteria. Finds updates that contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + MaxSize + + Post search criteria. Finds updates that have MaxDownloadSize less or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + MicrosoftUpdate + + Use Windows Update Service Manager - '9482f4b4-e343-43b6-b170-9a65bc822c77' + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + MinSize + + Post search criteria. Finds updates that have MaxDownloadSize greater or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + NotCategory + + Post search criteria. Finds updates that not contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + NotKBArticleID + + Post search criteria. Finds updates that not contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + NotSeverity + + Post search criteria. Finds updates that not match part of severity. + + string[] + + System.String[] + + + + + + NotTitle + + Post search criteria. Finds updates that not match part of title (case sensitive). + + string + + System.String + + + + + + NotUpdateID + + Pre search criteria - native for WUAPI. Finds updates without a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + RecurseCycle + + Specify number of cycles for check updates after successful update installation or system startup. First run is always main cycle (-RecurseCycle 1 or none). Second (-RecurseCycle 2) and n (-RecurseCycle n) cycle are recursive. + + int + + System.Int32 + + + 0 + + + + RevisionNumber + + Pre search criteria - native for WUAPI. Finds updates with a specific RevisionNumber, such as '100'. This criterion must be combined with the UpdateID param. + + int + + System.Int32 + + + 0 + + + + RootCategories + + Post search criteria. Finds updates that contain a specified root category name 'Critical Updates', 'Definition Updates', 'Drivers', 'Feature Packs', 'Security Updates', 'Service Packs', 'Tools', 'Update Rollups', 'Updates', 'Upgrades', 'Microsoft'. + + string[] + + System.String[] + + + + + + ScheduleJob + + Specify time when job will start. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + ScheduleReboot + + Specify time when system will be rebooted. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + SendHistory + + Send install history (Get-WUHistory) report after successful update installation or system startup. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file (more preferred) in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Severity + + Post search criteria. Finds updates that match part of severity, such as 'Important', 'Critical', 'Moderate', etc... + + string[] + + System.String[] + + + + + + ShowPreSearchCriteria + + Show choosen search criteria. Only works for pre search criteria. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Title + + Post search criteria. Finds updates that match part of title (case sensitive), such as '.NET Framework 4'. + + string + + System.String + + + + + + UpdateID + + Pre search criteria - native for WUAPI. Finds updates with a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + UpdateType + + Pre search criteria - native for WUAPI. Finds updates with a specific type, such as 'Driver' and 'Software'. Default value contains all updates. + + string + + System.String + + + + + + WithHidden + + Pre search criteria - native for WUAPI. Finds updates that are both hidden and not on the destination computer. Overwrite IsHidden param. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + ComputerName + + Specify one or more computer names for remote connection. Interactive remote connection works only for checking updates. For download or install cmdlet creates an Invoke-WUJob task. + + string[] + + System.String[] + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file (more preferred) in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendHistory + + Send install history (Get-WUHistory) report after successful update installation or system startup. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ScheduleJob + + Specify time when job will start. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + AcceptAll + + Do not ask confirmation for updates. Download or Install all available updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + RecurseCycle + + Specify number of cycles for check updates after successful update installation or system startup. First run is always main cycle (-RecurseCycle 1 or none). Second (-RecurseCycle 2) and n (-RecurseCycle n) cycle are recursive. + + int + + System.Int32 + + + 0 + + + + Hide + + Get list of updates and hide/unhide approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Download + + Get list of updates and download approved updates, but do not install it. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceDownload + + Forces the download of updates that are already installed or that cannot be installed. Works only with -Download. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Install + + Get list of updates and install approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceInstall + + A forced installation is an installation in which an update is installed even if the metadata indicates that the update is already installed. Before you use ForceInstall to force an installation, determine whether the update is installed and available. If an update is not installed, a forced installation fails. Works only with -Install. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoReboot + + Do not ask for reboot if it needed. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreReboot + + Do not ask for reboot if it needed, but do not reboot automaticaly. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ScheduleReboot + + Specify time when system will be rebooted. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + ServiceID + + Use specific Service Manager if it's available. + Examples Of ServiceID: \r\n \r\n -- Windows Update 9482f4b4-e343-43b6-b170-9a65bc822c77 \r\n -- Microsoft Update 7971f918-a847-4430-9279-4a52d1efe18d \r\n -- Windows Store 117cab2d-82b1-4b5a-a08c-4d62dbee7782 \r\n -- Windows Server Update Service 3da21691-e39d-4da6-8a4b-b43877bcb1b7 + + string + + System.String + + + + + + WindowsUpdate + + Use Microsoft Update Service Manager - '7971f918-a847-4430-9279-4a52d1efe18d' + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + MicrosoftUpdate + + Use Windows Update Service Manager - '9482f4b4-e343-43b6-b170-9a65bc822c77' + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Criteria + + Pre search criteria - native for WUAPI. Set own string that specifies the search criteria. https://docs.microsoft.com/pl-pl/windows/desktop/api/wuapi/nf-wuapi-iupdatesearcher-search + + string + + System.String + + + + + + UpdateType + + Pre search criteria - native for WUAPI. Finds updates with a specific type, such as 'Driver' and 'Software'. Default value contains all updates. + + string + + System.String + + + + + + DeploymentAction + + Pre search criteria - native for WUAPI. Finds updates that are deployed for a specific action, such as an installation or uninstallation that the administrator of a server specifies. "DeploymentAction='Installation'" finds updates that are deployed for installation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + "DeploymentAction='Uninstallation'" finds updates that are deployed for uninstallation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + If this criterion is not explicitly specified, each group of criteria that is joined to an AND operator implies "DeploymentAction='Installation'". + + string + + System.String + + + + + + IsAssigned + + Pre search criteria - native for WUAPI. Finds updates that are intended for deployment by Automatic Updates. "IsAssigned=1" finds updates that are intended for deployment by Automatic Updates, which depends on the other query criteria.At most, one assigned Windows-based driver update is returned for each local device on a destination computer. + "IsAssigned=0" finds updates that are not intended to be deployed by Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsPresent + + Pre search criteria - native for WUAPI. When set to 1, finds updates that are present on a computer. + "IsPresent=1" finds updates that are present on a destination computer.If the update is valid for one or more products, the update is considered present if it is installed for one or more of the products. + "IsPresent=0" finds updates that are not installed for any product on a destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + BrowseOnly + + Pre search criteria - native for WUAPI. "BrowseOnly=1" finds updates that are considered optional. "BrowseOnly=0" finds updates that are not considered optional. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnWebSites + + Pre search criteria - native for WUAPI. Finds updates where the AutoSelectOnWebSites property has the specified value. + "AutoSelectOnWebSites=1" finds updates that are flagged to be automatically selected by Windows Update. + "AutoSelectOnWebSites=0" finds updates that are not flagged for Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + UpdateID + + Pre search criteria - native for WUAPI. Finds updates with a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + NotUpdateID + + Pre search criteria - native for WUAPI. Finds updates without a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + RevisionNumber + + Pre search criteria - native for WUAPI. Finds updates with a specific RevisionNumber, such as '100'. This criterion must be combined with the UpdateID param. + + int + + System.Int32 + + + 0 + + + + CategoryIDs + + Pre search criteria - native for WUAPI. Finds updates that belong to a specified category (or sets of UUIDs), such as '0fa1201d-4330-4fa8-8ae9-b877473b6441'. + + string[] + + System.String[] + + + + + + IsInstalled + + Pre search criteria - native for WUAPI. Finds updates that are installed on the destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsHidden + + Pre search criteria - native for WUAPI. Finds updates that are marked as hidden on the destination computer. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + WithHidden + + Pre search criteria - native for WUAPI. Finds updates that are both hidden and not on the destination computer. Overwrite IsHidden param. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ShowPreSearchCriteria + + Show choosen search criteria. Only works for pre search criteria. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + RootCategories + + Post search criteria. Finds updates that contain a specified root category name 'Critical Updates', 'Definition Updates', 'Drivers', 'Feature Packs', 'Security Updates', 'Service Packs', 'Tools', 'Update Rollups', 'Updates', 'Upgrades', 'Microsoft'. + + string[] + + System.String[] + + + + + + Category + + Post search criteria. Finds updates that contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + KBArticleID + + Post search criteria. Finds updates that contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + Title + + Post search criteria. Finds updates that match part of title (case sensitive), such as '.NET Framework 4'. + + string + + System.String + + + + + + Severity + + Post search criteria. Finds updates that match part of severity, such as 'Important', 'Critical', 'Moderate', etc... + + string[] + + System.String[] + + + + + + NotCategory + + Post search criteria. Finds updates that not contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + NotKBArticleID + + Post search criteria. Finds updates that not contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + NotTitle + + Post search criteria. Finds updates that not match part of title (case sensitive). + + string + + System.String + + + + + + NotSeverity + + Post search criteria. Finds updates that not match part of severity. + + string[] + + System.String[] + + + + + + IgnoreUserInput + + Post search criteria. Finds updates that the installation or uninstallation of an update can't prompt for user input. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + Silent + + Post search criteria. Finds updates that the installation or uninstallation of an update can't prompt for user input. + This is an alias of the IgnoreUserInput parameter. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreRebootRequired + + Post search criteria. Finds updates that specifies the restart behavior that not occurs when you install or uninstall the update. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnly + + Install only the updates that have status AutoSelectOnWebsites on true. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + MaxSize + + Post search criteria. Finds updates that have MaxDownloadSize less or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + MinSize + + Post search criteria. Finds updates that have MaxDownloadSize greater or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + Debuger + + Debuger return original exceptions. For additional debug information use $DebugPreference = "Continue" + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. Interactive remote connection works only for checking updates. For download or install cmdlet creates an Invoke-WUJob task. + + + + + + + + PSWindowsUpdate.WindowsUpdate + + + + OutputType for WindowsUpdate objects. + + + + + + ---------- EXAMPLE 1 ---------- + Get windows updates available from default service manager. + +Get-WindowsUpdate -Verbose + +VERBOSE: MG-PC: Connecting to Windows Server Update Service server. Please wait... +VERBOSE: Found[4] Updates in pre search criteria +VERBOSE: Found[4] Updates in post search criteria + +ComputerName Status KB Size Title +------------ ------ -- ---- ----- +MG-PC ------- KB890830 44MB Narzędzie Windows do usuwania złośliwego oprogramowania dla systemów Window... +MG-PC ------- KB4034658 1GB 2017-08 Aktualizacja zbiorcza dla systemu Windows 10 Version 1607 dla syste... +MG-PC ------- KB4034662 21MB 2017-08 Aktualizacja zabezpieczeń Adobe Flash Player w Windows 10 Version 1... +MG-PC ------- KB4035631 11MB 2017-08 Aktualizacja Windows 10 Version 1607 dla systemów opartych na archi... + + + ---------- EXAMPLE 2 ---------- + Get all installed drivers that are available at Windows Update. Additionaly show pre search criteria. + +Get-WindowsUpdate -WindowsUpdate -UpdateType Driver -IsInstalled -ShowPreSearchCriteria -Verbose + +PreSearchCriteria: IsInstalled = 0 and Type = 'Driver' and IsHidden = 0 +VERBOSE: MG-PC: Connecting to Windows Update server.Please wait... +VERBOSE: Found[1] Updates in pre search criteria +VERBOSE: Found[1] Updates in post search criteria + +ComputerName Status KB Size Title +------------ ------ -- ---- ----- +MGAJDALAP3 -DI---- 3MB Intel - Other hardware - Intel(R) Watchdog Timer Driver (Intel(R) WDT) + + + ---------- EXAMPLE 3 ---------- + Get all available update on remote machine MG-PC, that contains in Title this two words 'Aktualizacja' and 'Windows 10' (as regular expression). + +Get-WindowsUpdate -ComputerName MG-PC -MicrosoftUpdate -Title "Aktualizacja.*Windows 10" -Verbose + +VERBOSE: MG-PC: Connecting to Microsoft Update server. Please wait... +VERBOSE: Found[14] Updates in pre search criteria +VERBOSE: Found[5] Updates in post search criteria + +ComputerName Status KB Size Title +------------ ------ -- ---- ----- +MG-PC ------- KB3150513 2MB 2017-06 Aktualizacja Windows 10 Version 1607 dla systemów opartych na archi... +MG-PC ------- KB4034658 1GB 2017-08 Aktualizacja zbiorcza dla systemu Windows 10 Version 1607 dla syste... +MG-PC ------- KB4034662 21MB 2017-08 Aktualizacja zabezpieczeń Adobe Flash Player w Windows 10 Version 1... +MG-PC ------- KB4035631 11MB 2017-08 Aktualizacja Windows 10 Version 1607 dla systemów opartych na archi... +MG-PC ------- KB4033637 4MB Aktualizacja systemu Windows 10 Version 1607 dla komputerów z procesorami x... + + + ---------- EXAMPLE 4 ---------- + Hide update with KBArticleID: KB4034658. + +Get-WindowsUpdate -KBArticleID KB4034658 -Hide -Verbose +or use alias +Hide-WindowsUpdate -KBArticleID KB4034658 -Verbose + +VERBOSE: MG-PC: Connecting to Windows Server Update Service server. Please wait... +VERBOSE: Found[4] Updates in pre search criteria +VERBOSE: Found[1] Updates in post search criteria + +Confirm +Are you sure you want to perform this action? +Performing the operation "Hide 2017-08 Aktualizacja zbiorcza dla systemu Windows 10 Version 1607 dla systemów opartych na architekturze x64 (KB4034658)[1GB]" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + +ComputerName Status KB Size Title +------------ ------ -- ---- ----- +MG-PC ---H-- KB4034658 1GB 2017-08 Aktualizacja zbiorcza dla systemu Windows 10 Version 1607 dla syste... + + + ---------- EXAMPLE 5 ---------- + Unhide update with KBArticleID: KB4034658. + +Get-WindowsUpdate -KBArticleID KB4034658 -WithHidden -Hide:$false -Verbose +or use alias +Show-WindowsUpdate -KBArticleID KB4034658 -Verbose + +VERBOSE: MG-PC: Connecting to Windows Server Update Service server. Please wait... +VERBOSE: Found[4] Updates in pre search criteria +VERBOSE: Found[1] Updates in post search criteria + +Confirm +Are you sure you want to perform this action? +Performing the operation "Show 2017-08 Aktualizacja zbiorcza dla systemu Windows 10 Version 1607 dla systemów opartych na architekturze x64 (KB4034658)[1GB]" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + +ComputerName Status KB Size Title +------------ ------ -- ---- ----- +MG-PC ------ KB4034658 1GB 2017-08 Aktualizacja zbiorcza dla systemu Windows 10 Version 1607 dla syste... + + + ---------- EXAMPLE 6 ---------- + Schedule job at 6:00 PM to install update with UpdateId='ddb74579-7a1f-4d1f-80c8-e8647055314e' and RevisionNumber=200. Update will be automaticaly accepted and after all serwer will be automaticaly restarted if needed. + +Get-WindowsUpdate -MicrosoftUpdate -UpdateID ddb74579-7a1f-4d1f-80c8-e8647055314e -RevisionNumber 200 -ScheduleJob (Get-Date -Hour 18 -Minute 0 -Second 0) -Install -AcceptAll -AutoReboot -Verbose +or use alias +Install-WindowsUpdate -MicrosoftUpdate -UpdateID ddb74579-7a1f-4d1f-80c8-e8647055314e -RevisionNumber 200 -ScheduleJob (Get-Date -Hour 18 -Minute 0 -Second 0) -AcceptAll -AutoReboot -Verbose + +VERBOSE: MG-PC: Connecting to Microsoft Update server. Please wait... +VERBOSE: Found[1] Updates in pre search criteria +VERBOSE: Found[1] Updates in post search criteria +VERBOSE: Choosed pre Search Criteria: (UpdateID = 'ddb74579-7a1f-4d1f-80c8-e8647055314e' and RevisionNumber = 200) + +X ComputerName Result KB Size Title +- ------------ ------ -- ---- ----- +1 MG-PC Accepted KB4023307 13MB Microsoft Silverlight(KB4023307) +VERBOSE: Accepted[1] Updates ready to Download +VERBOSE: Invoke-WUJob: MG-PC(31.08.2017 18:00:00): +VERBOSE: powershell.exe -Command "Get-WindowsUpdate -Criteria \"(UpdateID = 'ddb74579-7a1f-4d1f-80c8-e8647055314e' and RevisionNumber = 200)\" -AcceptAll -AutoReboot -Download -Install -MicrosoftUpdate -Verbose *>&1 | Out-File $Env:TEMP\PSWindowsUpdate.log" + + + ---------- EXAMPLE 7 ---------- + Install updates on remote computer. After all send a report from the installation process. + +Install-WindowsUpdate -ComputerName MG-PC -MicrosoftUpdate -AcceptAll -AutoReboot -SendReport -PSWUSettings @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";Port=25} -Verbose +or use global PSWUSettings +@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";Port=25} | Export-Clixml -Path 'C:\Program Files\WindowsPowerShell\Modules\PSWindowsUpdate\PSWUSettings.xml' +Install-WindowsUpdate -ComputerName MG-PC -MicrosoftUpdate -AcceptAll -AutoReboot -SendReport -Verbose + +VERBOSE: MG-PC: Connecting to Microsoft Update server. Please wait... +VERBOSE: Found[4] Updates in pre search criteria +VERBOSE: Found[4] Updates in post search criteria + +Confirm +Are you sure you want to perform this action? +Performing the operation "Microsoft Silverlight (KB4023307)[13MB]" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + +Confirm +Are you sure you want to perform this action? +Performing the operation "2017-06 Aktualizacja Windows 10 Version 1607 dla systemów opartych na architekturze x64 (KB3150513)[2MB]" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + +Confirm +Are you sure you want to perform this action? +Performing the operation "Aktualizacja pakietu językowego usługi Microsoft Dynamics 365 2.1[47MB]" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): L + +X ComputerName Result KB Size Title +- ------------ ------ -- ---- ----- +1 MG-PC Accepted KB4023307 13MB Microsoft Silverlight (KB4023307) +1 MG-PC Accepted KB3150513 2MB 2017-06 Aktualizacja Windows 10 Version 1607 dla systemów opartych na arc... +1 MG-PC Rejected KB4013759 47MB Aktualizacja pakietu językowego usługi Microsoft Dynamics 365 2.1 +1 MG-PC Rejected KB3186568 67MB Program Microsoft .NET Framework 4.7 w syst. Windows 10 Version 1607 i Wi... +VERBOSE: Accepted [2] +Updates ready to Download +VERBOSE: Invoke-WUJob: MG-PC (Now): +VERBOSE: powershell.exe -Command "Get-WindowsUpdate -Criteria \"(UpdateID = 'ddb74579-7a1f-4d1f-80c8-e8647055314e' and RevisionNumber = 200) or (UpdateID = '151c4402-513c-4f39-8da1-f84d0956b5e3' and RevisionNumber = 200)\" -AcceptAll -Download -Install -AutoReboot -MicrosoftUpdate -SendReport -ProofOfLife -Verbose *>&1 | Out-File $Env:TEMP\PSWindowsUpdate.log" + + + ---------- EXAMPLE 8 ---------- + Schedule Job to install all available updates and automatically reboot system if needed. Also send report after installation (but before reboot if needed) and send second instalation history report after reboot. + +@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";Port=25} | Export-Clixml -Path 'C:\Program Files\WindowsPowerShell\Modules\PSWindowsUpdate\PSWUSettings.xml' +Install-WindowsUpdate -MicrosoftUpdate -SendReport -SendHistory -AcceptAll -AutoReboot -ScheduleJob (Get-Date -Hour 18 -Minute 30 -Second 0) -ComputerName MG-PC -Verbose + +VERBOSE: MG-PC: Connecting to Microsoft Update server. Please wait... +VERBOSE: Found[4] Updates in pre search criteria +VERBOSE: Found[4] Updates in post search criteria + +X ComputerName Result KB Size Title +- ------------ ------ -- ---- ----- +1 MG-PC Accepted KB3038936 5MB Aktualizacja systemu Windows 8.1 dla komputerów z procesorami x64(KB3038... +1 MG-PC Accepted KB3186606 4MB Pakiety językowe programu Microsoft.NET Framework 4.7 w syst. Windows 8.... +1 MG-PC Accepted KB4035038 53MB Sierpień 2017: wersja zapozn. pak.zb.aktual.jakości dla pr. .NET Frame... +1 MG-PC Accepted KB2267602 309MB Aktualizacja definicji dla: Windows Defender — KB2267602 (Definicja 1.251... +VERBOSE: Accepted[4] Updates ready to Download +VERBOSE: Invoke-WUJob: MG-PC (02.09.2017 08:30:00): +VERBOSE: powershell.exe -Command "Get-WindowsUpdate -Criteria \"(UpdateID = 'e69c9679-7ce8-489a-a21c-62fb920be67a' and RevisionNumber = 201) or(UpdateID = 'de44604d-ec38-4a7f-ac63-28b3edfdb382' and RevisionNumber = 207) or(UpdateID = '9cf1d8c9-a7c3-4603-90e8-f22131ff6d7e' and RevisionNumber = 201) or(UpdateID = 'b51935f9-0e40-4624-9c26-b29bff92dcf9' and RevisionNumber = 200)\" -AcceptAll -Install -AutoReboot -MicrosoftUpdate -SendReport -SendHistory -Verbose *>&1 | Out-File $Env:TEMP\PSWindowsUpdate.log" +VERBOSE: Send report + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Remove-WindowsUpdate + Remove + WindowsUpdate + + Uninstall update. + + + + Use Remove-WindowsUpdate to uninstall update. + + + + + Remove-WindowsUpdate + + + KBArticleID + + KBArticleID that will be uninstalled. + + string + + System.String + + + + + + AutoReboot + + Do not ask for reboot if it needed. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreReboot + + Do not ask for reboot if it needed, but do not reboot automaticaly. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ScheduleJob + + Specify schedule time job. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + ScheduleReboot + + Specify time when system will be rebooted. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + WUSAMode + + Wse wusa.exe instead of WU Api. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + Remove-WindowsUpdate + + + UpdateID + + Update ID that will be uninstalled. + + string + + System.String + + + + + + AutoReboot + + Do not ask for reboot if it needed. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreReboot + + Do not ask for reboot if it needed, but do not reboot automaticaly. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ScheduleJob + + Specify schedule time job. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + ScheduleReboot + + Specify time when system will be rebooted. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + WUSAMode + + Wse wusa.exe instead of WU Api. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + ScheduleJob + + Specify schedule time job. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + KBArticleID + + KBArticleID that will be uninstalled. + + string + + System.String + + + + + HotFixID + + KBArticleID that will be uninstalled. + This is an alias of the KBArticleID parameter. + + string + + System.String + + + + + + UpdateID + + Update ID that will be uninstalled. + + string + + System.String + + + + + + AutoReboot + + Do not ask for reboot if it needed. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreReboot + + Do not ask for reboot if it needed, but do not reboot automaticaly. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ScheduleReboot + + Specify time when system will be rebooted. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + WUSAMode + + Wse wusa.exe instead of WU Api. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. + + + + + + + ---------- EXAMPLE 1 ---------- + Try to uninstall update with specific KBArticleID = KB958830. + +Get-WUUninstall -KBArticleID KB958830 + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Get-WindowsUpdate_v2 + Get + WindowsUpdate_v2 + + Get list of available updates meeting the criteria. + + + + Use Get-WindowsUpdate (aka Get-WUList) cmdlet to get list of available or installed updates meeting specific criteria. + Use Download-WindowsUpdate alias to get list of updates and download it. Equivalent Get-WindowsUpdate -Download. + Use Install-WindowsUpdate (aka Get-WUInstall) alias to get list of updates and install it. Equivalent Get-WindowsUpdate -Install. + Use Hide-WindowsUpdate alias to get list of updates and hide it. Equivalent Get-WindowsUpdate -Hide. + Use Show-WindowsUpdate (aka UnHide-WindowsUpdate) alias to get list of updates and unhide it. Equivalent Get-WindowsUpdate -Hide:$false. + There are two types of filtering update: Pre search criteria, Post search criteria. + - Pre search works on server side, like example: (IsInstalled = 0 and IsHidden = 0 and CategoryIds contains '0fa1201d-4330-4fa8-8ae9-b877473b6441' ) + - Post search work on client side after get the pre-filtered list of updates, like example $KBArticleID -match $Update.KBArticleIDs + Status info list:\r\n[A|R]DIMHUB\r\nA-IsAccetped\r\nR-IsRejected\r\n D-IsDownloaded\r\n F-DownloadFailed\r\n ?-IsInvoked\r\n I-IsInstalled\r\n F-InstallFailed\r\n ?-IsInvoked\r\n R-RebootRequired\r\n M-IsMandatory\r\n H-IsHidden\r\n U-IsUninstallable\r\n B-IsBeta + + + + + Get-WindowsUpdate_v2 + + + AcceptAll + + Do not ask confirmation for updates. Download or Install all available updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoReboot + + Do not ask for reboot if it needed. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnly + + Install only the updates that have status AutoSelectOnWebsites on true. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnWebSites + + Pre search criteria - native for WUAPI. Finds updates where the AutoSelectOnWebSites property has the specified value. + "AutoSelectOnWebSites=1" finds updates that are flagged to be automatically selected by Windows Update. + "AutoSelectOnWebSites=0" finds updates that are not flagged for Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + BrowseOnly + + Pre search criteria - native for WUAPI. "BrowseOnly=1" finds updates that are considered optional. "BrowseOnly=0" finds updates that are not considered optional. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Category + + Post search criteria. Finds updates that contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + CategoryIDs + + Pre search criteria - native for WUAPI. Finds updates that belong to a specified category (or sets of UUIDs), such as '0fa1201d-4330-4fa8-8ae9-b877473b6441'. + + string[] + + System.String[] + + + + + + ComputerName + + Specify one or more computer names for remote connection. Interactive remote connection works only for checking updates. For download or install cmdlet creates an Invoke-WUJob task. + + string[] + + System.String[] + + + + + + Criteria + + Pre search criteria - native for WUAPI. Set own string that specifies the search criteria. https://docs.microsoft.com/pl-pl/windows/desktop/api/wuapi/nf-wuapi-iupdatesearcher-search + + string + + System.String + + + + + + Debuger + + Debuger return original exceptions. For additional debug information use $DebugPreference = "Continue" + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + DeploymentAction + + Pre search criteria - native for WUAPI. Finds updates that are deployed for a specific action, such as an installation or uninstallation that the administrator of a server specifies. "DeploymentAction='Installation'" finds updates that are deployed for installation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + "DeploymentAction='Uninstallation'" finds updates that are deployed for uninstallation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + If this criterion is not explicitly specified, each group of criteria that is joined to an AND operator implies "DeploymentAction='Installation'". + + string + + System.String + + + + + + Download + + Get list of updates and download approved updates, but do not install it. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceDownload + + Forces the download of updates that are already installed or that cannot be installed. Works only with -Download. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceInstall + + A forced installation is an installation in which an update is installed even if the metadata indicates that the update is already installed. Before you use ForceInstall to force an installation, determine whether the update is installed and available. If an update is not installed, a forced installation fails. Works only with -Install. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Hide + + Get list of updates and hide/unhide approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreReboot + + Do not ask for reboot if it needed, but do not reboot automaticaly. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreRebootRequired + + Post search criteria. Finds updates that specifies the restart behavior that not occurs when you install or uninstall the update. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreUserInput + + Post search criteria. Finds updates that the installation or uninstallation of an update can't prompt for user input. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Install + + Get list of updates and install approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsAssigned + + Pre search criteria - native for WUAPI. Finds updates that are intended for deployment by Automatic Updates. "IsAssigned=1" finds updates that are intended for deployment by Automatic Updates, which depends on the other query criteria.At most, one assigned Windows-based driver update is returned for each local device on a destination computer. + "IsAssigned=0" finds updates that are not intended to be deployed by Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsHidden + + Pre search criteria - native for WUAPI. Finds updates that are marked as hidden on the destination computer. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsInstalled + + Pre search criteria - native for WUAPI. Finds updates that are installed on the destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsPresent + + Pre search criteria - native for WUAPI. When set to 1, finds updates that are present on a computer. + "IsPresent=1" finds updates that are present on a destination computer.If the update is valid for one or more products, the update is considered present if it is installed for one or more of the products. + "IsPresent=0" finds updates that are not installed for any product on a destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + KBArticleID + + Post search criteria. Finds updates that contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + MaxSize + + Post search criteria. Finds updates that have MaxDownloadSize less or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + MinSize + + Post search criteria. Finds updates that have MaxDownloadSize greater or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + NotCategory + + Post search criteria. Finds updates that not contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + NotKBArticleID + + Post search criteria. Finds updates that not contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + NotSeverity + + Post search criteria. Finds updates that not match part of severity. + + string[] + + System.String[] + + + + + + NotTitle + + Post search criteria. Finds updates that not match part of title (case sensitive). + + string + + System.String + + + + + + NotUpdateID + + Pre search criteria - native for WUAPI. Finds updates without a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + RecurseCycle + + Specify number of cycles for check updates after successful update installation or system startup. First run is always main cycle (-RecurseCycle 1 or none). Second (-RecurseCycle 2) and n (-RecurseCycle n) cycle are recursive. + + int + + System.Int32 + + + 0 + + + + RevisionNumber + + Pre search criteria - native for WUAPI. Finds updates with a specific RevisionNumber, such as '100'. This criterion must be combined with the UpdateID param. + + int + + System.Int32 + + + 0 + + + + ScheduleJob + + Specify time when job will start. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + ScheduleReboot + + Specify time when system will be rebooted. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + SendHistory + + Send install history (Get-WUHistory) report after successful update installation or system startup. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file (more preferred) in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ServiceID + + Use specific Service Manager if it's available. + Examples Of ServiceID: \r\n \r\n -- Windows Update 9482f4b4-e343-43b6-b170-9a65bc822c77 \r\n -- Microsoft Update 7971f918-a847-4430-9279-4a52d1efe18d \r\n -- Windows Store 117cab2d-82b1-4b5a-a08c-4d62dbee7782 \r\n -- Windows Server Update Service 3da21691-e39d-4da6-8a4b-b43877bcb1b7 + + string + + System.String + + + + + + Severity + + Post search criteria. Finds updates that match part of severity, such as 'Important', 'Critical', 'Moderate', etc... + + string[] + + System.String[] + + + + + + ShowPreSearchCriteria + + Show choosen search criteria. Only works for pre search criteria. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Title + + Post search criteria. Finds updates that match part of title (case sensitive), such as '.NET Framework 4'. + + string + + System.String + + + + + + UpdateID + + Pre search criteria - native for WUAPI. Finds updates with a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + UpdateType + + Pre search criteria - native for WUAPI. Finds updates with a specific type, such as 'Driver' and 'Software'. Default value contains all updates. + + string + + System.String + + + + + + WithHidden + + Pre search criteria - native for WUAPI. Finds updates that are both hidden and not on the destination computer. Overwrite IsHidden param. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + Get-WindowsUpdate_v2 + + + AcceptAll + + Do not ask confirmation for updates. Download or Install all available updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoReboot + + Do not ask for reboot if it needed. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnly + + Install only the updates that have status AutoSelectOnWebsites on true. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnWebSites + + Pre search criteria - native for WUAPI. Finds updates where the AutoSelectOnWebSites property has the specified value. + "AutoSelectOnWebSites=1" finds updates that are flagged to be automatically selected by Windows Update. + "AutoSelectOnWebSites=0" finds updates that are not flagged for Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + BrowseOnly + + Pre search criteria - native for WUAPI. "BrowseOnly=1" finds updates that are considered optional. "BrowseOnly=0" finds updates that are not considered optional. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Category + + Post search criteria. Finds updates that contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + CategoryIDs + + Pre search criteria - native for WUAPI. Finds updates that belong to a specified category (or sets of UUIDs), such as '0fa1201d-4330-4fa8-8ae9-b877473b6441'. + + string[] + + System.String[] + + + + + + ComputerName + + Specify one or more computer names for remote connection. Interactive remote connection works only for checking updates. For download or install cmdlet creates an Invoke-WUJob task. + + string[] + + System.String[] + + + + + + Criteria + + Pre search criteria - native for WUAPI. Set own string that specifies the search criteria. https://docs.microsoft.com/pl-pl/windows/desktop/api/wuapi/nf-wuapi-iupdatesearcher-search + + string + + System.String + + + + + + Debuger + + Debuger return original exceptions. For additional debug information use $DebugPreference = "Continue" + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + DeploymentAction + + Pre search criteria - native for WUAPI. Finds updates that are deployed for a specific action, such as an installation or uninstallation that the administrator of a server specifies. "DeploymentAction='Installation'" finds updates that are deployed for installation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + "DeploymentAction='Uninstallation'" finds updates that are deployed for uninstallation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + If this criterion is not explicitly specified, each group of criteria that is joined to an AND operator implies "DeploymentAction='Installation'". + + string + + System.String + + + + + + Download + + Get list of updates and download approved updates, but do not install it. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceDownload + + Forces the download of updates that are already installed or that cannot be installed. Works only with -Download. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceInstall + + A forced installation is an installation in which an update is installed even if the metadata indicates that the update is already installed. Before you use ForceInstall to force an installation, determine whether the update is installed and available. If an update is not installed, a forced installation fails. Works only with -Install. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Hide + + Get list of updates and hide/unhide approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreReboot + + Do not ask for reboot if it needed, but do not reboot automaticaly. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreRebootRequired + + Post search criteria. Finds updates that specifies the restart behavior that not occurs when you install or uninstall the update. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreUserInput + + Post search criteria. Finds updates that the installation or uninstallation of an update can't prompt for user input. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Install + + Get list of updates and install approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsAssigned + + Pre search criteria - native for WUAPI. Finds updates that are intended for deployment by Automatic Updates. "IsAssigned=1" finds updates that are intended for deployment by Automatic Updates, which depends on the other query criteria.At most, one assigned Windows-based driver update is returned for each local device on a destination computer. + "IsAssigned=0" finds updates that are not intended to be deployed by Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsHidden + + Pre search criteria - native for WUAPI. Finds updates that are marked as hidden on the destination computer. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsInstalled + + Pre search criteria - native for WUAPI. Finds updates that are installed on the destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsPresent + + Pre search criteria - native for WUAPI. When set to 1, finds updates that are present on a computer. + "IsPresent=1" finds updates that are present on a destination computer.If the update is valid for one or more products, the update is considered present if it is installed for one or more of the products. + "IsPresent=0" finds updates that are not installed for any product on a destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + KBArticleID + + Post search criteria. Finds updates that contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + MaxSize + + Post search criteria. Finds updates that have MaxDownloadSize less or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + MinSize + + Post search criteria. Finds updates that have MaxDownloadSize greater or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + NotCategory + + Post search criteria. Finds updates that not contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + NotKBArticleID + + Post search criteria. Finds updates that not contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + NotSeverity + + Post search criteria. Finds updates that not match part of severity. + + string[] + + System.String[] + + + + + + NotTitle + + Post search criteria. Finds updates that not match part of title (case sensitive). + + string + + System.String + + + + + + NotUpdateID + + Pre search criteria - native for WUAPI. Finds updates without a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + RecurseCycle + + Specify number of cycles for check updates after successful update installation or system startup. First run is always main cycle (-RecurseCycle 1 or none). Second (-RecurseCycle 2) and n (-RecurseCycle n) cycle are recursive. + + int + + System.Int32 + + + 0 + + + + RevisionNumber + + Pre search criteria - native for WUAPI. Finds updates with a specific RevisionNumber, such as '100'. This criterion must be combined with the UpdateID param. + + int + + System.Int32 + + + 0 + + + + ScheduleJob + + Specify time when job will start. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + ScheduleReboot + + Specify time when system will be rebooted. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + SendHistory + + Send install history (Get-WUHistory) report after successful update installation or system startup. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file (more preferred) in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Severity + + Post search criteria. Finds updates that match part of severity, such as 'Important', 'Critical', 'Moderate', etc... + + string[] + + System.String[] + + + + + + ShowPreSearchCriteria + + Show choosen search criteria. Only works for pre search criteria. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Title + + Post search criteria. Finds updates that match part of title (case sensitive), such as '.NET Framework 4'. + + string + + System.String + + + + + + UpdateID + + Pre search criteria - native for WUAPI. Finds updates with a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + UpdateType + + Pre search criteria - native for WUAPI. Finds updates with a specific type, such as 'Driver' and 'Software'. Default value contains all updates. + + string + + System.String + + + + + + WindowsUpdate + + Use Microsoft Update Service Manager - '7971f918-a847-4430-9279-4a52d1efe18d' + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + WithHidden + + Pre search criteria - native for WUAPI. Finds updates that are both hidden and not on the destination computer. Overwrite IsHidden param. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + Get-WindowsUpdate_v2 + + + AcceptAll + + Do not ask confirmation for updates. Download or Install all available updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoReboot + + Do not ask for reboot if it needed. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnly + + Install only the updates that have status AutoSelectOnWebsites on true. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnWebSites + + Pre search criteria - native for WUAPI. Finds updates where the AutoSelectOnWebSites property has the specified value. + "AutoSelectOnWebSites=1" finds updates that are flagged to be automatically selected by Windows Update. + "AutoSelectOnWebSites=0" finds updates that are not flagged for Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + BrowseOnly + + Pre search criteria - native for WUAPI. "BrowseOnly=1" finds updates that are considered optional. "BrowseOnly=0" finds updates that are not considered optional. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Category + + Post search criteria. Finds updates that contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + CategoryIDs + + Pre search criteria - native for WUAPI. Finds updates that belong to a specified category (or sets of UUIDs), such as '0fa1201d-4330-4fa8-8ae9-b877473b6441'. + + string[] + + System.String[] + + + + + + ComputerName + + Specify one or more computer names for remote connection. Interactive remote connection works only for checking updates. For download or install cmdlet creates an Invoke-WUJob task. + + string[] + + System.String[] + + + + + + Criteria + + Pre search criteria - native for WUAPI. Set own string that specifies the search criteria. https://docs.microsoft.com/pl-pl/windows/desktop/api/wuapi/nf-wuapi-iupdatesearcher-search + + string + + System.String + + + + + + Debuger + + Debuger return original exceptions. For additional debug information use $DebugPreference = "Continue" + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + DeploymentAction + + Pre search criteria - native for WUAPI. Finds updates that are deployed for a specific action, such as an installation or uninstallation that the administrator of a server specifies. "DeploymentAction='Installation'" finds updates that are deployed for installation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + "DeploymentAction='Uninstallation'" finds updates that are deployed for uninstallation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + If this criterion is not explicitly specified, each group of criteria that is joined to an AND operator implies "DeploymentAction='Installation'". + + string + + System.String + + + + + + Download + + Get list of updates and download approved updates, but do not install it. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceDownload + + Forces the download of updates that are already installed or that cannot be installed. Works only with -Download. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceInstall + + A forced installation is an installation in which an update is installed even if the metadata indicates that the update is already installed. Before you use ForceInstall to force an installation, determine whether the update is installed and available. If an update is not installed, a forced installation fails. Works only with -Install. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Hide + + Get list of updates and hide/unhide approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreReboot + + Do not ask for reboot if it needed, but do not reboot automaticaly. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreRebootRequired + + Post search criteria. Finds updates that specifies the restart behavior that not occurs when you install or uninstall the update. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreUserInput + + Post search criteria. Finds updates that the installation or uninstallation of an update can't prompt for user input. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Install + + Get list of updates and install approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsAssigned + + Pre search criteria - native for WUAPI. Finds updates that are intended for deployment by Automatic Updates. "IsAssigned=1" finds updates that are intended for deployment by Automatic Updates, which depends on the other query criteria.At most, one assigned Windows-based driver update is returned for each local device on a destination computer. + "IsAssigned=0" finds updates that are not intended to be deployed by Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsHidden + + Pre search criteria - native for WUAPI. Finds updates that are marked as hidden on the destination computer. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsInstalled + + Pre search criteria - native for WUAPI. Finds updates that are installed on the destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsPresent + + Pre search criteria - native for WUAPI. When set to 1, finds updates that are present on a computer. + "IsPresent=1" finds updates that are present on a destination computer.If the update is valid for one or more products, the update is considered present if it is installed for one or more of the products. + "IsPresent=0" finds updates that are not installed for any product on a destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + KBArticleID + + Post search criteria. Finds updates that contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + MaxSize + + Post search criteria. Finds updates that have MaxDownloadSize less or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + MicrosoftUpdate + + Use Windows Update Service Manager - '9482f4b4-e343-43b6-b170-9a65bc822c77' + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + MinSize + + Post search criteria. Finds updates that have MaxDownloadSize greater or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + NotCategory + + Post search criteria. Finds updates that not contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + NotKBArticleID + + Post search criteria. Finds updates that not contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + NotSeverity + + Post search criteria. Finds updates that not match part of severity. + + string[] + + System.String[] + + + + + + NotTitle + + Post search criteria. Finds updates that not match part of title (case sensitive). + + string + + System.String + + + + + + NotUpdateID + + Pre search criteria - native for WUAPI. Finds updates without a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + RecurseCycle + + Specify number of cycles for check updates after successful update installation or system startup. First run is always main cycle (-RecurseCycle 1 or none). Second (-RecurseCycle 2) and n (-RecurseCycle n) cycle are recursive. + + int + + System.Int32 + + + 0 + + + + RevisionNumber + + Pre search criteria - native for WUAPI. Finds updates with a specific RevisionNumber, such as '100'. This criterion must be combined with the UpdateID param. + + int + + System.Int32 + + + 0 + + + + ScheduleJob + + Specify time when job will start. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + ScheduleReboot + + Specify time when system will be rebooted. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + SendHistory + + Send install history (Get-WUHistory) report after successful update installation or system startup. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file (more preferred) in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Severity + + Post search criteria. Finds updates that match part of severity, such as 'Important', 'Critical', 'Moderate', etc... + + string[] + + System.String[] + + + + + + ShowPreSearchCriteria + + Show choosen search criteria. Only works for pre search criteria. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Title + + Post search criteria. Finds updates that match part of title (case sensitive), such as '.NET Framework 4'. + + string + + System.String + + + + + + UpdateID + + Pre search criteria - native for WUAPI. Finds updates with a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + UpdateType + + Pre search criteria - native for WUAPI. Finds updates with a specific type, such as 'Driver' and 'Software'. Default value contains all updates. + + string + + System.String + + + + + + WithHidden + + Pre search criteria - native for WUAPI. Finds updates that are both hidden and not on the destination computer. Overwrite IsHidden param. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + ComputerName + + Specify one or more computer names for remote connection. Interactive remote connection works only for checking updates. For download or install cmdlet creates an Invoke-WUJob task. + + string[] + + System.String[] + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file (more preferred) in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendHistory + + Send install history (Get-WUHistory) report after successful update installation or system startup. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ScheduleJob + + Specify time when job will start. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + AcceptAll + + Do not ask confirmation for updates. Download or Install all available updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + RecurseCycle + + Specify number of cycles for check updates after successful update installation or system startup. First run is always main cycle (-RecurseCycle 1 or none). Second (-RecurseCycle 2) and n (-RecurseCycle n) cycle are recursive. + + int + + System.Int32 + + + 0 + + + + Hide + + Get list of updates and hide/unhide approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Download + + Get list of updates and download approved updates, but do not install it. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceDownload + + Forces the download of updates that are already installed or that cannot be installed. Works only with -Download. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Install + + Get list of updates and install approved updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ForceInstall + + A forced installation is an installation in which an update is installed even if the metadata indicates that the update is already installed. Before you use ForceInstall to force an installation, determine whether the update is installed and available. If an update is not installed, a forced installation fails. Works only with -Install. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoReboot + + Do not ask for reboot if it needed. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreReboot + + Do not ask for reboot if it needed, but do not reboot automaticaly. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ScheduleReboot + + Specify time when system will be rebooted. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + ServiceID + + Use specific Service Manager if it's available. + Examples Of ServiceID: \r\n \r\n -- Windows Update 9482f4b4-e343-43b6-b170-9a65bc822c77 \r\n -- Microsoft Update 7971f918-a847-4430-9279-4a52d1efe18d \r\n -- Windows Store 117cab2d-82b1-4b5a-a08c-4d62dbee7782 \r\n -- Windows Server Update Service 3da21691-e39d-4da6-8a4b-b43877bcb1b7 + + string + + System.String + + + + + + WindowsUpdate + + Use Microsoft Update Service Manager - '7971f918-a847-4430-9279-4a52d1efe18d' + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + MicrosoftUpdate + + Use Windows Update Service Manager - '9482f4b4-e343-43b6-b170-9a65bc822c77' + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Criteria + + Pre search criteria - native for WUAPI. Set own string that specifies the search criteria. https://docs.microsoft.com/pl-pl/windows/desktop/api/wuapi/nf-wuapi-iupdatesearcher-search + + string + + System.String + + + + + + UpdateType + + Pre search criteria - native for WUAPI. Finds updates with a specific type, such as 'Driver' and 'Software'. Default value contains all updates. + + string + + System.String + + + + + + DeploymentAction + + Pre search criteria - native for WUAPI. Finds updates that are deployed for a specific action, such as an installation or uninstallation that the administrator of a server specifies. "DeploymentAction='Installation'" finds updates that are deployed for installation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + "DeploymentAction='Uninstallation'" finds updates that are deployed for uninstallation on a destination computer. "DeploymentAction='Uninstallation'" depends on the other query criteria. + If this criterion is not explicitly specified, each group of criteria that is joined to an AND operator implies "DeploymentAction='Installation'". + + string + + System.String + + + + + + IsAssigned + + Pre search criteria - native for WUAPI. Finds updates that are intended for deployment by Automatic Updates. "IsAssigned=1" finds updates that are intended for deployment by Automatic Updates, which depends on the other query criteria.At most, one assigned Windows-based driver update is returned for each local device on a destination computer. + "IsAssigned=0" finds updates that are not intended to be deployed by Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsPresent + + Pre search criteria - native for WUAPI. When set to 1, finds updates that are present on a computer. + "IsPresent=1" finds updates that are present on a destination computer.If the update is valid for one or more products, the update is considered present if it is installed for one or more of the products. + "IsPresent=0" finds updates that are not installed for any product on a destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + BrowseOnly + + Pre search criteria - native for WUAPI. "BrowseOnly=1" finds updates that are considered optional. "BrowseOnly=0" finds updates that are not considered optional. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnWebSites + + Pre search criteria - native for WUAPI. Finds updates where the AutoSelectOnWebSites property has the specified value. + "AutoSelectOnWebSites=1" finds updates that are flagged to be automatically selected by Windows Update. + "AutoSelectOnWebSites=0" finds updates that are not flagged for Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + UpdateID + + Pre search criteria - native for WUAPI. Finds updates with a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + NotUpdateID + + Pre search criteria - native for WUAPI. Finds updates without a specific UUID (or sets of UUIDs), such as '12345678-9abc-def0-1234-56789abcdef0'. + + string[] + + System.String[] + + + + + + RevisionNumber + + Pre search criteria - native for WUAPI. Finds updates with a specific RevisionNumber, such as '100'. This criterion must be combined with the UpdateID param. + + int + + System.Int32 + + + 0 + + + + CategoryIDs + + Pre search criteria - native for WUAPI. Finds updates that belong to a specified category (or sets of UUIDs), such as '0fa1201d-4330-4fa8-8ae9-b877473b6441'. + + string[] + + System.String[] + + + + + + IsInstalled + + Pre search criteria - native for WUAPI. Finds updates that are installed on the destination computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IsHidden + + Pre search criteria - native for WUAPI. Finds updates that are marked as hidden on the destination computer. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + WithHidden + + Pre search criteria - native for WUAPI. Finds updates that are both hidden and not on the destination computer. Overwrite IsHidden param. Default search criteria is only not hidden upadates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ShowPreSearchCriteria + + Show choosen search criteria. Only works for pre search criteria. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Category + + Post search criteria. Finds updates that contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + KBArticleID + + Post search criteria. Finds updates that contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + Title + + Post search criteria. Finds updates that match part of title (case sensitive), such as '.NET Framework 4'. + + string + + System.String + + + + + + Severity + + Post search criteria. Finds updates that match part of severity, such as 'Important', 'Critical', 'Moderate', etc... + + string[] + + System.String[] + + + + + + NotCategory + + Post search criteria. Finds updates that not contain a specified category name (or sets of categories name), such as 'Updates', 'Security Updates', 'Critical Updates', etc... + + string[] + + System.String[] + + + + + + NotKBArticleID + + Post search criteria. Finds updates that not contain a KBArticleID (or sets of KBArticleIDs), such as 'KB982861'. + + string[] + + System.String[] + + + + + + NotTitle + + Post search criteria. Finds updates that not match part of title (case sensitive). + + string + + System.String + + + + + + NotSeverity + + Post search criteria. Finds updates that not match part of severity. + + string[] + + System.String[] + + + + + + IgnoreUserInput + + Post search criteria. Finds updates that the installation or uninstallation of an update can't prompt for user input. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + Silent + + Post search criteria. Finds updates that the installation or uninstallation of an update can't prompt for user input. + This is an alias of the IgnoreUserInput parameter. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IgnoreRebootRequired + + Post search criteria. Finds updates that specifies the restart behavior that not occurs when you install or uninstall the update. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoSelectOnly + + Install only the updates that have status AutoSelectOnWebsites on true. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + MaxSize + + Post search criteria. Finds updates that have MaxDownloadSize less or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + MinSize + + Post search criteria. Finds updates that have MaxDownloadSize greater or equal. Size is in Bytes. + + long + + System.Int64 + + + 0 + + + + Debuger + + Debuger return original exceptions. For additional debug information use $DebugPreference = "Continue" + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. Interactive remote connection works only for checking updates. For download or install cmdlet creates an Invoke-WUJob task. + + + + + + + + PSWindowsUpdate.WindowsUpdate + + + + OutputType for WindowsUpdate objects. + + + + + + ---------- EXAMPLE 1 ---------- + Get windows updates available from default service manager. + +Get-WindowsUpdate -Verbose + +VERBOSE: MG-PC: Connecting to Windows Server Update Service server. Please wait... +VERBOSE: Found[4] Updates in pre search criteria +VERBOSE: Found[4] Updates in post search criteria + +ComputerName Status KB Size Title +------------ ------ -- ---- ----- +MG-PC ------- KB890830 44MB Narzędzie Windows do usuwania złośliwego oprogramowania dla systemów Window... +MG-PC ------- KB4034658 1GB 2017-08 Aktualizacja zbiorcza dla systemu Windows 10 Version 1607 dla syste... +MG-PC ------- KB4034662 21MB 2017-08 Aktualizacja zabezpieczeń Adobe Flash Player w Windows 10 Version 1... +MG-PC ------- KB4035631 11MB 2017-08 Aktualizacja Windows 10 Version 1607 dla systemów opartych na archi... + + + ---------- EXAMPLE 2 ---------- + Get all installed drivers that are available at Windows Update. Additionaly show pre search criteria. + +Get-WindowsUpdate -WindowsUpdate -UpdateType Driver -IsInstalled -ShowPreSearchCriteria -Verbose + +PreSearchCriteria: IsInstalled = 0 and Type = 'Driver' and IsHidden = 0 +VERBOSE: MG-PC: Connecting to Windows Update server.Please wait... +VERBOSE: Found[1] Updates in pre search criteria +VERBOSE: Found[1] Updates in post search criteria + +ComputerName Status KB Size Title +------------ ------ -- ---- ----- +MGAJDALAP3 -DI---- 3MB Intel - Other hardware - Intel(R) Watchdog Timer Driver (Intel(R) WDT) + + + ---------- EXAMPLE 3 ---------- + Get all available update on remote machine MG-PC, that contains in Title this two words 'Aktualizacja' and 'Windows 10' (as regular expression). + +Get-WindowsUpdate -ComputerName MG-PC -MicrosoftUpdate -Title "Aktualizacja.*Windows 10" -Verbose + +VERBOSE: MG-PC: Connecting to Microsoft Update server. Please wait... +VERBOSE: Found[14] Updates in pre search criteria +VERBOSE: Found[5] Updates in post search criteria + +ComputerName Status KB Size Title +------------ ------ -- ---- ----- +MG-PC ------- KB3150513 2MB 2017-06 Aktualizacja Windows 10 Version 1607 dla systemów opartych na archi... +MG-PC ------- KB4034658 1GB 2017-08 Aktualizacja zbiorcza dla systemu Windows 10 Version 1607 dla syste... +MG-PC ------- KB4034662 21MB 2017-08 Aktualizacja zabezpieczeń Adobe Flash Player w Windows 10 Version 1... +MG-PC ------- KB4035631 11MB 2017-08 Aktualizacja Windows 10 Version 1607 dla systemów opartych na archi... +MG-PC ------- KB4033637 4MB Aktualizacja systemu Windows 10 Version 1607 dla komputerów z procesorami x... + + + ---------- EXAMPLE 4 ---------- + Hide update with KBArticleID: KB4034658. + +Get-WindowsUpdate -KBArticleID KB4034658 -Hide -Verbose +or use alias +Hide-WindowsUpdate -KBArticleID KB4034658 -Verbose + +VERBOSE: MG-PC: Connecting to Windows Server Update Service server. Please wait... +VERBOSE: Found[4] Updates in pre search criteria +VERBOSE: Found[1] Updates in post search criteria + +Confirm +Are you sure you want to perform this action? +Performing the operation "Hide 2017-08 Aktualizacja zbiorcza dla systemu Windows 10 Version 1607 dla systemów opartych na architekturze x64 (KB4034658)[1GB]" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + +ComputerName Status KB Size Title +------------ ------ -- ---- ----- +MG-PC ---H-- KB4034658 1GB 2017-08 Aktualizacja zbiorcza dla systemu Windows 10 Version 1607 dla syste... + + + ---------- EXAMPLE 5 ---------- + Unhide update with KBArticleID: KB4034658. + +Get-WindowsUpdate -KBArticleID KB4034658 -WithHidden -Hide:$false -Verbose +or use alias +Show-WindowsUpdate -KBArticleID KB4034658 -Verbose + +VERBOSE: MG-PC: Connecting to Windows Server Update Service server. Please wait... +VERBOSE: Found[4] Updates in pre search criteria +VERBOSE: Found[1] Updates in post search criteria + +Confirm +Are you sure you want to perform this action? +Performing the operation "Show 2017-08 Aktualizacja zbiorcza dla systemu Windows 10 Version 1607 dla systemów opartych na architekturze x64 (KB4034658)[1GB]" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + +ComputerName Status KB Size Title +------------ ------ -- ---- ----- +MG-PC ------ KB4034658 1GB 2017-08 Aktualizacja zbiorcza dla systemu Windows 10 Version 1607 dla syste... + + + ---------- EXAMPLE 6 ---------- + Schedule job at 6:00 PM to install update with UpdateId='ddb74579-7a1f-4d1f-80c8-e8647055314e' and RevisionNumber=200. Update will be automaticaly accepted and after all serwer will be automaticaly restarted if needed. + +Get-WindowsUpdate -MicrosoftUpdate -UpdateID ddb74579-7a1f-4d1f-80c8-e8647055314e -RevisionNumber 200 -ScheduleJob (Get-Date -Hour 18 -Minute 0 -Second 0) -Install -AcceptAll -AutoReboot -Verbose +or use alias +Install-WindowsUpdate -MicrosoftUpdate -UpdateID ddb74579-7a1f-4d1f-80c8-e8647055314e -RevisionNumber 200 -ScheduleJob (Get-Date -Hour 18 -Minute 0 -Second 0) -AcceptAll -AutoReboot -Verbose + +VERBOSE: MG-PC: Connecting to Microsoft Update server. Please wait... +VERBOSE: Found[1] Updates in pre search criteria +VERBOSE: Found[1] Updates in post search criteria +VERBOSE: Choosed pre Search Criteria: (UpdateID = 'ddb74579-7a1f-4d1f-80c8-e8647055314e' and RevisionNumber = 200) + +X ComputerName Result KB Size Title +- ------------ ------ -- ---- ----- +1 MG-PC Accepted KB4023307 13MB Microsoft Silverlight(KB4023307) +VERBOSE: Accepted[1] Updates ready to Download +VERBOSE: Invoke-WUJob: MG-PC(31.08.2017 18:00:00): +VERBOSE: powershell.exe -Command "Get-WindowsUpdate -Criteria \"(UpdateID = 'ddb74579-7a1f-4d1f-80c8-e8647055314e' and RevisionNumber = 200)\" -AcceptAll -AutoReboot -Download -Install -MicrosoftUpdate -Verbose *>&1 | Out-File $Env:TEMP\PSWindowsUpdate.log" + + + ---------- EXAMPLE 7 ---------- + Install updates on remote computer. After all send a report from the installation process. + +Install-WindowsUpdate -ComputerName MG-PC -MicrosoftUpdate -AcceptAll -AutoReboot -SendReport -PSWUSettings @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";Port=25} -Verbose +or use global PSWUSettings +@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";Port=25} | Export-Clixml -Path 'C:\Program Files\WindowsPowerShell\Modules\PSWindowsUpdate\PSWUSettings.xml' +Install-WindowsUpdate -ComputerName MG-PC -MicrosoftUpdate -AcceptAll -AutoReboot -SendReport -Verbose + +VERBOSE: MG-PC: Connecting to Microsoft Update server. Please wait... +VERBOSE: Found[4] Updates in pre search criteria +VERBOSE: Found[4] Updates in post search criteria + +Confirm +Are you sure you want to perform this action? +Performing the operation "Microsoft Silverlight (KB4023307)[13MB]" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + +Confirm +Are you sure you want to perform this action? +Performing the operation "2017-06 Aktualizacja Windows 10 Version 1607 dla systemów opartych na architekturze x64 (KB3150513)[2MB]" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + +Confirm +Are you sure you want to perform this action? +Performing the operation "Aktualizacja pakietu językowego usługi Microsoft Dynamics 365 2.1[47MB]" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): L + +X ComputerName Result KB Size Title +- ------------ ------ -- ---- ----- +1 MG-PC Accepted KB4023307 13MB Microsoft Silverlight (KB4023307) +1 MG-PC Accepted KB3150513 2MB 2017-06 Aktualizacja Windows 10 Version 1607 dla systemów opartych na arc... +1 MG-PC Rejected KB4013759 47MB Aktualizacja pakietu językowego usługi Microsoft Dynamics 365 2.1 +1 MG-PC Rejected KB3186568 67MB Program Microsoft .NET Framework 4.7 w syst. Windows 10 Version 1607 i Wi... +VERBOSE: Accepted [2] +Updates ready to Download +VERBOSE: Invoke-WUJob: MG-PC (Now): +VERBOSE: powershell.exe -Command "Get-WindowsUpdate -Criteria \"(UpdateID = 'ddb74579-7a1f-4d1f-80c8-e8647055314e' and RevisionNumber = 200) or (UpdateID = '151c4402-513c-4f39-8da1-f84d0956b5e3' and RevisionNumber = 200)\" -AcceptAll -Download -Install -AutoReboot -MicrosoftUpdate -SendReport -ProofOfLife -Verbose *>&1 | Out-File $Env:TEMP\PSWindowsUpdate.log" + + + ---------- EXAMPLE 8 ---------- + Schedule Job to install all available updates and automatically reboot system if needed. Also send report after installation (but before reboot if needed) and send second instalation history report after reboot. + +@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";Port=25} | Export-Clixml -Path 'C:\Program Files\WindowsPowerShell\Modules\PSWindowsUpdate\PSWUSettings.xml' +Install-WindowsUpdate -MicrosoftUpdate -SendReport -SendHistory -AcceptAll -AutoReboot -ScheduleJob (Get-Date -Hour 18 -Minute 30 -Second 0) -ComputerName MG-PC -Verbose + +VERBOSE: MG-PC: Connecting to Microsoft Update server. Please wait... +VERBOSE: Found[4] Updates in pre search criteria +VERBOSE: Found[4] Updates in post search criteria + +X ComputerName Result KB Size Title +- ------------ ------ -- ---- ----- +1 MG-PC Accepted KB3038936 5MB Aktualizacja systemu Windows 8.1 dla komputerów z procesorami x64(KB3038... +1 MG-PC Accepted KB3186606 4MB Pakiety językowe programu Microsoft.NET Framework 4.7 w syst. Windows 8.... +1 MG-PC Accepted KB4035038 53MB Sierpień 2017: wersja zapozn. pak.zb.aktual.jakości dla pr. .NET Frame... +1 MG-PC Accepted KB2267602 309MB Aktualizacja definicji dla: Windows Defender — KB2267602 (Definicja 1.251... +VERBOSE: Accepted[4] Updates ready to Download +VERBOSE: Invoke-WUJob: MG-PC (02.09.2017 08:30:00): +VERBOSE: powershell.exe -Command "Get-WindowsUpdate -Criteria \"(UpdateID = 'e69c9679-7ce8-489a-a21c-62fb920be67a' and RevisionNumber = 201) or(UpdateID = 'de44604d-ec38-4a7f-ac63-28b3edfdb382' and RevisionNumber = 207) or(UpdateID = '9cf1d8c9-a7c3-4603-90e8-f22131ff6d7e' and RevisionNumber = 201) or(UpdateID = 'b51935f9-0e40-4624-9c26-b29bff92dcf9' and RevisionNumber = 200)\" -AcceptAll -Install -AutoReboot -MicrosoftUpdate -SendReport -SendHistory -Verbose *>&1 | Out-File $Env:TEMP\PSWindowsUpdate.log" +VERBOSE: Send report + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Get-WUApiVersion + Get + WUApiVersion + + Get Windows Update Agent version. + + + + Use Get-WUAPIVersion cmdlet to get Windows Update Agent version. + + + + + Get-WUApiVersion + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. + + + + + + + + PSWindowsUpdate.AgentInfo + + + + OutputType for AgentInfo objects. + + + + + + ---------- EXAMPLE 1 ---------- + Get Windows Update Agent version. + +Get-WUAPIVersion + +ComputerName PSWindowsUpdate ApiVersion WuapiDllVersion +------------ --------------- ---------- --------------- +MG-PC 2.0 8.0 10.0.14393.1670 + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Reset-WUComponents + Reset + WUComponents + + Reset Windows Update components. + + + + Use Reset-WUComponents cmdlet to reset all Windows Update components to default. + + + + + Reset-WUComponents + + + + + + + + ---------- EXAMPLE 1 ---------- + Reset Windows Update components to default. + + Reset-WUComponents -Verbose + Step 1: Stop Windows Update services +VERBOSE: Background Intelligent Transfer Service(BITS) +VERBOSE: Windows Update(wuauserv) +VERBOSE: Application Identity(appidsvc) +VERBOSE: Cryptographic Services(cryptsvc) +Step 2: Delete the qmgr*.dat files +Step 3: Backup softare distribution folders +VERBOSE: Renaming Software Distribution folder to C:\WINDOWS\SoftwareDistribution.bak5 +VERBOSE: Renaming CatRoot folder to C:\WINDOWS\System32\Catroot2.bak1 +Step 4: Remove old Windows Update logs +VERBOSE: Deleting the C:\WINDOWS\WindowsUpdate.log files. +Step 5: Reset Windows Update services +VERBOSE: Reset BITS service +VERBOSE: Reset Windows Update service +Step 6: Reregister dll's +VERBOSE: regsvr32.exe / s atl.dll +VERBOSE: regsvr32.exe / s urlmon.dll +VERBOSE: regsvr32.exe / s mshtml.dll +VERBOSE: regsvr32.exe / s shdocvw.dll +VERBOSE: regsvr32.exe / s browseui.dll +VERBOSE: regsvr32.exe / s jscript.dll +VERBOSE: regsvr32.exe / s vbscript.dll +VERBOSE: regsvr32.exe / s scrrun.dll +VERBOSE: regsvr32.exe / s msxml.dll +VERBOSE: regsvr32.exe / s msxml3.dll +VERBOSE: regsvr32.exe / s msxml6.dll +VERBOSE: regsvr32.exe / s actxprxy.dll +VERBOSE: regsvr32.exe / s softpub.dll +VERBOSE: regsvr32.exe / s wintrust.dll +VERBOSE: regsvr32.exe / s dssenh.dll +VERBOSE: regsvr32.exe / s rsaenh.dll +VERBOSE: regsvr32.exe / s gpkcsp.dll +VERBOSE: regsvr32.exe / s sccbase.dll +VERBOSE: regsvr32.exe / s slbcsp.dll +VERBOSE: regsvr32.exe / s cryptdlg.dll +VERBOSE: regsvr32.exe / s oleaut32.dll +VERBOSE: regsvr32.exe / s ole32.dll +VERBOSE: regsvr32.exe / s shell32.dll +VERBOSE: regsvr32.exe / s initpki.dll +VERBOSE: regsvr32.exe / s wuapi.dll +VERBOSE: regsvr32.exe / s wuaueng.dll +VERBOSE: regsvr32.exe / s wuaueng1.dll +VERBOSE: regsvr32.exe / s wucltui.dll +VERBOSE: regsvr32.exe / s wups.dll +VERBOSE: regsvr32.exe / s wups2.dll +VERBOSE: regsvr32.exe / s wuweb.dll +VERBOSE: regsvr32.exe / s qmgr.dll +VERBOSE: regsvr32.exe / s qmgrprxy.dll +VERBOSE: regsvr32.exe / s wucltux.dll +VERBOSE: regsvr32.exe / s muweb.dll +VERBOSE: regsvr32.exe / s wuwebv.dll +Step 7: Reset WinSock +VERBOSE: netsh winsock reset +Step 8: Reset Proxy +VERBOSE: netsh winhttp reset proxy +Step 9: Start Windows Update services +VERBOSE: Cryptographic Services (cryptsvc) +VERBOSE: Application Identity (appidsvc) +VERBOSE: Windows Update (wuauserv) +VERBOSE: Background Intelligent Transfer Service (BITS) +Step 10: Start Windows Update services +VERBOSE: wuauclt /resetauthorization /detectnow + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Get-WUHistory + Get + WUHistory + + Get list of updates history. + + + + Use function Get-WUHistory to get list of installed updates on specific machine. + + + + + Get-WUHistory + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Last + + Last X history entry. + + int + + System.Int32 + + + 0 + + + + MaxDate + + Filter results by date. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: Export-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: Export-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + MaxDate + + Filter results by date. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + Last + + Last X history entry. + + int + + System.Int32 + + + 0 + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. + + + + + + + + PSWindowsUpdate.History + + + + OutputType for History objects. + + + + + + ---------- EXAMPLE 1 ---------- + Get Windows Update history. + +Get-WUHistory + +ComputerName Operationname Date KB Title +------------ ------------- ---- -- ----- +MG-PC Installation 30.08.2017 12:03:53 KB2267602 Definition Update for Windows Defender - KB2267602(Defini... +MG-PC Installation 29.08.2017 11:49:50 KB3186568 Microsoft .NET Framework 4.7 for Windows 10 Version 1607 a... +MG-PC Installation 29.08.2017 11:30:37 KB4035631 2017-08 Update for Windows Server 2016 for x64-based Syste... +MG-PC Installation 29.08.2017 11:21:12 KB890830 Windows Malicious Software Removal Tool for Windows 8, 8.1... +MG-PC Installation 29.08.2017 07:53:36 KB2267602 Definition Update for Windows Defender - KB2267602 (Defini... +MG-PC Installation 27.08.2017 07:53:39 KB2267602 Definition Update for Windows Defender - KB2267602 (Defini... +MG-PC Installation 25.08.2017 07:54:38 KB2267602 Definition Update for Windows Defender - KB2267602 (Defini... +MG-PC Installation 23.08.2017 13:01:26 KB2267602 Definition Update for Windows Defender - KB2267602 (Defini... +MG-PC Installation 23.08.2017 12:45:45 KB4023307 Security Update for Microsoft Silverlight (KB4023307) +MG-PC Installation 23.08.2017 07:53:56 KB2267602 Definition Update for Windows Defender - KB2267602 (Defini... + + + ---------- EXAMPLE 2 ---------- + Get Windows Update Agent history for last 24h. + +Get-WUHistory -MaxDate (Get-Date).AddDays(-1) + +ComputerName Operationname Date KB Title +------------ ------------- ---- -- ----- +MG-PC Installation 30.08.2017 12:03:53 KB2267602 Definition Update for Windows Defender - KB2267602(Defini... + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Get-WUInstallerStatus + Get + WUInstallerStatus + + Get Windows Update Installer status. + + + + Use Get-WUInstallerStatus cmdlet to show Windows Update Installer status. + + + + + Get-WUInstallerStatus + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Silent + + Return true/false only. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + Silent + + Return true/false only. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + + PSWindowsUpdate.InstallerStatus + + + + OutputType for InstallerStatus objects. + + + + + + ---------- EXAMPLE 1 ---------- + Check if Windows Update Installer is busy. + +Get-WUInstallerStatus + +ComputerName IsBusy +------------ ------ +MG-PC False + + + ---------- EXAMPLE 2 ---------- + Check if Windows Update Installer is busy in silent mode. Return only True (isBusy) or False (isFree). + +Get-WUInstallerStatus -Silent + +False + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Get-WUJob + Get + WUJob + + Get invoked WUJob. + + + + Use Get-WUJob cmdlet to get invoked WUJob in Task Scheduler. + + + + + Get-WUJob + + + ClearExpired + + Clear expired WUJob. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + TaskName + + Specify custom name for Task Scheduler job. Default is 'PSWindowsUpdate'. + + string + + System.String + + + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + TaskName + + Specify custom name for Task Scheduler job. Default is 'PSWindowsUpdate'. + + string + + System.String + + + + + + ClearExpired + + Clear expired WUJob. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. + + + + + + + + PSWindowsUpdate.WUJob + + + + OutputType for WUJob. + + + + + + ---------- EXAMPLE 1 ---------- + Get invoked WUJob on remote machine. + +Get-WUJob -ComputerName MG-PC + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Invoke-WUJob + Invoke + WUJob + + Invoke WUJobs by Task Schduler. + + + + Use Invoke-WUJobs cmdlet to invoke PSWindowsUpdate actions remotly. It Based on TaskScheduler because CreateUpdateDownloader() and CreateUpdateInstaller() methods can't be called from a remote computer - E_ACCESSDENIED. + Note: Because we do not have the ability to interact, is recommended use -AcceptAll for Install-WindowsUpdate. + + + + + Invoke-WUJob + + + TriggerDate + + Specify Time trigger for Task Scheduler job. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + EndBoundary + + Specify EndBoundary for Task Scheduler trigger. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + Force + + Force update old Task Scheduler Job if it's available. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Hidden + + Specify if task must be hidden. Default is true. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + True + + + + Script + + Specify PowerShell script that you what to run. Default is {ipmo PSWindowsUpdate; Get-WindowsUpdate -AcceptAll -Install | Out-File $Env:TEMP\PSWindowsUpdate.log} + + string + + System.String + + + ipmo PSWindowsUpdate; Get-WindowsUpdate -AcceptAll -Install | Out-File $Env:TEMP\PSWindowsUpdate.log + + + + TaskName + + Specify custom name for Task Scheduler job. Default is 'PSWindowsUpdate'. + + string + + System.String + + + PSWindowsUpdate + + + + + Invoke-WUJob + + + TriggerAtStart + + Specify system startup trigger for Task Scheduler job. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + EndBoundary + + Specify EndBoundary for Task Scheduler trigger. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + Force + + Force update old Task Scheduler Job if it's available. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Hidden + + Specify if task must be hidden. Default is true. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + True + + + + Script + + Specify PowerShell script that you what to run. Default is {ipmo PSWindowsUpdate; Get-WindowsUpdate -AcceptAll -Install | Out-File $Env:TEMP\PSWindowsUpdate.log} + + string + + System.String + + + ipmo PSWindowsUpdate; Get-WindowsUpdate -AcceptAll -Install | Out-File $Env:TEMP\PSWindowsUpdate.log + + + + TaskName + + Specify custom name for Task Scheduler job. Default is 'PSWindowsUpdate'. + + string + + System.String + + + PSWindowsUpdate + + + + + Invoke-WUJob + + + RunNow + + Run Task Scheduler job immediately. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + EndBoundary + + Specify EndBoundary for Task Scheduler trigger. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + Force + + Force update old Task Scheduler Job if it's available. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Hidden + + Specify if task must be hidden. Default is true. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + True + + + + Script + + Specify PowerShell script that you what to run. Default is {ipmo PSWindowsUpdate; Get-WindowsUpdate -AcceptAll -Install | Out-File $Env:TEMP\PSWindowsUpdate.log} + + string + + System.String + + + ipmo PSWindowsUpdate; Get-WindowsUpdate -AcceptAll -Install | Out-File $Env:TEMP\PSWindowsUpdate.log + + + + TaskName + + Specify custom name for Task Scheduler job. Default is 'PSWindowsUpdate'. + + string + + System.String + + + PSWindowsUpdate + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + TaskName + + Specify custom name for Task Scheduler job. Default is 'PSWindowsUpdate'. + + string + + System.String + + + PSWindowsUpdate + + + + Hidden + + Specify if task must be hidden. Default is true. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + True + + + + EndBoundary + + Specify EndBoundary for Task Scheduler trigger. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + TriggerDate + + Specify Time trigger for Task Scheduler job. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + TriggerAtStart + + Specify system startup trigger for Task Scheduler job. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + RunNow + + Run Task Scheduler job immediately. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Script + + Specify PowerShell script that you what to run. Default is {ipmo PSWindowsUpdate; Get-WindowsUpdate -AcceptAll -Install | Out-File $Env:TEMP\PSWindowsUpdate.log} + + string + + System.String + + + ipmo PSWindowsUpdate; Get-WindowsUpdate -AcceptAll -Install | Out-File $Env:TEMP\PSWindowsUpdate.log + + + + Force + + Force update old Task Scheduler Job if it's available. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. + + + + + + + ---------- EXAMPLE 1 ---------- + Invoke Install-WindowsUpdate on remote machine today at 6:00 PM. + +Invoke-WUJob -ComputerName MG-PC -Script "ipmo PSWindowsUpdate; Install-WindowsUpdate -AcceptAll | Out-File C:\PSWindowsUpdate.log" -TriggerDate (Get-Date -Hour 18 -Minute 0 -Second 0) + +Confirm +Are you sure you want to perform this action? +Performing the operation "Invoke WU job: powershell.exe -Command "ipmo PSWindowsUpdate; Install-WindowsUpdate -AcceptAll | Out-File C:\PSWindowsUpdate.log"" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Get-WULastResults + Get + WULastResults + + Get Windows Update results. + + + + Use Get-WULastResults cmdlet to get Windows Update LastSearchSuccessDate and LastInstallationSuccessDate. + + + + + Get-WULastResults + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. + + + + + + + + PSWindowsUpdate.LastResults + + + + OutputType for LastResult objects. + + + + + + ---------- EXAMPLE 1 ---------- + Get last Windows Update results. + +Get-WULastResults + +ComputerName LastSearchSuccessDate LastInstallationSuccessDate +------------ --------------------- --------------------------- +MG-PC 30.08.2017 14:02:11 03.07.2017 07:35:27 + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Update-WUModule + Update + WUModule + + Update PSWindowsUpdate module. + + + + Use Use Update-WUModule cmdlet to remote update PSWindowsUpdate module. + + + + + Update-WUModule + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Local + + Update from current module. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + Update-WUModule + + + Online + + Update from PSGallery. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + Online + + Update from PSGallery. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Local + + Update from current module. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. + + + + + + + ---------- EXAMPLE 1 ---------- + Update PSWindowsUpdate module from PSGallery + +Update-WUModule -ComputerName MG-PC -Online + + + ---------- EXAMPLE 2 ---------- + Update PSWindowsUpdate module from current serwer. Require SMB connection to destination machine. + +Update-WUModule -ComputerName MG-PC -Local + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Get-WUOfflineMSU + Get + WUOfflineMSU + + Get offline MSU package. + + + + Use Get-WUOfflineMSU cmdlet to download MSU package from Microsoft Update Catalog website. + + + + + Get-WUOfflineMSU + + + Destination + + Destination for downloaded files. + + string + + System.String + + + + + + KBArticleID + + Finds updates that contain a KBArticleID. + + string + + System.String + + + + + + AcceptAll + + Do not ask confirmation for download updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + KBArticleID + + Finds updates that contain a KBArticleID. + + string + + System.String + + + + + + Destination + + Destination for downloaded files. + + string + + System.String + + + + + + AcceptAll + + Do not ask confirmation for download updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String + + + + Finds updates that contain a KBArticleID. + + + + + + + ---------- EXAMPLE 1 ---------- + Download package for KB4551762. +PS> Get-WUOfflineMSU -KBArticleID 4551762 -Destination C:\Temp + + Confirm + Are you sure you want to perform this action? + Performing the operation "(20.04.2020 14:27:17) 2020-03 Cumulative Update for Windows Server, version 1909 for + x64-based Systems (KB4551762)[354.4 MB]" on target "DESKTOP-GCQBCBS". + [Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): N + + Confirm + Are you sure you want to perform this action? + Performing the operation "(20.04.2020 14:27:19) 2020-03 Cumulative Update for Windows 10 Version 1909 for x64-based + Systems(KB4551762) [354.4 MB]" on target "DESKTOP-GCQBCBS". + [Y] Yes[A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): Y + + Confirm + Are you sure you want to perform this action? + Performing the operation "(20.04.2020 14:27:23) 2020-03 Cumulative Update for Windows 10 Version 1903 for x64-based + Systems(KB4551762) [354.4 MB]" on target "DESKTOP-GCQBCBS". + [Y] Yes[A]Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): L + + X Result Title LastUpdated Size + - ------ ----- ----------- ---- + 1 Rejected 2020-03 Cumulative Update for Windows Server, version 1909 for x64-based Systems (... 3/12/2020 354.4 MB + 1 Accepted 2020-03 Cumulative Update for Windows 10 Version 1909 for x64-based Systems (KB455... 3/12/2020 354.4 MB + 1 Rejected 2020-03 Cumulative Update for Windows 10 Version 1903 for x64-based Systems (KB455... 3/12/2020 354.4 MB + 1 Rejected 2020-03 Cumulative Update for Windows 10 Version 1909 for x86-based Systems (KB455... 3/12/2020 191.7 MB + 1 Rejected 2020-03 Cumulative Update for Windows 10 Version 1903 for x86-based Systems (KB455... 3/12/2020 191.7 MB + 1 Rejected 2020-03 Cumulative Update for Windows 10 Version 1909 for ARM64-based Systems (KB4... 3/12/2020 396.1 MB + 1 Rejected 2020-03 Cumulative Update for Windows Server, version 1903 for x64-based Systems (... 3/12/2020 354.4 MB + 1 Rejected 2020-03 Cumulative Update for Windows 10 Version 1903 for ARM64-based Systems (KB4... 3/12/2020 396.1 MB + 2 Downloaded 2020-03 Cumulative Update for Windows 10 Version 1909 for x64-based Systems (KB455... 3/12/2020 354.4 MB + +PS> Get-ChildItem C:\Temp + Directory: C:\Temp + + Mode LastWriteTime Length Name + ---- ------------- ------ ---- + -a---- 12.03.2020 07:03 371656774 windows10.0-kb4551762-x64_dacef156c781f2018d94d5a5286076610ba97279.msu + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Get-WURebootStatus + Get + WURebootStatus + + Get Windows Update reboot status. + + + + Use Get-WURebootStatus cmdlet to check if reboot is needed. + + + + + Get-WURebootStatus + + + AutoReboot + + Do not ask for reboot if it needed, but do it now. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Silent + + Return true/false only. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + Get-WURebootStatus + + + ScheduleReboot + + Specify schedule time for reboot. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Silent + + Return true/false only. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + Get-WURebootStatus + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Silent + + Return true/false only. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + Get-WURebootStatus + + + CancelReboot + + Cancel scheduled reboot. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Silent + + Return true/false only. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + Silent + + Return true/false only. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoReboot + + Do not ask for reboot if it needed, but do it now. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ScheduleReboot + + Specify schedule time for reboot. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + CancelReboot + + Cancel scheduled reboot. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.Management.Automation.SwitchParameter + + + + Return true/false only. + + + + + + + + PSWindowsUpdate.RebootStatus + + + + OutputType for RebootStatus objects. + + + + + + ---------- EXAMPLE 1 ---------- + Check if restart is necessary. If yes, ask to do this or don't. + +Get-WURebootStatus + +Reboot is required. Do it now ? [Y/N] (default is 'N') +ComputerName RebootRequired RebootScheduled +------------ -------------- --------------- +MG-PC True + + + ---------- EXAMPLE 2 ---------- + Check if restart is necessary. If yes, then shedule it. + +Get-WURebootStatus -ScheduleReboot (Get-Date -Hour 18 -Minute 0 -Second 0) + +ComputerName RebootRequired RebootScheduled +------------ -------------- --------------- +MG-PC True 31.08.2017 18:00:00 + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Enable-WURemoting + Enable + WURemoting + + Enable firewall rules for PSWindowsUpdate remoting. + + + + Use Enable-WURemoting cmdlet to enable nessesery firewall rules for PSWindowsUpdate remoting. + + + + + Enable-WURemoting + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + LocalAccountTokenFilterPolicy + + Set LocalAccountTokenFilterPolicy registry entry to builds an elevated token on the target remote computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + WinRMPublic + + Enable WinRM Public access from all subnets. Default access is only enabled from local subnet. Required for workgroup computers. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + LocalAccountTokenFilterPolicy + + Set LocalAccountTokenFilterPolicy registry entry to builds an elevated token on the target remote computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + WinRMPublic + + Enable WinRM Public access from all subnets. Default access is only enabled from local subnet. Required for workgroup computers. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + ---------- EXAMPLE 1 ---------- + Enable firewall rules for PSWindowsUpdate remoting. + +Enable-WURemoting -Verbose + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Add-WUServiceManager + Add + WUServiceManager + + Register a new Windows Update API Service Manager. + + + + Use Add-WUServiceManager cmdlet to register new Windows Update Service Manager. + It's combination old 'Add-WUServiceManager' and 'Add-WUOfflineSync' functions to register online and offline ServiceManager + + + + + Add-WUServiceManager + + + ServiceID + + An identifier for the service to be registered. + Examples Of ServiceID: \r\n \r\n -- Windows Update 9482f4b4-e343-43b6-b170-9a65bc822c77 \r\n -- Microsoft Update 7971f918-a847-4430-9279-4a52d1efe18d \r\n -- Windows Store 117cab2d-82b1-4b5a-a08c-4d62dbee7782 \r\n -- Windows Server Update Service 3da21691-e39d-4da6-8a4b-b43877bcb1b7 + + string + + System.String + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Silent + + Don't return output. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + Add-WUServiceManager + + + MicrosoftUpdate + + Register Microsoft Update Service Manager - '7971f918-a847-4430-9279-4a52d1efe18d' + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Silent + + Don't return output. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + Add-WUServiceManager + + + ServiceID + + An identifier for the service to be registered. + Examples Of ServiceID: \r\n \r\n -- Windows Update 9482f4b4-e343-43b6-b170-9a65bc822c77 \r\n -- Microsoft Update 7971f918-a847-4430-9279-4a52d1efe18d \r\n -- Windows Store 117cab2d-82b1-4b5a-a08c-4d62dbee7782 \r\n -- Windows Server Update Service 3da21691-e39d-4da6-8a4b-b43877bcb1b7 + + string + + System.String + + + + + + AddServiceFlag + + A combination of AddServiceFlag values: \r\n0x1 - asfAllowPendingRegistration \r\n0x2 - asfAllowOnlineRegistration \r\n0x4 - asfRegisterServiceWithAU + + int + + System.Int32 + + + 2 + + + + AuthorizationCabPath + + The path of the Microsoft signed local cabinet file (.cab) that has the information that is required for a service registration. If empty, the update agent searches for the authorization cabinet file (.cab) during service registration when a network connection is available. + + string + + System.String + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Silent + + Don't return output. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + Add-WUServiceManager + + + ScanFileLocation + + Path to Windows Update offline scan file (wsusscan.cab or wsusscn2.cab). + + string + + System.String + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ServiceName + + Name under which it will be registered Windows Update offline service. Default name is 'Offline Sync Service'. + + string + + System.String + + + Offline Sync Service + + + + Silent + + Don't return output. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + ServiceID + + An identifier for the service to be registered. + Examples Of ServiceID: \r\n \r\n -- Windows Update 9482f4b4-e343-43b6-b170-9a65bc822c77 \r\n -- Microsoft Update 7971f918-a847-4430-9279-4a52d1efe18d \r\n -- Windows Store 117cab2d-82b1-4b5a-a08c-4d62dbee7782 \r\n -- Windows Server Update Service 3da21691-e39d-4da6-8a4b-b43877bcb1b7 + + string + + System.String + + + + + + AddServiceFlag + + A combination of AddServiceFlag values: \r\n0x1 - asfAllowPendingRegistration \r\n0x2 - asfAllowOnlineRegistration \r\n0x4 - asfRegisterServiceWithAU + + int + + System.Int32 + + + 2 + + + + AuthorizationCabPath + + The path of the Microsoft signed local cabinet file (.cab) that has the information that is required for a service registration. If empty, the update agent searches for the authorization cabinet file (.cab) during service registration when a network connection is available. + + string + + System.String + + + + + + MicrosoftUpdate + + Register Microsoft Update Service Manager - '7971f918-a847-4430-9279-4a52d1efe18d' + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ServiceName + + Name under which it will be registered Windows Update offline service. Default name is 'Offline Sync Service'. + + string + + System.String + + + Offline Sync Service + + + + ScanFileLocation + + Path to Windows Update offline scan file (wsusscan.cab or wsusscn2.cab). + + string + + System.String + + + + + + Silent + + Don't return output. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. + + + + + + + + PSWindowsUpdate.ServiceManager + + + + OutputType for ServiceManager objects. + + + + + + ---------- EXAMPLE 1 ---------- + Try register Microsoft Update Service by custom ServiceID. + +Add-WUServiceManager -ServiceID "7971f918-a847-4430-9279-4a52d1efe18d" + +Confirm +Are you sure you want to perform this action? +Performing the operation "Register Windows Update Service Manager: 7971f918-a847-4430-9279-4a52d1efe18d" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + +ServiceID IsManaged IsDefault Name +--------- --------- --------- ---- +7971f918-a847-4430-9279-4a52d1efe18d False False Microsoft Update + + + ---------- EXAMPLE 2 ---------- + Try register Microsoft Update service as Service Manager. + +Add-WUServiceManager -MicrosoftUpdate + +Confirm +Are you sure you want to perform this action? +Performing the operation "Register Windows Update Service Manager: 7971f918-a847-4430-9279-4a52d1efe18d" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + +ServiceID IsManaged IsDefault Name +--------- --------- --------- ---- +7971f918-a847-4430-9279-4a52d1efe18d False False Microsoft Update + + + ---------- EXAMPLE 3 ---------- + Try register Offline Sync Service from file C:\wsusscn2.cab. + +Add-WUServiceManager -ScanFileLocation C:\wsusscn2.cab + +Confirm +Are you sure you want to perform this action? +Performing the operation "Register Offline Windows Update Service Manager: C:\wsusscn2.cab" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + +ServiceID IsManaged IsDefault Name +--------- --------- --------- ---- +7e1364ef-e30e-4f4e-9c66-84194eebcbbe False False Offline Sync Service + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Get-WUServiceManager + Get + WUServiceManager + + Get Service Manager configuration. + + + + Use Get-WUServiceManager cmdlet to get available configuration of update services. + + + + + Get-WUServiceManager + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ServiceID + + Get specific Service Manager if it's available. + + string + + System.String + + + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + ServiceID + + Get specific Service Manager if it's available. + + string + + System.String + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. + + + + + + + + PSWindowsUpdate.ServiceManager + + + + OutputType for ServiceManager objects. + + + + + + ---------- EXAMPLE 1 ---------- + Check currently available Windows Update Services on machine. + +Get-WUServiceManager + +ServiceID IsManaged IsDefault Name +--------- --------- --------- ---- +9482f4b4-e343-43b6-b170-9a65bc822c77 False False Windows Update +7971f918-a847-4430-9279-4a52d1efe18d False False Microsoft Update +3da21691-e39d-4da6-8a4b-b43877bcb1b7 True True Windows Server Update Service +13df3d8f-78d7-4eb8-bb9c-2a101870d350 False False Offline Sync Service2 +a8f3b5e6-fb1f-4814-a047-2257d39c2460 False False Offline Sync Service + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Remove-WUServiceManager + Remove + WUServiceManager + + Remove windows update service manager. + + + + Use Remove-WUServiceManager cmdlet to unregister Windows Update Service Manager. + + + + + Remove-WUServiceManager + + + ServiceID + + Specify ServiceID of Service Manager that you want to remove. + + string + + System.String + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ScheduleJob + + Specify schedule time job. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + ScheduleJob + + Specify schedule time job. + + DateTime + + System.DateTime + + + 01.01.0001 00:00:00 + + + + ServiceID + + Specify ServiceID of Service Manager that you want to remove. + + string + + System.String + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. + + + + + + + ---------- EXAMPLE 1 ---------- + Try unregister Microsoft Update Service. + +Remove-WUServiceManager -ServiceID "7971f918-a847-4430-9279-4a52d1efe18d" + +Confirm +Are you sure you want to perform this action? +Performing the operation "Unregister Windows Update Service Manager: 7971f918-a847-4430-9279-4a52d1efe18d" on target "MG-PC". + +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Get-WUSettings + Get + WUSettings + + Get Windows Update Client settings. + + + + Use Get-WUSettings cmdlet to get current configuration of Windows Update Client. + + + + + Get-WUSettings + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. + + + + + + + + PSWindowsUpdate.WUSettings + + + + OutputType for WUSettings objects. + + + + + + ---------- EXAMPLE 1 ---------- + Get current Windows Update Client configuration. + +Get-WUSettings + +ComputerName : MG-PC +AcceptTrustedPublisherCerts : 0 +WUServer : https://wsus.commandlinegeeks.com +WUStatusServer : https://wsus.commandlinegeeks.com +DetectionFrequencyEnabled : 1 +DetectionFrequency : 2 +NoAutoRebootWithLoggedOnUsers : 1 +RebootRelaunchTimeoutEnabled : 1 +RebootRelaunchTimeout : 240 +IncludeRecommendedUpdates : 0 +NoAutoUpdate : 0 +AUOptions : 2 - Notify before download +ScheduledInstallDay : 0 - Every Day +ScheduledInstallTime : 4 +UseWUServer : 1 + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Set-WUSettings + Set + WUSettings + + Set Windows Update Client settings. + + + + Use Set-WUSettings cmdlet to Set configuration of Windows Update Client. + + + + + Set-WUSettings + + + AcceptTrustedPublisherCerts + + Enabled - The WSUS server distributes available signed non-Microsoft updates. + Disabled - The WSUS server does not distribute available signed non-Microsoft updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + AutoInstallMinorUpdates + + Silently install minor updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + DetectionFrequency + + Time between detection cycles. Time in hours (1–22). + + int + + System.Int32 + + + 0 + + + + DetectionFrequencyEnabled + + Enable/Disable detection frequency. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + DisableWindowsUpdateAccess + + Disables/Enables access to Windows Update. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IncludeRecommendedUpdates + + Enable/Disable recommended updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + NoAutoRebootWithLoggedOnUsers + + Logged-on user can decide whether to restart the client computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + NoAutoUpdate + + Enable/Disable Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + NonAdministratorsElevated + + Enabled - All members of the Users security group can approve or disapprove updates. + Disabled - Only members of the Administrators security group can approve or disapprove updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + NotificationLevel + + Notify mode: "Not configured", "Disabled", "Notify before download", "Notify before installation", "Scheduled installation", "Users configure" + + string + + System.String + + + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + RebootRelaunchTimeout + + Time between prompts for a scheduled restart. Time in minutes (1–1440). + + int + + System.Int32 + + + 0 + + + + RebootRelaunchTimeoutEnabled + + Enable/Disable RebootRelaunchTimeout. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + RebootWarningTimeout + + Length, in minutes, of the restart warning countdown after updates have been installed that have a deadline or scheduled updates. Time in minutes (1–30). + + int + + System.Int32 + + + 0 + + + + RebootWarningTimeoutEnabled + + Enable/Disable RebootWarningTimeout. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + RescheduleWaitTime + + Time in minutes that Automatic Updates waits at startup before it applies updates from a missed scheduled installation time. Time in minutes (1–60). + + int + + System.Int32 + + + 0 + + + + ScheduledInstallDay + + Scheduled day of install: "Every day", "Every Sunday", "Every Monday", "Every Tuesday", "Every Wednesday", "Every Thursday", ""Every Friday", "EverySaturday". Only valid if NotificationLevel (AUOptions) = "Scheduled installation" + Starting with Windows 8 and Windows Server 2012, ScheduledInstallationDay are not supported and will return unreliable values.If you try to modify these properties, the operation will appear to succeed but will have no effect. + + string + + System.String + + + + + + ScheduledInstallTime + + Scheduled time of install in 24-hour format(0–23). + Starting with Windows 8 and Windows Server 2012, ScheduledInstallTime are not supported and will return unreliable values.If you try to modify these properties, the operation will appear to succeed but will have no effect. + + int + + System.Int32 + + + 0 + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + TargetGroup + + Name of the computer group to which the computer belongs. + + string + + System.String + + + + + + TargetGroupEnabled + + Use/Do not use client-side targeting. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + UseWUServer + + The computer gets its updates from a WSUS server or from Microsoft Update. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + WUServer + + HTTP(S) URL of the WSUS server that is used by Automatic Updates and API callers (by default). + + string + + System.String + + + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + AcceptTrustedPublisherCerts + + Enabled - The WSUS server distributes available signed non-Microsoft updates. + Disabled - The WSUS server does not distribute available signed non-Microsoft updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + DisableWindowsUpdateAccess + + Disables/Enables access to Windows Update. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + NonAdministratorsElevated + + Enabled - All members of the Users security group can approve or disapprove updates. + Disabled - Only members of the Administrators security group can approve or disapprove updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + TargetGroup + + Name of the computer group to which the computer belongs. + + string + + System.String + + + + + + TargetGroupEnabled + + Use/Do not use client-side targeting. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + WUServer + + HTTP(S) URL of the WSUS server that is used by Automatic Updates and API callers (by default). + + string + + System.String + + + + + + NotificationLevel + + Notify mode: "Not configured", "Disabled", "Notify before download", "Notify before installation", "Scheduled installation", "Users configure" + + string + + System.String + + + + + AUOptions + + Notify mode: "Not configured", "Disabled", "Notify before download", "Notify before installation", "Scheduled installation", "Users configure" + This is an alias of the NotificationLevel parameter. + + string + + System.String + + + + + + AutoInstallMinorUpdates + + Silently install minor updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + DetectionFrequency + + Time between detection cycles. Time in hours (1–22). + + int + + System.Int32 + + + 0 + + + + DetectionFrequencyEnabled + + Enable/Disable detection frequency. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + IncludeRecommendedUpdates + + Enable/Disable recommended updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + NoAutoRebootWithLoggedOnUsers + + Logged-on user can decide whether to restart the client computer. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + NoAutoUpdate + + Enable/Disable Automatic Updates. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + RebootRelaunchTimeout + + Time between prompts for a scheduled restart. Time in minutes (1–1440). + + int + + System.Int32 + + + 0 + + + + RebootRelaunchTimeoutEnabled + + Enable/Disable RebootRelaunchTimeout. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + RebootWarningTimeout + + Length, in minutes, of the restart warning countdown after updates have been installed that have a deadline or scheduled updates. Time in minutes (1–30). + + int + + System.Int32 + + + 0 + + + + RebootWarningTimeoutEnabled + + Enable/Disable RebootWarningTimeout. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + RescheduleWaitTime + + Time in minutes that Automatic Updates waits at startup before it applies updates from a missed scheduled installation time. Time in minutes (1–60). + + int + + System.Int32 + + + 0 + + + + ScheduledInstallDay + + Scheduled day of install: "Every day", "Every Sunday", "Every Monday", "Every Tuesday", "Every Wednesday", "Every Thursday", ""Every Friday", "EverySaturday". Only valid if NotificationLevel (AUOptions) = "Scheduled installation" + Starting with Windows 8 and Windows Server 2012, ScheduledInstallationDay are not supported and will return unreliable values.If you try to modify these properties, the operation will appear to succeed but will have no effect. + + string + + System.String + + + + + + ScheduledInstallTime + + Scheduled time of install in 24-hour format(0–23). + Starting with Windows 8 and Windows Server 2012, ScheduledInstallTime are not supported and will return unreliable values.If you try to modify these properties, the operation will appear to succeed but will have no effect. + + int + + System.Int32 + + + 0 + + + + UseWUServer + + The computer gets its updates from a WSUS server or from Microsoft Update. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. + + + + + + + + PSWindowsUpdate.WUSettings + + + + OutputType for WUSettings objects. + + + + + + ---------- EXAMPLE 1 ---------- + Enable IncludeRecommendedUpdates attributes. + +Set-WUSettings -IncludeRecommendedUpdates + +Confirm +Are you sure you want to perform this action? +Performing the operation "Set Windows Update settings" on target "MG-PC". +[Y] Yes[A] Yes to All [N] No[L] No to All [S] Suspend[?] Help (default is "Y"): Y + +ComputerName IncludeRecommendedUpdates +------------ ------------------------- +MG-PC True + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + + + + Get-WUTest + Get + WUTest + + Test cmdlet. + + + + Use Get-WUTest cmdlet to test. + + + + + Get-WUTest + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + TestParam + + Test parameter. + + string + + System.String + + + + + + + + + ComputerName + + Specify one or more computer names for remote connection. + + string[] + + System.String[] + + + + + + Credential + + Specify alternative credential. + + PSCredential + + System.Management.Automation.PSCredential + + + + + + SendReport + + Send report email to specific recipients. + Requires the parameter -PSWUSettings or declare the PSWUSettings.xml file in ModuleBase path. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + PSWUSettings + + Required parameter for -SendReport. + Passes the parameters (as hashtable) necessary to send the report: \r\n@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25];[Subject="Alternative Subject"];[Properties="Alternative object properties"];[Style="Table|List"]} + Send parameters can also be saved to a PSWUSettings.xml file in ModuleBase path: \r\nExport-Clixml @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";[Port=25]}" + + Hashtable + + System.Collections.Hashtable + + + + + + Debuger + + Debuger return original exceptions. + + SwitchParameter + + System.Management.Automation.SwitchParameter + + + False + + + + TestParam + + Test parameter. + + string + + System.String + + + + + + + + System.String[] + + + + Specify one or more computer names for remote connection. + + + + + + + ---------- EXAMPLE 1 ---------- + Test. + +Get-WUTest + + + + + Author Blog + https://commandlinegeeks.wordpress.com/ + + + + \ No newline at end of file diff --git a/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.psd1 b/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.psd1 new file mode 100644 index 0000000000000000000000000000000000000000..a71f3403b5c244d7a52651f2bc67bafacb51a897 GIT binary patch literal 47542 zcmeI*X>VLhk{)1w9RvOk7q|v`Z2C4yaUWm|lj15a5_eMH#9b08uA)d8{_D2i=cJOS zii?&zJ>7<35XGuGCr@T%WMpQ<8xdLm`+xo3^B;TuL(lI$zx6Ejob~MYeC|2vImoxu zo_9T;dfxXO=G#@zb*>!d{$+Egv)o^L-t?^XY^CI)wDX+_K_xDrdZqHrMzvO)>we0mA=gvvK&F1|>Q%`yJdo`S;PBpyf>F*iH-yhBU zAI%c6-`cKCp%c1#OB|MX2Jj6vbUZ+YUka8?gWugQhl4|@JBN!=}XafK}0=1!65&*4R>^*VBMp1#yJt|KFVZT^f^=XgIH zvoiWGQr4?KufYeSycYV;o7ykam(sTRI2|fTUK#zumES|-%g}L}@_PP0(tvAEmH(|r z+yA}ipL_mu*KC>ZnacIg=}T$L`1@|9xXAlKYBWpUr+xEWD~HV$v!KdbE?ww)ZguLOcP)oMHT^E_-89^=K3YM4)OvRv%Z>b5lYf;NW_vhLy z{a=4lrhf~KTE=VZo9~?~l=jS;vcta1=%BlM2mP&U4>fP~qRgm=d?A>-jVj`LUPM4y=S9e_6Jy9__3%pUHZaPO@bewEtL9ZobWa5?i%bb6tt2 zM)$YuZq}HO%?v$HDXT=gk6O7uWq#bHPj-o^e7{cbXdaLI_B2GDGWXa@nkcc3<57E&KS(p2eQkX0>kl<liUx>B%MCw^HoG0|W2DgvC&I)1d>;A}+#@AueoV>4vvfSY zqO>{_$tDMOa=Qp^%qO}%$*14xYt;ws4rRxw(sLAvIZOFsXIblMvv~EXkr(C5ZfOs} zweoyt-D*8*?mVa0>Gx`A>fAXxwO#$t*T-7sL^ECop@oKO-}`=_^@gTcq}i(Qx2F4P zik_yv+oG%%q8|Kn=Kgv5GSEm;JBDP^*p*pp49)5~T6@hn(bO-qKdR^7W5mjeX3RS2 zzshQR_CR`{8@2VUi|0*0p6>H)#`EM`&*?u!Uc1NcOS3xb{jbYfZU0wjo@wNpCPw1_ z{&aV?|2*A4MgThNsWMjh-Mu0{oPUq!wH1<#v6HPUWlq^?DmLV9w?5W+mz6;Z;2`)} zo-Y!;n&%#39DQ9D@MCGSg4$s#Ef0H8R?F{WP=zC>nRngXm}z#&)>hE7!jXem@^uv@ z7uH6)wK@6NiiI6i{eo1N^%xf}zg;i7zMV)}b|4PpMYX02Rs^ju-!Joy8vD8(y88($ zUBNr78g-p0)&Z1C8^uO1HCQq13dIUiJ3Xw}=@kbmdQ{mT)rva3V%z_SLuKuF%uS;? z-NnhLSIn28u0?SE{}|N$pp3!O)?=rH7XEj0@p<0=CHD7z{{D!~xslc0$lL!(=Taka zMT@lCkfgt44B62IEhq~ALGHL&bH)6=s8b4-5TBF8aI08 znz?6&lJciY%%@eek7iSL%(dnlE$`~dCtjsCSkYsu7E_D5^z|ywpXBq?btti$dhp{% z?fneDJ9(r0b^Z#U+xGSJCM|x<{W2!qJ*gvf^X>kR#^Yi6pOcJ2T`NgXQQGMZC?z}B z@XGmGQ(4JN>rd5IMx#pE#yz4*cP%Sm%cD*{zRp^9m@&i$a=sSX|4XzH`%Bf*H#6dN z$13Z8c0W+xs=FQKE83g{Rbu0rRZrGPa5zqun7JnwtlDXU>O7k`%bQ<008 z;oW7!`?Jh?*5aQZhbmc98OgnGD@kXqPt*0-B3g_@Sc|IWRo1s|4+~j=?C)hwC@VP4 z;b{+4tIbskJLhEE+SB`Wd%x&`m6}fd`Oi@@lYUya+ZKLKzpEaw|C+hT1U_4IC>h`vj|BpHyG$Cx;3jnq`i*sp(U5RI$+_pRs}ozly`@5JKN+%5mU*%y?o zb+(==KIW%Uzp`F*^R%U^%z)NsTz!e%v_Ds>mi|3$uZJo=L0sXpJINRp>!^&{)3!zB zt2KyTUNCytWIMCF#}${XHas14yQ1f_sSA2pcEI04OPROI6pW>CqS9R7yJ>&CBGhvA zUHOT;HnQF==DqD5`t{n1N>B5>?o!Y7-uhH)uJ2ZdwvLU4{^}hgKiA>zRpJ5q^2dvz z?$42_zcySs&DGPU_a(YuEZ)MtAFLXEjYQHEJzM-bed*nNc8lrQr#!ChE?()Z@89Q0 ztvF>hd7XYt6hudmaer?^9s+cJL-?)+-cS+x+J;wLM+t)3MbFJ9yCp^H!V z8<*$5)!E(a@6$)4wC5C^0tReVHBVcVL1R!;5P^K|}5v+ks^ zSb_W|1*I)~ZFO<$Hv8(K_F`?QxXWoHExxsWrOy8G3Y0ZpD@XVGbm2Vz;y~&zoHt@t z%pX}s)@gfAS))mi28UKBtNa@eS8;Cu;>^!V~M7{o44qa$CH!m3vRi z?ON&~v(H&?o$_#%cJRLJ{}qGiwDl@=MK9B!#pz5W$h_iOJ{4WZTffFF^| zX)is%ow7@+wQZ-Mu(!FV4{c0c(II$O3;n3C_`~0VYU=}8ENgP%7H;#K6>b&pS+SMH z-A&~Q8qHbyS7S>iQoha!J)BR^Ci1es9i^W*Ua#A;+ST9H$y_Pu(LvAalrC{a6%Q@( zIcLqdjX`#aapr!gkJkrF@lTpi@Ra}E1GTGL&hI?K8!qO3o>u+FRTOL$&5XKfO3 zP$ZQ$>CRIzl0|NxkCCiB@ZOD3TK8$fWS%FnYCBqGxpr!`|MG1;vKEcxb({M?{`=RS z|CUm1UvHaQ%KBN5sIpGdNy+0{q!-%VU300W^C_#%bC{`q{%qOW&aby%#D3+kv@o6C zRoklczsga?7g66SpWTS-(=C>|pMUCMowWCYWjtMJ4_nxXv>B7{&5hDRT@iky9czK?bo(H>rK!?h-%AURpDLaUHU7DEt#e+r zbv^9KMl^&@AHc)a{^|aIe`iJW<95C`GIeeHwWl7A=S1|2`3D}e%H{h0SYn=f>S4{# zX(Y8)?~iMK`YCmn*&-ULtR^%?dMk~MtxeDD{3~_;(d^U@pY7&r=Tqf#=d+zM;kj=6 z;<;zP_f+XkYn%Ukt)*n?|HG%$+PT7(QcK}Xi_|`(w)FG+Pd&yw{%837dtS5v`cT*poEKs&Uq6%3@vEGdjKN#nNuEh^MK8)4mQT>?C+%|707KXj9*wr^7z=KD?j> z&qwdA7VIBgu`%?DVkZ^)3kvqQmoLLnv7x0moliXG(f@45wvMs7){llQ4y9d63e&#H`gZn`PA zla>a*m7h+#v+2o~@Mb;N`tP56x;#Je%k%?XUz*w`@@XZ1bBPZ9l8ls{&~Os!p}?|E zUWMkxv{C6;=-E!Guj$)L=$OpY6F+#LN{QRFi@Mp=yOq~$!%r=tW2K>IC3Q}u#+Tv1 zaOC1D|F6Tvi^$n{O1;W!GJ?kERZ3Z_kMg&jZ)KdP)9SlWfoA;1r{lbKL&;7!bdsm9^ZwzUj)|1|n40eL zoO~VeMg6I}?eAK8puh8}WiU09hsmY|{ap%0L*dWMMm}COV1_S?q?kP!=shdvza=oeC(&MC(T^lisT%pobNZG z>wVgp%y)G0JCH31&|F%+4V@p-Gc)2S&z1f!g)X^N%MG2M^4vh4TT7XZ(ETZ;zBcu5 zriS@YIGl1V9do&7j>2Nm*`E?$(%NyZEvKI!n(xbLV=3(~rEfbav(${ki}bE7_c70z z*VCc-ak&o}J5*2Q{$lP=gqn7~OoZl*+?h;$=AO@Ap6Tyd)8EbXOWgZ*xC1wsjl3P@ z+H77Qa(y=a#LwAC8|!zg;e&Br%5y8>4|#gk^rPiRCtt;7;`(F0w&Sbbx1oUC%!Dt# zkEecoo=Kn3Rn|cA)}L91KOdVuT5oH=%iQ0+AD1dG#(gt$smSMD>e~)I{b_S6eK<;O zr@2qgUZh>Ki=3K0R^q#~W4(Qu7r80x>c`A9>+1W4H(&C!S!BLhS0^%tFYoCfYh$@q z>v@^)R)#X~C&FQP{!mYEp4ts1N4ayGx<7>@JGnx}SM%*nXqnG^o6F~ov?mL*FDuS= zXt3HsM{o0bmolCh&MI}%LC0_-&x^S?9_qzfj^?x3yPx;nv^yPIw$m?r#AU{HJZ*}& zAa|qrd=#pnPW>srnJahU>O`}mS*vf;t~Kd2*SAyCMed#DrEem7>U_CK4TGU`AupEI za`;9=*h{+uxjK+pG#i=P%(eHSW+fve-?BfYuF}e3>f@W-4##Hm{Y|7C?`A@s{ca%N z-=)^s+&K*uuTsa$)MY(=liDgB{Tcs*rW~2;4adG_)HgG;KIOHVnzvH^UHJGSrG|55 zF8>!ZCU@baTHl9~{*<{(yGt1p9u~bDOFi#H4J`FlII@?~+HG1G48Mm{o+e!B=*yL} zP@rwi9CJxZLB_~9nyM{o*SRbyz{({gyv7F*(xhb*^WD(?~vqo4VSl? ze&2+?%kU8zd7cu7c_&jm5|xhGw7>#f4G#`Oy_N1&YP8EN=H6Inn+tz&cPVte4K>S= zo$>VULrT5R)ze%thw0a+Y424=VaW^SK+i-HkGGun|8)hhmx0R`5>)MgeJYFEv~0lYsWxZI*hE0gm1^83Rbxo zY3U2UZ<_HN%=f`u-^dlSt@7h4ZExoJgYa_ zHS^*i@^Tkiw(`VS=-3P8yLsv`{kLE8?4RfJc_Wo}*Nu$Yt8nH`=-~%jOh4Ln%)0R+ zHN8(svtl6BPNn2=J}ri}7ongxZLqe7!s)AUVl-Fq!>YZP-u9-2-n4Gd-c4^l=UHo> zUCX-gCHH3XSu6wjKW?5`&Is?_^Me+%liEqUF`G>-+o6q4LYFy8kKU$#bi3QoI-Rzx zVK{T1((m&O{r**2A7|#1nYWGe*`;tF0XO&!N-qB|U&ZTWKJDom$&9(i8uA|gJhqoiS zzY(rYHj+lmIu5TM(^=`j#m&%8uc7bm=6$*0_RGllhsY&spz61un{wmfJH2oE*>-v2 z#Ctz(SN}HCC;IMkW?ZEMALuoFH2Cna-M!rZ@{PZ%p|jHKoxY78dS;bpcEQTG>&AF7 zV@6&#Gg|cYV$+myUCDEmj>mi~@-fqJ@^OFm(+{ub#=DI3R5K<^p@YWuoZZZ;Sm`j{ zXk?F(S2JNQV|}xv>95mKzDDxbG7sm&FQ&qQl*lcKEmma6ik7?^7*Xg59ZNTBZ z++9t18WSsFD{ao?(?uv5NlOR$ZV!5$=g3`OD4xvNzs(clX@57Z?WbnD_3Awx@Q$rK z-=Dgy8aF9%mnWXKM)^2a8~9*TKkZZ`I_h6=02~dGc6#}R~Zkx zDVpAfI{L<9+B=Nw4(9uO%6`n9-B2)?UVaD#Z$jfzuAMZ!wJYr8dV9_XTXH`4E<%k~ zXt8($TUtmzUZw8ge3z?roBEIQG&}D+9JY%%L&N^b3Oq|4?7^=oUryw(J6qpq_LCWf z)zIpU2wXYLwVQi>dh8w-i zdy6N`ranju?cRDvdo*L}Is*}5$G*L%V>9D7+)z^NHBqVTb9NjpkZv=cmaMb;DQBHq z3NJQN4$1{5gWne0xU(HL`9UZt>s@OvicW-EzysR#^ljRq>+Pg|*R?m4c4&umDt2?R zBi$cP-D|mLt+P&6JVl>Hr?hr(#W^-Ji^;M51D^6WoS2L}>CbA%xD;IDGWDW!vKixo z+Z?B*H)+?tt8eV(FL{SM*iWbO+59zUP)lDa>pUJPZ(Uz*o*&BhubD#w4KIpZ?KJh) zdHZMaq`wu8RO!IyKZ7S(cTX~=aED*PkzR$5Y_zJ^R66V^1yAa4cvj@+$9NLCdyFF; zr7rfjx$!<@{G)wt@_xQ_?sIGlbHCJMeSkvHxlqgg8O{u_&We~fzGj}4ZZ?0z`D_*a z8aa6%`LTYn>u7^FS$PH`Wh|nlW_H0NK6lI)SyuGvm0aCOo3s$S=V_j%W17wE;?v9` zv(#xstEqhG9$)wW^I;h4rx8h-RZnrU04xI>345 z+%j)XZ|<6-uqXJ?=hQNl_Rmw}OnSSR7aW_8ejd8n(YtAdJ=&M2_V4Lq_*+ASf0aqzYJAx!=0l%_cGkDJF@Wy^OW-u z=mZPt(`a}I37EU5V=z>bEy$B-qIdaD6By3ekk^$weVuo9A>GJ|gu8FjBRUw%+RieX zzJACv_`cupg4DwM_z!M#pDqBM;>UQI`Y+SY`+GW8QakN^khO zochM^=`gomr51PJgd^}uxZFyfWEG-tAlw~FiH$tF61qO6t)qP3$?GI#Wm_Jl+<9t% zCG)Gm4f=ECAe7NzHzFqxrGb2!$$eu!6?&?ivd3O#RJTGaofEK6<7I(K2DaQ_#fVmQz91ze?ukvy@R|B!&w z+@-tErZ=$Qm+7GqF)s83(pve^pL_QD!sUVV&*($K_fv8%Ewkq7HF#+ze9g7NPzr%M zNc(U(TI!pWfSTxUZ~DN>c%MGPlr|$z_S>!0yBm%|JIv2kA7djI{D8E52;CpjQ!DoW zEx1EBKJa~9;QM$wy}RP+6)%Tyi$|&B@->`V&p6+NZ_o<+*GbCU=1C|mB#i#e;wVwI z{h4iMtrFWAM{|}oa@$A@Z^dYMf1A;QBfigQzD@0PeE!Vs@LLYdc-k_0m5!5q-b%|* zY?`S#1<#@N&1bAl9eB&9v~!y$kMjg-=hFh45kIEW7QL@8rJ(hjO)I;hoYwgv zGCCJ2W%biH>;P7!4-K8XUppBA*yBj<@UC3s+GeQ2{mKtkC@)39^$&7Sged>pU1+)s zCGfw?v~ZTIr_EU1rga`+K11A=v0w({cWb4M%USsPKKy~7uZ9ETp^zrMlTl$szfb#Y z1-s*$w11H&U@j2K(arkjM+k-JG-Z&cqpxe ze9gFRxElNZLvi7o~3WSdGd9xlbzyq;>$TmKln|cQ%1{< z#HO-)E~O@G_EzL+{hp5Aw6K>FlWCcL_o``&cZ3&2&tHUlOR19`PAlZU=7r*WyGgy5 zsnZOhNeyP?c5-Jey|+soq_x4^6KjTeWXHoBlpHsOH8Cp$k zBcXv_!&`lmR!`G=J`}d6HfVa{^6e~iIsov)W zcQDG%BH?|pg5d{D?;>~a^6Cp^?LK#%>uiF>aAhu3@V}TDVku~dcJ|5C2w&n?noK+9 z%Wc}2&t2LxKJjSS5!o5_u7;St;=c)1hx896QN< zb|t^_Q*jT!f(KMO_~o6W0SDl}-bwq#*GX6W6gsBzV&}s-z8{BR4TlG8q#otj{cRk= z*QOr$fOV>tt8}#G=^bKZIsW!{+)tVVV-9mT$3CVtG^6z^g$ z`<(l58@^k)P^`(j$TCkWU2`e(23}1|DWu_ z+o6!p(>nS#blV-KQ))Qn_(ykB^Ovk`Cy_BNTajL7UARcusZjMQrCC+tvWD`0krnMS zobVr>ypY#$>aa85=xXRfvmLnd13t~-<1yU}C1%e;-Y?RFS6S=Vb5Gocy_*kmFC3!@ z$f4l_kewqkN34li_crxA2brd0wZdwpo$=f5}5^BM#FLQr9^}&PfW;c0S<`umLmNK3HuqA<=?~y!poKp6qnS6iQ^a}njVr(K*upwr{JCP_> zY##T~(9N4r`LP$?-{l^BTlC7Sj2zuxUsknyFkL%-!WYdztTxX$MNNl#yFaYoa)3QqqirkI_M2h4zBQ zv-A7IThhf&!dZ#*Meau0t`Jg(R|I68a=4LtDn2J1HNp5-e1l=rCMs++mOUaI>K ze<&9QW}sB?K0KZEv3v6k?IcX1;e5xG+2X*^eU^8_C8H`2mirOZh9!Ed#a)~bArrUh#~ z&uLq~mA~zu9gUrSkpJ{3o~!CN=Id$W1H_ry31KA<{p)m?`Mmfk+UF}B`bXn{&#)U7 z@<&sop{}L8DDdOZ4o{y*PZlGM;sJ{P|8r>S_Vb8$f%Y!uy4kbWywg``p!^~b>-v0W zoB=*RA4jkgj+$%e{4;R`KZ+ly{OHzeO8;sc!N!yP6)98V2*jX2jI($cM?jC|&w4I? zpwiJDN5C2r_fY&w@YmLlU+}6{{>52ZPs|m%2fdVB+(ja-7;r8$$S<|_kt4{PXg3mT zzRlmu>EpN#S_pl~jCm**CB{IO`SWtYzBKdNxccYfKh3hr4;tO;&{%ORHYzNEMSGa* zv?pf-tx+Bgb(5l$5ZMyPtkFD^NrqOo#q!A zN^e?R>P?>I%jr+~`Sf8V92`yiVh8v;MBBp4X{h3j#I*Bqyw7-yrr#n@Kc|Kgqs2cj zHo`8%|6a6KD7Rkp=Q|ASBs7htwY5-H`2kTm%lb`o;|)8^IzN{`K7u!S*;UmFnKgq4 zQrBp%)78#%r$6`ThoaKnG+bj#LfxQO>|?e$g#AUHushLH><93h*1u1eww8Sjmqo!1 zN2=ITv=kcLQfinAUFXd@^Esb}@_o7C2!v%M-$v8&Sa<_D6cx3cQf%^(v@Grb{%DPa zW9+0}-UoI9i>>nGI?uCX#UAiWK=p6Jo#oW+2^s{uS}QynvLi}ltX=<8+M-uj(cgzs zKDd=!gU{2VK4euK%Dqo{UvJ9Hgp-G9f$p^3vG1?v2|67d8VXNmqAT>}d9k=>;j1&) zCNffxF*V<&gc!!*wEd>(8*~G5bCnkNGJ5@?e=j|TBnx(N9*TOe&lUl_^U!<1Nyno3jaxY?Ebn0mHl$j#8z#1;5U^TVzev3ZWhtcr& zI^POHyqarInnhq3EV^A0bD9~zn4(6JhhLNEAg#0q-i zJnwIFRn(;s;%Q*(@sf#^<}2Yrgv!9MzT}>D?IaXdIz$J+Q*N6%%m2q8%45P`@gjXP zqUIWZ5{y%P&Rit#CUl605Hob0&m;@YCn?_>N@h~SO74ijdzTt%9Fw_zm~m5zU-;;r zj-AveE>1+CQG<4fbrOkft)>Tm2vzI@7|>X#5Fw;Rb{Y8*2O*};Is3gCznM_ST0IR7 zV#c@APja%FSqqnhR9Hot9ehDktyI*(x1nJ-4oxNO_S1qJ(JwZ&Uy4 z)Uy=|2g8Ap)O()K)~m9={TyCpmwTA!QE`(>N7XI<-gzE%-)`xEfU+~-gf(8K#yhmQ z3+(c5ndedCbt)b7n15TI$7E!XJcxf1H$xA({WflJf4G?MH0e?fvRcbkI>gr)tM2k< zI9!h2Qu21{cs?FSdJv?)%}+WDO=jLqXdtKRD)CR#nJeOg#H`JP|HJokTH}Y{FpuM) zp3k4Dd~NwDz6c5=HvztB-GnBKgQ6LTc5n5(8jn=@QRdOF=g*jD-^-h!Z@>sjhTDgX z%UC$TKg{=nPhZ20*8j2{KAdM<=tlPZ_4MGPS#PWmL+K$uqE%4TqIeH_>0zi4Q^EJd zzH%ap{1d)DtBFh%`^9={vff&Q*_n1^nGd`mUvjs#=U9#K3cJEpR-w(@D^Yy>ZfALx ze}T3qLk3dQ+l;QgShR`wdwa*Le4-UX-dXN6DUtkVp=~qNe94^;d4eB;A7eD1{jcNl zF74AR?3)9raW2pBDu}0_Nt+^iZbHq+JarpR?WQI(Lu`lBg09no*p1Q1yWLHkjQ5rB zWhXBd>0YQD%JaN{yk)QwNCbVY(!sK)9qnY?WE*`B9qVZuRx_9Opm2P=u&Ra7Ai9Od zc9^H2XnoDPD>n%`(iT`C2Ks7gsdJ`{Z=z8V62r6Ig10iNB1?(;x$RU zU1>j`U#7=!WauRgj|MB>ho0aU+{6TmQ=pT43LUFyPj;C&3{kscGFZ@XCUF=nn%>-- z$bX1kr9-Ulr}PTda0}Ac8+z%^gJ}&~ApZAlYPL_pja-v|1qB_=vpmmtY0qvpkQU|H z+WjGX{Ho$5zN8(y-eme~6yZIC;drHk7Kj4-|A&-4N#8fq`%fuJpP304L@fEQSM(I# zHTzw`AjDN|r?ec5`8*Fhx=3BUxk5kYJryZ;p8ukdcs*HlbidY~gFnfJGbhCmze??- z#1rIkIJJswr16t;y9_TZo!hP~&x2P{%$V$OF;QPa^_%c$G|xd@<<^X)4J!oC*m7zY z!#W=RRep?y-ovzinL5QmL0UyUi_;;ue9k`y?Svd4-*WTpGkD-VyQt5b`)+Ej1MQgdw>XU0Fj)6a$ z_jkDYCPr8ck~-ywu!`wRzHf$8Mc*<*el>oj^5gmZ8R%etc&ZiJzIa2nmAC<@{Z_`m z*yQ#v$Qe7Y`u{3!1+x=h<~mJqCUd7VFQ?M+FhA${yqsT&k6BNv6(@A=`gCZdU+^>A zkBkU>qs1NA5qnJ;cm+JWK40^0=ocjp+FB^5lrHNJj_?o<`cdA^!+e{{kDX?A!d2Mt z@HzsF zJs!W;1Mrs!GtXLSUP+wY>9Ro*Wk?F6@m4WmCS|gvu-npB;jD`O5lxp*|U?#E& z_&W8?I(Zq2L{QM=#2Ul(L?+OP61 zN{w%m56W)_9)%KG+(v3(kFl}D5&9%@`*qr^bkK}nM{;;^$!Txu?+s7ige!e%n{G6l z8W-{z?ka-`0(zG3B*xCUoYH)^@FTi8J=_UFGvN*m`6f?7)OeRfXIW9q9@bW+141k! zOAa~w8Xa_1QYDAxI_=Re%*o5#g}adn_^!A^e241ae7h>PPMj9Yi;wdlbnG((CVimusbo}}APksg$`;rkHh&(^W#VQ_F=_t5ZE&un! z#VQ_F>G-$fVyqVVe_NT$CEkyZfgbohT&&_@m5yIMSLR2!nEiovK~J>Ce-3qGQp{v= zm@A=pBr6EN@px8&N{5p?&@a}2)o!J;?}{;JGaqI(5*sGomWE<&rd8N6MBbJC&PgtG zaoCg-xY*(&so^|z%TDG;U~l$kbuj-oLQjc_t#nw`=~5yjcy*iw#S0`y&#oXsL9{Jf zS=JaEW-Hf3VT@*lcG8(sS|)SVOoX!0=t>-`OlFzK+o_iqO-AxXO3L%*-D~xAUJ2(7 z>08-Z>@{n7R_v$j8}YqzlAKN;3)$Ww=ZIfKR=3@d2DuPw_|5Fl;>zqEBY8?pxn1x& zHI|64$&8O&6fs(rA2RmQCXebQ6pFUG3LVaPaB{fVY#tS-Bl0zgnWd3HjO82fj~KO* zts?t{tuq$7k3t13PUg^E{zG`!XRH_*(>yY*y)WA5AdH+Mq$J&KcJ#w0S7YE#K-rCA7a1h3Qk(0WACOl zo&r((@HAEew7J+@uyRqS`0BhMb4SL~TAmyUExeF4VkfteF*=i|d69N4uFYF|lINXb zH69K)tH%7No3i8RtNh}yYv&1Fr*3GGcy2izbT9t<*_4-2B^pT<=jVJEgW%j@RyL$@ zEp45q1=b($B}A|CVyacUEjSHA%q*>ltp4qB zv5JRPeiYomn%bT#BXdwbG2M^sqXq)%6bVsOyqM4nzdkRUcQkVNtGHOj!zvy1+?u~P zE>`idN{5K-e*`X8@vutAKMEJCcvz)_Ui6Q^#VQV0>8SeZ!+5-ZZ(OY6VU>+Ek3rK*7%8d5X73=$KWO1o?M6P3@;4`G9fmb0QoG~T5Ta8YM*9As=n(y+^3q(+(? z4TrtpJSVy+BnMYT^0T_&to^B*)QE#`^&nnDu}?gq)&?0!;<9mFMB{qua$1)0rZb6a zWFyiOKIYlt+qGVa3p`I-+j+NU9i}E8ZBj1#MRd(Yo@8(G7&v8h`Cd-RrHmCw7#v;n ztvrXLlyWk+bxHg;T$c@flD_femKb}eJTI|X2T?W4@x9<;vQlci*hSifRaIOJ9wyVe z&KFwtyU)4B~3UeSA<<>t%gI< zIh?>s(!{ZgJ*afFc>?8pXL>cyF@1p7!2WDqkOAUMPjQmYZ$1d+_+)K{>X}j9=KBw~Y_0bcm*aRmfPyb@hqkv*tPP$^I{Yt1}*7c~PEnfkZCzW|#Z&8P{`< z-^`vTj*E3IE4q{u#e%cSiPNccbe0$IVJv=*ud5AT<@uGoh;qs~E*ytf;{q9F zkc`Q6?sV(Z?f$~+t|l??<0)U_`|-zjNWfg46zdNh_SVI>#0a<^_TJP9_Nw| zc^nRrC991cNQSxZGO;Q@N`55-e=GOl-@G2=K~^!_87@@h|Ec`Qhw{qGCa*t}7iq7q zbX;dwnEP38EcJWFm5k>qu^~$7@;l7^F@OZIol@8~pl3;N@&RU(x z_tS=o@jPMvucwZ?jMH{AOT~=erIq(tbNI>OVe}GyHRu#ijXbD}v{KFig3yQ>=1)|b zuVyWukDC5gI(TO6Km2w#xx+ij@~7F@o%rfza#bX9=Ht{P4^YmrEDKSTJR?qGP>-`ltghnk;b2aG;w2H6B<}A;c&(S>_Mo%YeNlFY znVsUVD;;AgV~>+JO24yG%dmsEFNbCb*iveI(MTj*Y$~Pf!K8*h{2^lqpDG>|v3_5} z0s1ifq&M}I+=jB=k&@H&Sv(wXa;3vA>eK`X0`EGj!DmwH}-~DPcki|VJy#zZE_YRk2Rm^ zQm7ls|B|8Vya*`Sa9V2DQ!?fBWO@oj&uQNziN<@8T37(=LJ^aqD@#Nrr zAvlx4>2E9Hk=?F4FH$CG$&1|1oi;DB@}uBVRhGSOs^olC5O@5pP9@ z7pY4xYx4#xKPnDE?<=zYRKA*XC+TP2$u5h9R|Upf=#(Spte&DbJbk|KQ+a_c9rQ>Z z9{z^MeErq@z@OtIJ;eAP-p`kI{P|q0B4lhUJhsD$KVb>t)^emCk~@++G(p)lqKH|z zbWdIkHaS^)KJRuv6!6HKXY``V52L$~TAWKu(uPuxxM%tn@56Au(}Tob7yYk9RZQk8 zxu{8MKyE9?fiVcV;g^1>436)FAlNdtrHFRVIOrKLzwm2J|Pyy*s$a1OV$Tgzq8yR z7fxWXJCxr&V%e#;GY`jXE9X~=V3zM=oJD8KP}90-jGL@);+A+B=@?c=$Pr6PrpI6; zs`yLn6BpqbeG%`S(RP_n&IjND8BLAiwY7DeeW~(eJ~GFf0Ob+`w48Tw_xu_38g?Q4 zz_~(xcTP+^bWRq&ND{h*EDAcWEGQbkcpWj(G;@(jem}x^%86BrmBhNsV^`^bWwAKM zQkxhRqb^rp#3&CH``OMae?$ffuG5Q({cQ&n6OBWA>9sTO<>JyUc{}ZT;!2&~NPnJ5 z8NN~Ru(aOsdphnS<17*T2x*2pSx@%!ou@>-&IOnbKi{PN-EhwOE4R$~73EAT(d!UR zh>PEYV9U!{GvEEHfJkeeNN1*r{F4tOn)mvi4xYQYW`!6{&!Lla&=Pl3G6;E~hC;iT zdig0(KX!%ll1sh~+1w3Jo!CJ0`y2}K*cpnl%jA%W^S;b~dj- zs9U*v7rJo%P42=?M8)$_o8dH5h_jP6oZ3h$+{j&83VTl$j9;IaPmNP4HJs~}4!%aG zhMcA*D60G(SeX{-7UHoM!)x}yLbxDO9_Aqy)QMX+`9wRq$$f~U_y;Ll->P~}8Fwk?#-@BH!a%e~>LrI$Mi8}3cJciM+6Y_X2kU3#G?Q0szytrM4WrmNVE zKYy+i>|-aj!l`Ji@C$4B&z;j%#|7uVil*Uz)zgG@}6<&S6%ffr?3^+QZGnGWn`CRu++_i7gkzmv2pZ(Fk2~(nF=!YnK z89+5ITsbJ?a??l18V>-C2a4Cu7rGJjhMi!4Eg0w9)c}}xArZ$Ae%p`cP6~AzdQ0&Tp{|zHyT%d04OWlp7tacimgiup_XEgOPo(@ zH^^`|ukA@Bem!-;TzFs3vlc9-uIqf}k$~vcae7+6DdR*VEP9PKL-umvT+%mpzSPH=X1l{h1FOq4lPeJCpfU%^a1!CiRLoB%E2Q|9DW(`WdE zC@~rF;!nhBh$E3zL?eN%$moI1IB}x=-KH0*pOrJ8HpLUIgmw{VSl?PGzE3;CO`a0vB1cRd#Y+C84<@Y-a`Gxap!3dn+)u4j;emEx z<@TlRW_^`I=+_*qn)E|aa`p*%bUYcf5&8yQi_OiFV)OGw(0AxRG(&pSQQ9i8zr0pX z%cyjSBs$MJaGsussu3k+b%hYXTX?i(L8(t(3ZaR$jRAGWO81*^TtZt)^ciu@;CvA zW^$S*?T@lS*HaSqf(C2YeQY)3$5Tl{><{!;zGWQP z4j)+rw1vCy>3w<$%ad&=BHXWS8Y3}0bPthVdnxCX27Gp2nX@yjoqRicky*K;CHkEF zw(?cuuO3KL9_47mCgIJ6!$gg%i@`aLC)E3yAe{8ku+|@qVx>eqc24 zTGIp$QjaxSrW-w&mgnpeu~&6mN({J6CieSTdO4CFehx)!H+dd@oy~6UY<|8tXT>;` z1A@%wbsnzGg;%fh-{}-&k_0-()PB91x~v~iKi&?%M(5;5JZy2P&9o^d|2lQUv)Dhp z0W>*ysOTT|NniNME6i63q212)l~4w&BGq@f=H$|kdDe_vPs=bOnioGGtAyv1_6Awv z8Rd7V{E#o@RGX7Q|D~{ zSRdkTZO{K;A={5-i|j_O4#F>%^-@OiW!~+LB3$ey#cyhT;y1Ns%YuT%;PX*Nksia& z6LAYAqN{#ikE#49`*^`?9^w>EXsb9)IfwLVJmX_1qQ}S^u{zi@og+aXv9no`_$}$h z)@|{P^fNe7rQ<0*qO|Y#(%>Oh>H0fdMSrE|_$2_5BhYf*es-9+0Q^eG-Rmpjd<=yyHI$Vdk*z28qEpo&;BJ!;Hft)JNbMBhmPvow+ zQ8u7x2v(YNldWHL(f>F6`x}{IdJX3tOuu-;=*r*o@AE4_m|!9wvxe`4E3$_~#)%E0 zdx@)Y20)3ke@f4;^ZZcUo^Rh z4ahR9MCA2O$~(1Q%$qu8u=d}}2fgnie1J8s<*C`!%z~Gnc^%mhzdew4`NW(pHITUh zsWZo3rzO~*S?jbkS|SU@nN7|j6A!?8=Q|Q%ca$1oh%_Vm_QyO``5}&p-;h;m$Ar@O zRT2nd`K7bLeCA=~VUpd$gZetpkW+C>&i906$q2DB7$bSB)>7z@p3s`av%`vjQD<;{f@=5Y}jE5GHNJA-A5cjKa)~}I>T;Z4VD+GQmPJBJo zjxP)<#vcv&;=}bj0(25NuVTnr9ESIt6~e1-hQlA(9Q0?uswq3>W6H>Z;PqEGjBGab ze#(EVx&3M{wZF-Ca*MBG_INX8fXa-JCn6`rc^q<-Jt1$ej*IL>GEVDsrh0_dKc-o!9Cw57UfP7|pi_8*UKe^0&hmZg^s>~MgSr?&~Cl~Gpd!cJP`2l_dIrpo| zl@2c=fS3P(uAEFXcrYV=HxM%3@2%y=6R5pxHNs2YjBkpZ4APN zbAG+R*}*c2>~MO{^0fz5I^=yCDN#K9Kzz;en?wac^;zHMnt4E{GipvebiSf25NA-b z)gf&1oBBc<3l_#jo2A>yRTW*^oBz%|fw=PNvH&X`GCkH(3!PsKr`?3q!Wv7)i4~*d zPCHjju8%A!xe78+SxNfHUW7}DcwKE|(Rnm}QG(VlDi;#Dndf`clbig%3gs>CAcxex zMLU4RILWp@bchlViBeEfQ4eHS&IC}5NNZG^oZFw>iO6E@qp9M=A7Q&^YXiX`*~--`0WXn9IWFY*JPcD JD=3jo{|8&7qqP74 literal 0 HcmV?d00001 diff --git a/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.psm1 b/uninstall-kb-pswindowsupdate/PSWindowsUpdate/2.2.0.3/PSWindowsUpdate.psm1 new file mode 100644 index 0000000000000000000000000000000000000000..53b05edc817bef74bdba8fa2b5d351e7b9b6228b GIT binary patch literal 35606 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 vNK|MM$8@Pqti?q7Q8`;*@J /Quiet /NoRestart + ``` +- Logs: `C:\Windows\Logs\WindowsUpdate\windowsupdate.log` and `C:\Windows\Logs\CBS\CBS.log`. + diff --git a/uninstall-kb-pswindowsupdate/uninstallKB.ps1 b/uninstall-kb-pswindowsupdate/uninstallKB.ps1 new file mode 100644 index 0000000..7d9b5e3 --- /dev/null +++ b/uninstall-kb-pswindowsupdate/uninstallKB.ps1 @@ -0,0 +1,36 @@ +#Requires -RunAsAdministrator +#Requires -Modules PSWindowsUpdate + +param( + [Parameter(Mandatory)] + [ValidatePattern('^(?i:KB)?\d+$')] + [string]$KB, + [switch]$NoRestart +) + +# Normalize input to "KBxxxxxxx" +if ($KB -match '^\d+$') { $KB = "KB$KB" } + +try { + Import-Module PSWindowsUpdate -ErrorAction Stop + + # Query only installed updates matching the KB + $installed = Get-WindowsUpdate -IsInstalled -KBArticleID $KB -ErrorAction SilentlyContinue + + if (-not $installed) { + Write-Host "Update $KB not found on this system." + return + } + + Write-Host "Found installed update: $KB" + $removeParams = @{ KBArticleID = $KB; Confirm = $false } + if ($NoRestart) { $removeParams['NoRestart'] = $true } + + Write-Host "Uninstalling $KB ..." + Remove-WindowsUpdate @removeParams -ErrorAction Stop + Write-Host "Uninstall command issued for $KB." + if (-not $NoRestart) { Write-Host "A restart may be required." } +} +catch { + Write-Error "Failed to uninstall $KB. $($_.Exception.Message)" +} diff --git a/uninstall-kb-remove-windows-package/readme.md b/uninstall-kb-remove-windows-package/readme.md new file mode 100644 index 0000000..b2b3f5e --- /dev/null +++ b/uninstall-kb-remove-windows-package/readme.md @@ -0,0 +1,19 @@ +# Remove Windows Updates by KB (PowerShell) + +Uninstalls all installed Windows packages whose name matches a given **KB** via DISM PowerShell cmdlets. + +## Usage +```powershell +# List installed packages and filter by KB +Get-WindowsPackage -Online | Where-Object { $_.PackageName -match "KB5032189" } | Select-Object PackageName, State, InstallTime +``` + +```powershell +# Uninstall all packages matching the KB +Remove-Package -KB "KB4589210" +``` + +## Notes & limitations +MSU files: Remove-WindowsPackage removes packages in the image (.cab/package identities), not .msu directly +SSUs can’t be uninstalled: Servicing Stack Updates modify the update stack and are not removable. +After ResetBase: If you ran DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBase, existing update packages can no longer be uninstalled. \ No newline at end of file diff --git a/uninstall-kb-remove-windows-package/remove.ps1 b/uninstall-kb-remove-windows-package/remove.ps1 new file mode 100644 index 0000000..1844592 --- /dev/null +++ b/uninstall-kb-remove-windows-package/remove.ps1 @@ -0,0 +1,33 @@ +function Remove-Package { + param( + [string]$KB + ) + + # Find matching package(s) + $packages = Get-WindowsPackage -Online | Where-Object { $_.PackageName -match $KB } + + if($packages.Count -eq 0) { + Write-Host "No packages found matching $KB." + return + } + + # Display found packages + Write-Host "Packages found matching $KB" + $packages | ForEach-Object { Write-Host $_.PackageName } + + # Uninstall packages + foreach($package in $packages) { + try { + Write-Host "Uninstalling $($package.PackageName)..." + Remove-WindowsPackage -Online -PackageName $package.PackageName -NoRestart -ErrorAction Stop + Write-Host "$($package.PackageName) uninstalled successfully." + } catch { + Write-Error "Failed to uninstall $($package.PackageName). Error: $_" + } + } + + Write-Host "Please restart your computer." +} + +# Example usage +Remove-Package -KB "KB4589210" \ No newline at end of file