Управление владельцами подписок и запуск подписки — PowerShell

Область применения: SQL Server 2016 (13.x) Reporting Services и более поздних версий SharePoint

Начиная с SQL Server 2008 R2 (10.50.x) Reporting Services, вы можете программно передать владение подпиской служб Reporting Services от одного пользователя к другому. В этой статье представлено несколько сценариев Windows PowerShell, которые можно использовать для изменения или простого перечисления владения подпиской. В каждом примере содержится образец синтаксиса для собственного режима и режима SharePoint. После изменения владельца подписки подписка будет выполняться в контексте безопасности нового владельца и пользователя! Поле UserID в отчете отображает значение нового владельца. Дополнительные сведения об объектной модели вызова примеров PowerShell см. в статье ChangeSubscriptionOwner.

Содержание этой статьи

Использование скриптов

Разрешения

В этом разделе приводится сводка по уровням разрешений, необходимым для использования каждого метода Reporting Services в собственном режиме и в режиме интеграции с SharePoint. В сценариях в этой статье используются следующие методы Служб Reporting Services:

Собственный режим.

  • Список подписок: перечисление ReportOperation в отчете и пользователь является владельцем подписки) OR ReadAnySubscription.

  • Изменение подписок: пользователь должен состоять в группе BUILTIN\Administrators

  • Список дочерних элементов: ReadProperties для элемента

  • Вызов события: GenerateEvents (System)

Режим интеграции с SharePoint:

  • Вывод списка подписок: ManageAlerts ИЛИ CreateAlerts в отчете И пользователь является владельцем подписки и подписка является подпиской по времени.

  • Изменение подписок: ManageWeb

  • Список дочерних элементов: ViewListItems

  • Вызов события: ManageWeb

Дополнительные сведения см. в статье "Сравнение ролей и задач в службах Reporting Services" с группами и разрешениями SharePoint.

Использование скрипта

Создание файлов скрипта (PS1)

  1. Создайте папку с именем c:\scripts. Если выбирается другая папка, измените имя папки, используемое в конструкциях синтаксиса командной строки в примере.

  2. Для каждого скрипта создайте текстовый файл и сохраните файлы в папку c:\scripts. При создании .ps1 файлов используйте имя из каждого примера синтаксиса командной строки.

  3. Откройте окно командной строки с правами администратора.

  4. Запустите каждый файл скрипта с помощью примера синтаксиса командной строки, предоставленного в каждом примере.

Тестовые среды

Скрипты, описанные в этой статье, были протестированы в PowerShell версии 3 и с помощью следующих версий служб Reporting Services:

  • SQL Server 2014 (12.x)

  • SQL Server 2012 (11.x)

  • SQL Server 2008 R2 (10.50.x)

Скрипт: вывод списка владельцев всех подписок

Этот скрипт выводит список всех подписок на одной сайте. С помощью этого скрипта можно проверить подключение или проверить путь к отчету и ИД подписки для использования в других скриптах. Этот скрипт также полезен для аудита существующих подписок и владельцев.

Синтаксис собственного режима:

powershell c:\scripts\ListAll_SSRS_Subscriptions.ps1 "[server]/reportserver" "/"  

Синтаксис режима SharePoint:

powershell c:\scripts\ListAll_SSRS_Subscriptions.ps1 "[server]/_vti_bin/reportserver" "https://[server]"  

Script:

# Parameters  
#    server   - server and instance name (e.g. myserver/reportserver or myserver/reportserver_db2)  
  
Param(  
    [string]$server,  
    [string]$site  
   )  
  
$rs2010 += New-WebServiceProxy -Uri "https://$server/ReportService2010.asmx" -Namespace SSRS.ReportingService2010 -UseDefaultCredential ;  
$subscriptions += $rs2010.ListSubscriptions($site); # use "/" for default native mode site  
  
Write-Host " "  
Write-Host "----- $server's Subscriptions: "  
$subscriptions | select Path, report, Description, Owner, SubscriptionID, lastexecuted, Status  

Совет

Чтобы проверить URL-адреса сайтов в режиме SharePoint, воспользуйтесь командлетом SharePoint Get-SPSite. Дополнительные сведения см. в статье Get-SPSite.

Скрипт: вывод списка подписок, принадлежащих конкретному пользователю

Этот скрипт перечисляет все подписки, принадлежащие конкретному пользователю. С помощью этого скрипта можно проверить подключение или проверить путь к отчету и ИД подписки для использования в других скриптах. Этот скрипт полезен, когда кто-то в вашей организации покидает, и вы хотите проверить, какие подписки они принадлежат. С помощью скрипта можно изменить владельца или удалить подписку.

Синтаксис собственного режима:

powershell c:\scripts\ListAll_SSRS_Subscriptions4User.ps1 "[Domain]\[user]" "[server]/reportserver" "/"  

Синтаксис режима SharePoint:

