PowerShell GPO Reporting: WSUS

In addition to my earlier creations that gives you an inventory of your GPO Deployed Printers and GPP Drive Maps, I’ve now created a similiar script that makes inventory of WSUS settings in all your GPO’s.
This can very much come in handy when having an extensive amount of GPO’s that are controlling WSUS settings (e.g. for different maintenance schedules).

See the example below of the output:
2014-02-05 07-17-52

<#
.SYNOPSIS     
Function that find certain information about all your WSUS related GPO's.
.NOTES     
           File Name: Get-GPOWsusInfo    
           Author   : Johan Dahlbom, johan[at]dahlbom.eu     
           The script are provided “AS IS” with no guarantees, no warranties, and it confer no rights. 
           Blog     : 365lab.net
#>
function Get-GPOWsusInfo {

try
{
Import-Module GroupPolicy -ErrorAction Stop
}
catch
{
throw "Module GroupPolicy not Installed"
}
        $GPO = Get-GPO -All

        foreach ($Policy in $GPO){

                $GPOID = $Policy.Id
                $GPODom = $Policy.DomainName
                $GPODisp = $Policy.DisplayName

                [xml]$xml = Get-GPOReport -Id $GPOID -ReportType xml
                $GPOSec = Get-GPPermissions -All -Guid $GPOID
                $WSUSBase = Get-GPRegistryValue -Guid $GPOID -Key HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate -ErrorAction SilentlyContinue
                $WSUSAU = Get-GPRegistryValue -Guid $GPOID -Key HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\AU   -ErrorAction SilentlyContinue

                    if ($WsusBase) {

                        New-Object PSObject -Property @{
                           	GPOName = $GPODisp
                            GPOLinks = $xml.gpo.Linksto.SOMPath
                            GPOFilter = ($GPOSec | Where-Object {$_.Permission -eq "GpoApply"}).trustee.name
                            ScheduleDay = ($WSUSAU | Where-Object {$_.ValueName -eq "ScheduledInstallDay"}).Value.tostring().Replace("0","0 - Every Day").Replace("1","1 - Sunday").Replace("2","2 - Monday").Replace("3","3 - Tuesday").Replace("4","4 - Wednesday").Replace("5","5 - Thursday").Replace("6","6 - Friday").Replace("7","7 - Saturday")
                            Installtime =  ($WSUSAU | Where-Object {$_.ValueName -eq "ScheduledInstallTime"}).Value.tostring() + ':00'
                            AutoUpdateSetting = ($WSUSAU | Where-Object {$_.ValueName -eq "AUOptions"}).Value.tostring().Replace("2","2 - Notify for download and notify for install").Replace("3","3 - Auto download and notify for install").Replace("4","4 - Auto download and schedule the install").Replace("5","5 - Allow local admin to choose setting")
                            WSUSTargetGroup = ($WSUSBase | Where-Object {$_.ValueName -eq "TargetGroup"}).Value
                            WSUSServer = ($WSUSBase | Where-Object {$_.ValueName -eq "WUServer"}).Value
                        }
                    }

           }
}

Hope you find this useful!
When I find the time I’ll create a more complete set of GPO reporting functions with more functionality than they have today, maybe with help from Ramblingcookiemonster that has extended and created additions to the GP Preferences functions.

Until next time, Happy GPO Reporting!

/Johan

Advertisement

2 thoughts on “PowerShell GPO Reporting: WSUS

  1. Erik

    Also, I couldn’t get the script to work until I # the Function line. But it works great Thanks again!

    Reply
  2. Red Alegre

    This script is AMAZING !!!!!! I have modified it to find other WSUS GPOs even if it doesn’t have a schedule in place ! Thank you so much !!

    function Get-GPOWsusInfo {

    try
    {
    Import-Module GroupPolicy -ErrorAction Stop
    }
    catch
    {
    throw “Module GroupPolicy not Installed”
    }
    $GPO = Get-GPO -All

    foreach ($Policy in $GPO){

    $GPOID = $Policy.Id
    $GPODom = $Policy.DomainName
    $GPODisp = $Policy.DisplayName

    [xml]$xml = Get-GPOReport -Id $GPOID -ReportType xml
    $GPOSec = Get-GPPermissions -All -Guid $GPOID
    $WSUSBase = Get-GPRegistryValue -Guid $GPOID -Key HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate -ErrorAction SilentlyContinue
    $WSUSAU = Get-GPRegistryValue -Guid $GPOID -Key HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\AU -ErrorAction SilentlyContinue

    if (($WSUSBase | Where-Object {$_.ValueName -eq “WUServer”}).Value -and ($WSUSAU | Where-Object {$_.ValueName -eq “ScheduledInstallDay”}).Value -ne $null) {

    New-Object PSObject -Property @{
    GPOName = $GPODisp
    GPOLinks = $xml.gpo.Linksto.SOMPath
    GPOFilter = ($GPOSec | Where-Object {$_.Permission -eq “GpoApply”}).trustee.name
    ScheduleDay = ($WSUSAU | Where-Object {$_.ValueName -eq “ScheduledInstallDay”}).Value.tostring().Replace(“0″,”0 – Every Day”).Replace(“1″,”1 – Sunday”).Replace(“2″,”2 – Monday”).Replace(“3″,”3 – Tuesday”).Replace(“4″,”4 – Wednesday”).Replace(“5″,”5 – Thursday”).Replace(“6″,”6 – Friday”).Replace(“7″,”7 – Saturday”)
    Installtime = ($WSUSAU | Where-Object {$_.ValueName -eq “ScheduledInstallTime”}).Value.tostring() + ‘:00’
    AutoUpdateSetting = ($WSUSAU | Where-Object {$_.ValueName -eq “AUOptions”}).Value.tostring().Replace(“2″,”2 – Notify for download and notify for install”).Replace(“3″,”3 – Auto download and notify for install”).Replace(“4″,”4 – Auto download and schedule the install”).Replace(“5″,”5 – Allow local admin to choose setting”)
    WSUSTargetGroup = ($WSUSBase | Where-Object {$_.ValueName -eq “TargetGroup”}).Value
    WSUSServer = ($WSUSBase | Where-Object {$_.ValueName -eq “WUServer”}).Value
    }
    }
    if (($WSUSBase | Where-Object {$_.ValueName -eq “WUServer”}).Value -and ($WSUSAU | Where-Object {$_.ValueName -eq “ScheduledInstallDay”}).Value -eq $null) {

    New-Object PSObject -Property @{
    GPOName = $GPODisp

    GPOFilter = ($GPOSec | Where-Object {$_.Permission -eq “GpoApply”}).trustee.name

    WSUSTargetGroup = ($WSUSBase | Where-Object {$_.ValueName -eq “TargetGroup”}).Value
    WSUSServer = ($WSUSBase | Where-Object {$_.ValueName -eq “WUServer”}).Value
    }
    }

    }
    }

    ## Gather Info and Display it
    $WSUSInfo = Get-GPOWsusInfo

    $WSUSInfo | Sort-Object -property GPOName | FT GPOName, GPOFilter, WSUSServer, Installtime, ScheduleDay, AutoUpdateSetting, GPOLinks

    Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s