Вот некоторая информация о решении, которое я в итоге использовал, на случай, если кому-то еще понадобится сделать то же самое.Это работает очень хорошо.
Первый подход, который работал, заключался в создании библиотеки DLL для использования скриптом Powershell.Это работало нормально, но это вызывает две проблемы.Во-первых, ваш скрипт имел для работы с DLL.Во-вторых, эта DLL была привязана к определенному серверу SSRS.Чтобы получить доступ к другому серверу, вам пришлось использовать несколько библиотек DLL.
В конце концов я вернулся к использованию веб-прокси.Ключевым моментом здесь является использование пространств имен, чтобы вы могли создать экземпляр объекта ParameterValue.Вот код:
# Create a proxy to the SSRS server and give it the namespace of 'RS' to use for
# instantiating objects later. This class will also be used to create a report
# object.
$reportServerURI = "http://<SERVER>/ReportServer/ReportExecution2005.asmx?WSDL"
$RS = New-WebServiceProxy -Class 'RS' -NameSpace 'RS' -Uri $reportServerURI -UseDefaultCredential
$RS.Url = $reportServerURI
# Set up some variables to hold referenced results from Render
$deviceInfo = "<DeviceInfo><NoHeader>True</NoHeader></DeviceInfo>"
$extension = ""
$mimeType = ""
$encoding = ""
$warnings = $null
$streamIDs = $null
# Next we need to load the report. Since Powershell cannot pass a null string
# (it instead just passses ""), we have to use GetMethod / Invoke to call the
# function that returns the report object. This will load the report in the
# report server object, as well as create a report object that can be used to
# discover information about the report. It's not used in this code, but it can
# be used to discover information about what parameters are needed to execute
# the report.
$reportPath = "/PathTo/Report"
$Report = $RS.GetType().GetMethod("LoadReport").Invoke($RS, @($reportPath, $null))
# Report parameters are handled by creating an array of ParameterValue objects.
$parameters = @()
$parameters += New-Object RS.ParameterValue
$parameters[0].Name = "Parameter 1"
$parameters[0].Value = "Value"
$parameters += New-Object RS.ParameterValue
$parameters[1].Name = "Parameter 2"
$parameters[1].Value = "Value"
# Add the parameter array to the service. Note that this returns some
# information about the report that is about to be executed.
$RS.SetExecutionParameters($parameters, "en-us") > $null
# Render the report to a byte array. The first argument is the report format.
# The formats I've tested are: PDF, XML, CSV, WORD (.doc), EXCEL (.xls),
# IMAGE (.tif), MHTML (.mhtml).
$RenderOutput = $RS.Render('PDF',
$deviceInfo,
[ref] $extension,
[ref] $mimeType,
[ref] $encoding,
[ref] $warnings,
[ref] $streamIDs
)
# Convert array bytes to file and write
$Stream = New-Object System.IO.FileStream("output.pdf"), Create, Write
$Stream.Write($RenderOutput, 0, $RenderOutput.Length)
$Stream.Close()
Кажется, довольно легко, и это так.Этот метод работает исключительно хорошо и является тем методом, который я сейчас использую для отображения и отправки по электронной почте запланированных отчетов, поскольку он обеспечивает гораздо большую гибкость, чем встроенное планирование SSRS.Кроме того, это относительно быстро.Один из сценариев, которые я использую для отправки отчетов, может обрабатывать и отправлять около 20-30 отчетов в минуту.