powershell c:\scripts\ListAll_SSRS_Subscriptions4User.ps1 "[Domain]\[user]"  "[server]/_vti_bin/reportserver" "https://[server]"  

Script:

# Parameters:  
#    currentOwner - DOMAIN\USER that owns the subscriptions you wish to change  
#    server        - server and instance name (e.g. myserver/reportserver or myserver/reportserver_db2)  
#    site        - use "/" for default native mode site  
Param(  
    [string]$currentOwner,  
    [string]$server,  
    [string]$site  
)  
  
$rs2010 = New-WebServiceProxy -Uri "https://$server/ReportService2010.asmx" -Namespace SSRS.ReportingService2010 -UseDefaultCredential ;  
$subscriptions += $rs2010.ListSubscriptions($site);  
  
Write-Host " "  
Write-Host " "  
Write-Host "----- $currentOwner's Subscriptions: "  
$subscriptions | select Path, report, Description, Owner, SubscriptionID, lastexecuted,Status | where {$_.owner -eq $currentOwner}  

Скрипт: смена владельца всех подписок, принадлежащих конкретному пользователю

Этот скрипт меняет владельца подписок, принадлежащих конкретному пользователю параметр нового владельца.

Синтаксис собственного режима:

powershell c:\scripts\ChangeALL_SSRS_SubscriptionOwner.ps1 "[Domain]\current owner]" "[Domain]\[new owner]" "[server]/reportserver"  

Синтаксис режима SharePoint:

powershell c:\scripts\ChangeALL_SSRS_SubscriptionOwner.ps1 "[Domain]\{current owner]" "[Domain]\[new owner]" "[server]/_vti_bin/reportserver"  

Script:

# Parameters:  
#    currentOwner - DOMAIN\USER that owns the subscriptions you wish to change  
#    newOwner      - DOMAIN\USER that will own the subscriptions you wish to change  
#    server        - server and instance name (e.g. myserver/reportserver, myserver/reportserver_db2, myserver/_vti_bin/reportserver)
  
Param(  
    [string]$currentOwner,  
    [string]$newOwner,  
    [string]$server  
)  
  
$rs2010 = New-WebServiceProxy -Uri "https://$server/ReportService2010.asmx" -Namespace SSRS.ReportingService2010 -UseDefaultCredential ;  
$items = $rs2010.ListChildren("/", $true);  
  
$subscriptions = @();  
  
ForEach ($item in $items)  
{  
    if ($item.TypeName -eq "Report")  
    {  
        $curRepSubs = $rs2010.ListSubscriptions($item.Path);  
        ForEach ($curRepSub in $curRepSubs)  
        {  
            if ($curRepSub.Owner -eq $currentOwner)  
            {  
                $subscriptions += $curRepSub;  
            }  
        }  
    }  
}  
  
Write-Host " "  
Write-Host " "  
Write-Host -foregroundcolor "green" "-----  $currentOwner's Subscriptions changing ownership to $newOwner : "  
$subscriptions | select SubscriptionID, Owner, Path, Description,  Status  | format-table -AutoSize  
  
ForEach ($sub in $subscriptions)  
{  
    $rs2010.ChangeSubscriptionOwner($sub.SubscriptionID, $newOwner);  
}  
  
$subs2 = @();  
  
ForEach ($item in $items)  
{  
    if ($item.TypeName -eq "Report")  
    {  
        $subs2 += $rs2010.ListSubscriptions($item.Path);  
    }  
}  

Скрипт: вывод списка всех подписок, связанных с конкретным отчетом

Этот скрипт перечисляет все подписки, связанные с конкретным отчетом. В синтаксисе пути к отчету в режиме SharePoint требуется использовать полный URL-адрес. В примерах синтаксиса используется имя отчета "только заголовок", которое содержит пробел и поэтому требует одинарных кавычки вокруг имени отчета.

Синтаксис собственного режима:

powershell c:\scripts\List_SSRS_One_Reports_Subscriptions.ps1 "[server]/reportserver" "'/reports/title only'" "/"  

Синтаксис режима SharePoint:

powershell c:\scripts\List_SSRS_One_Reports_Subscriptions.ps1 "[server]/_vti_bin/reportserver"  "'https://[server]/shared documents/title only.rdl'" "https://[server]"  

Script:

# Parameters:  
#    server      - server and instance name (e.g. myserver/reportserver or myserver/reportserver_db2)  
#    reportpath  - path to report in the report server, including report name e.g. /reports/test report >> pass in  "'/reports/title only'"  
#    site        - use "/" for default native mode site  
Param  
(  
      [string]$server,  
      [string]$reportpath,  
      [string]$site  
)  
  
$rs2010 = New-WebServiceProxy -Uri "https://$server/ReportService2010.asmx" -Namespace SSRS.ReportingService2010 -UseDefaultCredential ;  
$subscriptions += $rs2010.ListSubscriptions($site);  
  
