functions/Get-AzSRUpdateDeployment.ps1

<#
.SYNOPSIS
    Get one or all Azure Automation Update Deployment Configurations
 
.DESCRIPTION
    Get one or all Azure Automation Update Deployment Configurations
     
    https://docs.microsoft.com/en-us/azure/templates/microsoft.automation/automationaccounts/softwareupdateconfigurations
 
.PARAMETER AutomationAccountResourceId
    The Azure Resource Id of the Automation Account
 
.PARAMETER UpdateScheduleName
    The Name of the Update Deployment. If none is specified all are returned
 
.EXAMPLE
    Get-AzureRmOperationalInsightsWorkspace | Get-AzSRLogAnalyticsLinkedAutomationAccount | Get-AzSRUpdateDeployment
 
.NOTES
    Copyright: (c) 2018 Fabian Bader
    License: MIT https://opensource.org/licenses/MIT
#>

function Get-AzSRUpdateDeployment {
    [CmdletBinding()]
    param (
        [Alias('resourceId')]
        [Parameter(Mandatory = $true,
            ValueFromPipelineByPropertyName = $true)]
        [ValidateScript(
            {
                if ($_ -match "subscriptions\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\/resourcegroups\/[\w\d-]+\/providers\/microsoft\.Automation\/automationAccounts\/[\w|()-]+$" ) {
                    $true
                } else {
                    throw "Not a valid 'microsoft.RecoveryServices/vaults' URI"
                }
            }
        )]
        [string]$AutomationAccountResourceId,
        [Parameter(Mandatory = $false)]
        [string]$UpdateScheduleName
    )

    Begin {
        #region Get AccessToken
        try {
            $AccessToken = Get-AzureRmCachedAccessToken
            $LoginHeader = @{
                'authorization' = "Bearer $AccessToken"
            }
        } catch {
            throw $($_.Exception.Message)
        }
        #endregion
    }
    Process {

        # Escape characters in schedule name
        if ([string]::IsNullOrWhiteSpace($UpdateScheduleName)) {
            $uri = "https://management.azure.com/$AutomationAccountResourceId/softwareUpdateConfigurations?api-version=2017-05-15-preview"
        } else {
            $EscapedUpdateScheduleName = [uri]::EscapeDataString($UpdateScheduleName)
            $uri = "https://management.azure.com/$AutomationAccountResourceId/softwareUpdateConfigurations/$($EscapedUpdateScheduleName)?api-version=2017-05-15-preview"
        }

        $params = @{
            ContentType = 'application/x-www-form-urlencoded'
            Headers     = $LoginHeader
            Method      = 'Get'
            URI         = $uri
            Verbose     = $false
        }

        $Response = Invoke-RestMethod @params
        if ( "Value" -in $Response.PSobject.Properties.name ) {
            # Multiple returns
            $Responses = $Response.Value
        } else {
            # Only one return
            $Responses = $Response
        }
        $Responses | ForEach-Object {
            #region Property conversion
            if ($_.properties.scheduleInfo.startTime) {
                $scheduleInfoStartTime = (Get-Date $_.properties.scheduleInfo.startTime)
            } else {
                $scheduleInfoStartTime = $null
            }
            if ($_.properties.scheduleInfo.expiryTime) {
                if ( $_.properties.scheduleInfo.expiryTime -match "^9999-12-31" ) {
                    $scheduleInfoExpiryTime = $null
                } else {
                    $scheduleInfoExpiryTime = (Get-Date $_.properties.scheduleInfo.expiryTime -ErrorAction SilentlyContinue)
                }
            } else {
                $scheduleInfoExpiryTime = $null
            }
            if ($_.properties.scheduleInfo.nextRun) {
                $scheduleInfoNextRun = (Get-Date $_.properties.scheduleInfo.nextRun)
            } else {
                $scheduleInfoNextRun = $null
            }
            if ($_.properties.scheduleInfo.creationTime) {
                $scheduleInfoCreationTime = (Get-Date $_.properties.scheduleInfo.creationTime)
            } else {
                $scheduleInfoCreationTime = $null
            }
            if ($_.properties.scheduleInfo.lastModifiedTime) {
                $scheduleInfoLastModifiedTime = (Get-Date $_.properties.scheduleInfo.lastModifiedTime)
            } else {
                $scheduleInfoLastModifiedTime = $null
            }
            if ($_.properties.creationTime) {
                $creationTime = (Get-Date $_.properties.creationTime)
            } else {
                $creationTime = $null
            }
            if ($_.properties.lastModifiedTime) {
                $lastModifiedTime = (Get-Date $_.properties.lastModifiedTime)
            } else {
                $lastModifiedTime = $null
            }
            if ($_.properties.error) {
                $error = @{
                    code    = $_.properties.error.code
                    message = $_.properties.error.message
                }
            } else {
                $error = $null
            }
            if ($_.properties.updateConfiguration.operatingSystem -eq "Windows") {
                $windowsUpdateConfiguration = @{
                    includedUpdateClassifications = $_.properties.updateConfiguration.windows.includedUpdateClassifications
                    excludedKbNumbers             = $_.properties.updateConfiguration.windows.excludedKbNumbers
                    includedKbNumbers             = $_.properties.updateConfiguration.windows.includedKbNumbers
                    rebootSetting                 = $_.properties.updateConfiguration.windows.rebootSetting
                    IsInvalidKbNumbers            = $_.properties.updateConfiguration.windows.IsInvalidKbNumbers
                }
                $linuxUpdateConfiguration = $null
            } elseif ($_.properties.updateConfiguration.operatingSystem -eq "Linux ") {
                $windowsUpdateConfiguration = $null
                $linuxUpdateConfiguration = @{
                    includedUpdateClassifications = $_.properties.updateConfiguration.linux.includedPackageClassifications
                    excludedKbNumbers             = $_.properties.updateConfiguration.linux.excludedPackageNameMasks
                    includedKbNumbers             = $_.properties.updateConfiguration.linux.includedPackageNameMasks
                    rebootSetting                 = $_.properties.updateConfiguration.linux.rebootSetting
                    IsInvalidKbNumbers            = $_.properties.updateConfiguration.linux.IsInvalidPackageNameMasks
                }
            } else {
                $windowsUpdateConfiguration = $null
                $linuxUpdateConfiguration = $null
            }
            #endregion
            New-Object psobject -Property @{
                id                  = $_.id
                Name                = $_.name
                updateConfiguration = @{
                    operatingSystem       = $_.properties.updateConfiguration.operatingSystem
                    windows               = $windowsUpdateConfiguration
                    linux                 = $linuxUpdateConfiguration
                    duration              = $_.properties.updateConfiguration.duration
                    azureVirtualMachines  = $_.properties.updateConfiguration.azureVirtualMachines
                    nonAzureComputerNames = $_.properties.updateConfiguration.nonAzureComputerNames
                }
                scheduleInfo        = @{
                    description             = $_.properties.scheduleInfo.description
                    startTime               = $scheduleInfoStartTime
                    startTimeOffsetMinutes  = $_.properties.scheduleInfo.startTimeOffsetMinutes
                    expiryTime              = $scheduleInfoExpiryTime
                    expiryTimeOffsetMinutes = $_.properties.scheduleInfo.expiryTimeOffsetMinutes
                    isEnabled               = $_.properties.scheduleInfo.isEnabled
                    nextRun                 = $scheduleInfoNextRun
                    nextRunOffsetMinutes    = $_.properties.scheduleInfo.nextRunOffsetMinutes
                    interval                = $_.properties.scheduleInfo.interval
                    frequency               = $_.properties.scheduleInfo.frequency
                    creationTime            = $scheduleInfoCreationTime
                    lastModifiedTime        = $scheduleInfoLastModifiedTime
                    timeZone                = $_.properties.scheduleInfo.timeZone
                    advancedSchedule        = $_.properties.scheduleInfo.advancedSchedule
                }
                provisioningState   = $_.properties.provisioningState
                createdBy           = $_.properties.createdBy
                error               = $error
                tasks               = $_.properties.tasks
                creationTime        = $creationTime
                lastModifiedBy      = $_.properties.lastModifiedBy
                lastModifiedTime    = $lastModifiedTime
            }
        }
    }
}
New-Alias -name Get-AzSRUpdateSchedule -value Get-AzSRUpdateDeployment