Functions/CatalogItems/Get-RsSubscription.ps1

# Copyright (c) 2016 Microsoft Corporation. All Rights Reserved.
# Licensed under the MIT License (MIT)

function Get-RsSubscription
{
    <#
        .SYNOPSIS
            This script retrieves information about subscriptions for a report.

        .DESCRIPTION
            This script retrieves information about subscriptions for a report.

        .PARAMETER RsItem
            Specify the path to the report.

        .PARAMETER ReportServerUri
            Specify the Report Server URL to your SQL Server Reporting Services Instance.
            Use the "Connect-RsReportServer" function to set/update a default value.

        .PARAMETER ApiVersion
            The version of the API to use, 2010 by default. Sepcifiy '2005' if you need
            to query a Sql Server Reporting Service Instance running a version prior to
            SQL Server 2008 R2.

        .PARAMETER Credential
            Specify the credentials to use when connecting to the Report Server.
            Use the "Connect-RsReportServer" function to set/update a default value.

        .PARAMETER Proxy
            Report server proxy to use.
            Use "New-RsWebServiceProxy" to generate a proxy object for reuse.
            Useful when repeatedly having to connect to multiple different Report Server.

        .EXAMPLE
            Get-RsSubscription -RsItem '/path/to/my/report'
            Description
            -----------
            This command will establish a connection to the Report Server located at http://localhost/reportserver using current user's credentials and retrieve details of subscriptions found at '/path/to/my/report'.

        .EXAMPLE
            Get-RsSubscription -ReportServerUri 'http://remote-machine:8080/reportserver_sql16' -RsItem '/path/to/my/report'
            Description
            -----------
            This command will establish a connection to the Report Server located at http://remote-machine:8080/reportserver_sql16 using current user's credentials and retrieve details of subscriptions found at '/path/to/my/report'.

        .EXAMPLE
            $rsProxy = New-RsWebServiceProxy -ReportServerUri 'http://remote-machine:8080/reportserver_sql16'
            Get-RsSubscription -Proxy $rsProxy -RsItem '/path/to/my/report'
            Description
            -----------
            This command will establish a connection to the Report Server located at http://remote-machine:8080/reportserver_sql16 using current user's credentials and retrieve details of subscriptions found at '/path/to/my/report'.
    #>


    [cmdletbinding()]
    param
    (
        [Alias('Path')]
        [Parameter(Mandatory = $True, ValueFromPipeline = $true)]
        [string[]]
        $RsItem,

        [string]
        $ReportServerUri,

        [ValidateSet('2005','2006','2010')]
        [string]
        $ApiVersion = '2010',

        [System.Management.Automation.PSCredential]
        $Credential,

        $Proxy
    )
    Begin
    {
        $Proxy = New-RsWebServiceProxyHelper -BoundParameters $PSBoundParameters
    }
    Process
    {
        foreach ($item in $RsItem)
        {
            try
            {
                Write-Verbose "Retrieving subscriptions contents..."

                if ($Proxy.Url -match 'ReportService2005.asmx')
                {
                    if ($item -eq '/') { $item = $null }
                    $subscriptions = $Proxy.ListSubscriptions($Item,$null)
                }
                else
                {
                    $subscriptions = $Proxy.ListSubscriptions($Item)
                }

                Write-Verbose "Subscriptions retrieved successfully!"

                $namespace = $proxy.GetType().Namespace
                $DataRetrievalPlanDataType = "$namespace.DataRetrievalPlan"
                $ExtensionSettingsDataType = "$namespace.ExtensionSettings"
                $ActiveStateDataType = "$namespace.ActiveState"

                foreach ($subscription in $subscriptions)
                {
                    $extSettings = $null
                    $DataRetrievalPlan = $null
                    $desc = $null
                    $active = $null
                    $status = $null
                    $eventType = $null
                    $matchData = $null
                    $values = $null
                    $Result = $null

                    try
                    {
                        Write-Verbose "Retrieving subscription properties for $($subscription.SubscriptionID)..."

                        if ($subscription.IsDataDriven)
                        {
                            $null = $Proxy.GetDataDrivenSubscriptionProperties($subscription.SubscriptionID, [ref]$extSettings, [ref]$DataRetrievalPlan, [ref]$desc, [ref]$active, [ref]$status, [ref]$eventType, [ref]$matchData, [ref]$values)
                        }
                        else
                        {
                            $null = $Proxy.GetSubscriptionProperties($subscription.SubscriptionID, [ref]$extSettings, [ref]$desc, [ref]$active, [ref]$status, [ref]$eventType, [ref]$matchData, [ref]$values)
                        }

                        Write-Verbose "Subscription properties for $($subscription.SubscriptionID) retrieved successfully!"

                        #Set ExtensionSetting/s
                        $ExtensionSettings = New-Object $ExtensionSettingsDataType
                        $ExtensionSettings.Extension = $subscription.DeliverySettings.Extension
                        $ExtensionSettings.ParameterValues = $subscription.DeliverySettings.ParameterValues

                        #Set ActiveState
                        $ActiveState = New-Object $ActiveStateDataType
                        $ActiveState.DeliveryExtensionRemoved          = $subscription.Active.DeliveryExtensionRemoved
                        $ActiveState.DeliveryExtensionRemovedSpecified = $subscription.Active.DeliveryExtensionRemovedSpecified
                        $ActiveState.SharedDataSourceRemoved           = $subscription.Active.SharedDataSourceRemoved
                        $ActiveState.SharedDataSourceRemovedSpecified  = $subscription.Active.SharedDataSourceRemovedSpecified
                        $ActiveState.MissingParameterValue             = $subscription.Active.MissingParameterValue
                        $ActiveState.MissingParameterValueSpecified    = $subscription.Active.MissingParameterValueSpecified
                        $ActiveState.InvalidParameterValue             = $subscription.Active.InvalidParameterValue
                        $ActiveState.InvalidParameterValueSpecified    = $subscription.Active.InvalidParameterValueSpecified
                        $ActiveState.UnknownReportParameter            = $subscription.Active.UnknownReportParameter
                        $ActiveState.UnknownReportParameterSpecified   = $subscription.Active.UnknownReportParameterSpecified

                        $Result = @{
                            SubscriptionID        = $subscription.SubscriptionID
                            Owner                 = $subscription.Owner
                            Path                  = $subscription.Path
                            VirtualPath           = $subscription.VirtualPath
                            Report                = $subscription.Report
                            DeliverySettings      = $ExtensionSettings
                            Description           = $subscription.Description
                            Status                = $subscription.Status
                            Active                = $ActiveState
                            LastExecuted          = $subscription.LastExecuted
                            LastExecutedSpecified = $subscription.LastExecutedSpecified
                            ModifiedBy            = $subscription.ModifiedBy
                            ModifiedDate          = $subscription.ModifiedDate
                            EventType             = $subscription.EventType
                            IsDataDriven          = $subscription.IsDataDriven
                            MatchData             = $matchData
                            Values                = $values
                        }

                        if ($subscription.IsDataDriven)
                        {
                            $Result.Add('DataRetrievalPlan',$DataRetrievalPlan)
                        }

                        [pscustomobject]$Result
                    }
                    catch
                    {
                        Write-Error (New-Object System.Exception("Exception while retrieving subscription properties! $($_.Exception.Message)", $_.Exception))
                        Write-Verbose ($subscription | format-list | out-string)
                    }
                }
            }
            catch
            {
                throw (New-Object System.Exception("Exception while retrieving subscription(s)! $($_.Exception.Message)", $_.Exception))
            }
        }
    }
}