Write-Host " "  
Write-Host " "  
Write-Host "----- $reportpath 's Subscriptions: "  
$subscriptions | select Path, report, Description, Owner, SubscriptionID, lastexecuted,Status | where {$_.path -eq $reportpath}  

Скрипт: смена владельца конкретной подписки

Этот сценарий меняет владельца конкретной подписки. Вы можете определить подписку по идентификатору подписки, передаваемой в скрипт. Чтобы определить правильный SubscriptionID, можно воспользоваться одним из скриптов вывода списка подписок.

Синтаксис собственного режима:

powershell c:\scripts\Change_SSRS_Owner_One_Subscription.ps1 "[Domain]\[new owner]" "[server]/reportserver" "/" "ac5637a1-9982-4d89-9d69-a72a9c3b3150"  

Синтаксис режима SharePoint:

powershell c:\scripts\Change_SSRS_Owner_One_Subscription.ps1 "[Domain]\[new owner]" "[server]/_vti_bin/reportserver" "https://[server]" "9660674b-f020-453f-b1e3-d9ba37624519"  

Script:

# Parameters:  
#    newOwner       - DOMAIN\USER that will own the subscriptions you wish to change  
#    server         - server and instance name (e.g. myserver/reportserver or myserver/reportserver_db2)  
#    site        - use "/" for default native mode site  
#    subscriptionID - guid for the single subscription to change  
  
Param(  
    [string]$newOwner,  
    [string]$server,  
    [string]$site,  
    [string]$subscriptionid  
   )  
$rs2010 = New-WebServiceProxy -Uri "https://$server/ReportService2010.asmx" -Namespace SSRS.ReportingService2010 -UseDefaultCredential;  
  
$subscription += $rs2010.ListSubscriptions($site) | where {$_.SubscriptionID -eq $subscriptionid};  
  
Write-Host " "  
Write-Host "----- $subscriptionid's Subscription properties: "  
$subscription | select Path, report, Description, SubscriptionID, Owner, Status  
  
$rs2010.ChangeSubscriptionOwner($subscription.SubscriptionID, $newOwner)  
  
#refresh the list  
$subscription = $rs2010.ListSubscriptions($site) | where {$_.SubscriptionID -eq $subscriptionid}; # use "/" for default native mode site  
Write-Host "----- $subscriptionid's Subscription properties: "  
$subscription | select Path, report, Description, SubscriptionID, Owner, Status  

Скрипт: запуск (вызов) одной подписки

Этот скрипт запускает определенную подписку с помощью метода FireEvent. Скрипт немедленно запускает подписку независимо от расписания, настроенного для подписки. EventType сопоставляется с известным набором событий, определенных в файле конфигурации сервера отчетов rsreportserver.config. Сценарий использует следующий тип события для стандартных подписок:

<Event>

<Type>TimedSubscription</Type>

</Event>

Дополнительные сведения о файле конфигурации см . в файле конфигурации RsReportServer.config.

Скрипт включает логикуStart-Sleep -s 6 задержки "", поэтому после срабатывания события время, чтобы обновленное состояние было доступно с помощью метода ListSubscription.

Синтаксис собственного режима:

powershell c:\scripts\FireSubscription.ps1 "[server]/reportserver" $null "70366e82-2d3c-4edd-a216-b97e51e26de9"  

Синтаксис режима SharePoint:

powershell c:\scripts\FireSubscription.ps1 "[server]/_vti_bin/reportserver" "https://[server]" "c3425c72-580d-423e-805a-41cf9799fd25"  

Script:

  
# Parameters  
#    server         - server and instance name (e.g. myserver/reportserver or myserver/reportserver_db2)  
#    site           - use $null for a native mode server  
#    subscriptionid - subscription guid  
  
Param(  
  [string]$server,  
  [string]$site,  
  [string]$subscriptionid  
  )  
  
$rs2010 = New-WebServiceProxy -Uri "https://$server/ReportService2010.asmx" -Namespace SSRS.ReportingService2010 -UseDefaultCredential ;  
#event type is case sensative to what is in the rsreportserver.config  
$rs2010.FireEvent("TimedSubscription",$subscriptionid,$site)  
  
Write-Host " "  
Write-Host "----- Subscription ($subscriptionid) status: "  
#get list of subscriptions and filter to the specific ID to see the Status and LastExecuted  
Start-Sleep -s 6 # slight delay in processing so ListSubscription returns the updated Status and LastExecuted  
$subscriptions = $rs2010.ListSubscriptions($site);   
$subscriptions | select Status, Path, report, Description, Owner, SubscriptionID, EventType, lastexecuted | where {$_.SubscriptionID -eq $subscriptionid}  
  

Метод ReportingService2010.ListSubscriptions
Метод ReportingService2010.ChangeSubscriptionOwner
ReportingService2010.ListChildren
ReportingService2010.FireEvent