Share via


Script: Bulk approve WSUS updates from CSV input file

Hope this script will help someone out there! 

# Script

# Author: Johan Vosloo
# Date: 16-10-2009
# Purpose: Bulk approve updates by specifying the UpdateID, WSUS Group Name and a Computer Name (any computer that is a member of the applicable group).
# Disclaimer: This script is provided as-is without any support. Script was tested on WSUS 3.0 SP1 and using Powershell 1.0. Please test in a test environment before production use.
# Credit: Adapted from https://gallery.technet.microsoft.com/ScriptCenter/en-us/e3b33372-1e7f-41ea-ad83-ecc10ba5f0f6
# CSV Example:
## updateID,grp,cName
## 82aa7a7a-c2c3-47b4-ab32-cb35c0e41ffc,Group2,wsus.labrootad.local
## 82aa7a7a-c2c3-47b4-ab32-cb35c0e41ffc,Group3,wsus.labrootad.local

# Specify path to CSV and ensure CSV is similar to example.
$path = "C:\Temp\Test.csv";

[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null;
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
Import-csv -path $path | foreach `
{
    $groupName = $_.grp;
    $computerName = $_.cName;
    $UId = $_.updateID;
   
    # Use '$false' to return CSV-specified update information only. That is, updates will not be approved.
    $approveUpdates = $true;
    #$approveUpdates = $false;
   
    $group = $null;
    $computer = $wsus.GetComputerTargetByName($computerName);
    $groups = $computer.GetComputerTargetGroups() | foreach `
    {
    If ($_.Name  -eq  $groupName) {$group = $_};
 };
    if ($group -eq $null) {throw new-object System.Exception($computerName + " is not a member of group: " + $groupName)};
   
    # Use UpdateScope to 'filter' the list that will be used to match the CSV-specified UpdateId.
    $updateScope = new-object Microsoft.UpdateServices.Administration.UpdateScope;
    #IncludedInstallationStates [eg. All/Downloaded/Failed/Installed/NotInstalled/InstalledPendingReboot/NotApplicable/Unknown] - https://msdn.microsoft.com/en-us/library/microsoft.updateservices.administration.updateinstallationstates(VS.85).aspx
    $updateScope.IncludedInstallationStates = "All";
    #ApprovedStates [eg. Any/Declined/HasStaleUpdateApprovals/LatestRevisionApproved/NotApproved] - https://msdn.microsoft.com/en-us/library/bb313233(VS.85).aspx
    $updateScope.ApprovedStates = "Any";
   
    $action = [Microsoft.UpdateServices.Administration.UpdateApprovalAction]::Install;
    $updates = $computer.GetUpdateInstallationInfoPerUpdate($updateScope);
    $updates | foreach `
    {
        If ($_.UpdateId -eq $UId)
        {
        $u = $wsus.GetUpdate($_.UpdateId);
        #Properties [Title/State/Etc] - https://msdn.microsoft.com/en-us/library/microsoft.updateservices.administration.iupdate_members(VS.85).aspx
        Write-Host "Processing UpdateID: " $_.UpdateId;
        If ($approveUpdates) {$u.Approve($action,$group) | out-null}
        else {Write-host “Need to approve:" $u.Title};
        };
    };
};