WinUp.ps1
BlueCarbon |
PRO |
07/27/25 12:11:48 PM UTC |
0 ⭐ |
8182 👁️ |
Never ⏰ |
[powershell, Windows Update]
Function Write-Banner
{
[CmdletBinding()]
param (
[Parameter(ValueFromPipeline=$true)]
[String]$Message
)
'#' * ($Message).Length
Write-Host $Message
'#' * ($Message).Length
Write-Host ''
}
$updateSession = new-object -com 'Microsoft.Update.Session'
$UpdateDownloader = $UpdateSession.CreateUpdateDownloader()
$UpdateInstaller = $UpdateSession.CreateUpdateInstaller()
$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
# Find updates AND INCLUDE Drivers
$criteria = "IsInstalled=0 AND IsHidden=0 AND DeploymentAction=*"
$search = $UpdateSearcher.Search(($criteria))
$h1 = 'Category'
$h2 = 'Title'
$h3 = 'Description'
$Catalog=@()
$UpdatesExist = $false
$AvailableUpdates = $Search.Updates
If ($AvailableUpdates.count -gt 0)
{
$UpdatesExist = $true
Foreach ($Update in $AvailableUpdates)
{
$Table = '' | Select-Object $h1,$h2,$h3
$Index = $Update.Categories.Item.count - 1
$Item = $Update.Categories.Item($Index)
$Category = $Item.Name
$Title = $Update.Title
$Table.$h1 = $Category
$Table.$h2 = $Update.Title
$Table.$h3 = $Update.Description
$Catalog += $Table
}
$Group = $Catalog | Group-Object -Property 'Category'
Foreach ($Member in $Group)
{
$Title = $Member.Name
Write-Host "[${Title}]" -ForegroundColor Yellow
$Member.Group | Foreach-Object {
Write-Host ' - ' $_.Title -ForegroundColor Cyan
Write-Host ' ' $_.Description
Write-Host ''
}
Write-Host ''
}
$Time = (Get-Date).ToString('HH:mm:ss')
Write-Host "[${Time}] Downloading Updates ..."
$UpdateDownloader.Updates = $AvailableUpdates
# Commented for TESTING. Uncomment to download the updates.
#$UpdateDownloader.Download()
$Time = (Get-Date).ToString('HH:mm:ss')
Write-Host "[${Time}] Installing Updates ..."
$UpdateInstaller.Updates = $UpdateDownloader.Updates
# Commented for TESTING. Uncomment to install the updates.
#$UpdateInstaller.Install()
}
if ( -not ($UpdatesExist) )
{
Write-Banner 'No new updates available'
}
if ($UpdateInstaller.RebootRequiredBeforeInstallation)
{
Write-Banner 'Reboot Required Before Installation'
}
$SystemInfo = New-Object -com 'Microsoft.Update.SystemInfo'
if ($SystemInfo.RebootRequired)
{
Write-Banner 'Reboot Required'
# Optionally include a command to restart with a delay of X number of seconds
# &cmd /C "shutdown -r -f -t X"
}
<#
AVAILABLE OPTIONS FOR SEARCH CRITERIA
Note: The default search criteria is, "IsInstalled=0 and IsHidden=0"
Criterion: Type
Type: String
Acceptable operators: =,!= (equals, not equals)
Finds updates of a specific type, such as "'Driver'" and "'Software'".
For example, you may exclude drivers with "Type='Software' AND Type!='Driver'"
You may also search for drivers only by specifying "Type='Driver'" and not including 'Software'
Criterion: DeploymentAction
Type: String
Acceptable Operators: =
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'" finds updates that are deployed for uninstallation on a destination computer.
"DeploymentAction=*" finds updates that are deployed for installation and uninstallation on a destination computer.
If this criterion is not explicitly specified, each group of criteria that is joined to an AND operator implies "DeploymentAction='Installation'".
"DeploymentAction='Uninstallation'" depends on the other query criteria.
Criterion: IsAssigned
Type: int(bool)
Acceptable Operators: =
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.
Criterion: BrowseOnly
Type: int(bool)
Acceptable Operators: =
"BrowseOnly=1" finds updates that are considered optional.
"BrowseOnly=0" finds updates that are not considered optional.
Criterion: AutoSelectOnWebSites
Type: int(bool)
Acceptable Operators: =
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.
Criterion: UpdateID
Type: string(UUID)
Acceptable Operators: =
Acceptable operators: =,!= (equals, not equals)
Finds updates for which the value of the UpdateIdentity.UpdateID property matches the specified value. Can be used with the != operator to find all the updates that do not have an UpdateIdentity.UpdateID of the specified value.
For example, "UpdateID='12345678-9abc-def0-1234-56789abcdef0'" finds updates for UpdateIdentity.UpdateID that equal 12345678-9abc-def0-1234-56789abcdef0.
For example, "UpdateID!='12345678-9abc-def0-1234-56789abcdef0'" finds updates for UpdateIdentity.UpdateID that are not equal to 12345678-9abc-def0-1234-56789abcdef0.
Note A RevisionNumber clause can be combined with an UpdateID clause that contains an = (equal) operator. However, the RevisionNumber clause cannot be combined with an UpdateID clause that contains the != (not-equal) operator.
For example, "UpdateID='12345678-9abc-def0-1234-56789abcdef0' and RevisionNumber=100" can be used to find the update for UpdateIdentity.UpdateID that equals 12345678-9abc-def0-1234-56789abcdef0 and whose UpdateIdentity.RevisionNumber equals 100.
Criterion: RevisionNumber
Type: int
Acceptable Operators: =
Finds updates for which the value of the UpdateIdentity.RevisionNumber property matches the specified value.
For example, "RevisionNumber=2" finds updates where UpdateIdentity.RevisionNumber equals 2.
This criterion must be combined with the UpdateID property.
Criterion: CategoryIDs
Type: string(UUID)
Acceptable Operators: CONTAINS
Finds updates that belong to a specified category.
Application 5C9376AB-8CE6-464A-B136-22113DD69801
Connectors 434DE588-ED14-48F5-8EED-A15E09A991F6
CriticalUpdates E6CF1350-C01B-414D-A61F-263D14D133B4
DefinitionUpdates E0789628-CE08-4437-BE74-2495B842F43B
DeveloperKits E140075D-8433-45C3-AD87-E72345B36078
Drivers EBFC1FC5-71A4-4F7B-9ACA-3B9A503104A0
FeaturePacks B54E7D24-7ADD-428F-8B75-90A396FA584F
Guidance 9511D615-35B2-47BB-927F-F73D8E9260BB
HotFix 5EAEF3E6-ABB0-4192-9B26-0FD955381FA9
SecurityUpdates 0FA1201D-4330-4FA8-8AE9-B877473B6441
ServicePacks 68C5B0A3-D1A6-4553-AE49-01D3A7827828
ThirdParty 871A0782-BE12-A5C4-C57F-1BD6D9F7144E
Tools B4832BD8-E735-4761-8DAF-37F882276DAB
UpdateRollups 28BC880E-0592-4CBF-8F95-C79B17911D5F
Updates CD5FFD1E-E932-4E3A-BF74-18BF0B1BBD83
Upgrades 3689BDC8-B205-4AF4-8D4A-A63924C5E9D5
For example, "CategoryIDs contains 'B54E7D24-7ADD-428F-8B75-90A396FA584F'" finds Feature Packs
Criterion: IsInstalled
Type: int(bool)
Acceptable Operators: =
Finds updates that are installed on the destination computer.
"IsInstalled=1" finds updates that are installed on the destination computer.
"IsInstalled=0" finds updates that are not installed on the destination computer.
Criterion: IsHidden
Type: int(bool)
Acceptable Operators: =
Finds updates that are marked as hidden on the destination computer.
"IsHidden=1" finds updates that are marked as hidden on a destination computer. When you use this clause, you can set the UpdateSearcher.IncludePotentiallySupersededUpdates property to VARIANT_TRUE so that a search returns the hidden updates. The hidden updates might be superseded by other updates in the same results.
"IsHidden=0" finds updates that are not marked as hidden. If the UpdateSearcher.IncludePotentiallySupersededUpdates property is set to VARIANT_FALSE, it is better to include that clause in the search filter string so that the updates that are superseded by hidden updates are included in the search results. VARIANT_FALSE is the default value.
Criterion: IsPresent
Type: int(bool)
Acceptable Operators: =
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.
Criterion: RebootRequired
Type: int(bool)
Acceptable Operators: =
Finds updates that require a computer to be restarted to complete an installation or uninstallation.
"RebootRequired=1" finds updates that require a computer to be restarted to complete an installation or uninstallation.
"RebootRequired=0" finds updates that do not require a computer to be restarted to complete an installation or uninstallation.
Display all applicable updates, even those superseded by newer updates
$UpdateSearcher.IncludePotentiallySupersededUpdates = $true
Display ALL hidden updates you must include superseded and specify the IsHidden Criteria
$UpdateSearcher.IncludePotentiallySupersededUpdates = $true
( IsHidden = 1 )
Example criteria: Find updates that are NOT installed and NOT marked as hidden
$criteria = "IsInstalled=0 and IsHidden=0"
Find updates and EXCLUDE Drivers
$criteria = "IsInstalled=0 AND IsHidden=0 AND Type='Software' AND DeploymentAction=*"
Find updates and limit search to FeaturePacks only
$criteria = "IsInstalled=0 AND IsHidden=0 AND DeploymentAction=* AND CategoryIDs contains 'B54E7D24-7ADD-428F-8B75-90A396FA584F'"
You can also include 'or' as an operator to create multiple query types
$criteria = "IsInstalled=0 and DeploymentAction='Installation' or IsPresent=1 and DeploymentAction='Uninstallation' or IsInstalled=1 and DeploymentAction='Installation' and RebootRequired=1 or IsInstalled=0 and DeploymentAction='Uninstallation' and RebootRequired=1"
#>
Comments
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|0 👍
/0 👎