SSRSレポートを展開するスクリプト

多くのプロジェクトでは、アプリケーションのサーバー側を更新するインストールスクリプトまたはパッケージが必要です。 その必要性は主に、開発者から本番サーバーへの直接アクセスの欠如によるものです。

スクリプト形式のインストーラーは、サーバー(RDP)に明示的にログインせずにインストールするのに最適です。 また、スクリプトは単一のブートローダーとして実行でき、残りは実行されます。 現在のプロジェクトでは、内部ビルドサーバーのみにPsGet [1]のようなものを実装しました。

アプリケーションは大きく、いくつかのコンポーネントで構成されています。そのうちの1つは、 SSRSに基づいて作成されたレポートモジュールです。



レポートサーバーを管理するために、Microsoftは開発者にReportingService2005.asmx Webサービスを提供しました[2]



プリセット



レポートサーバーの初期インストールと構成は、開発者の責任ではなく、特定の責任を持つチームによって実行されます。 また、データソースを作成しません。 機密情報(接続パスワードなど)が含まれている場合があります。

その結果、上記の設定、およびスクリプトへのアクセスの配布を行う必要はありません。 レポート自体を追加および更新するだけです。



サービスへの接続



PowerShell 2.0は、New-WebServiceProxyコマンド[3]を使用して、Webサービスを操作するためのプロキシを作成する機能を提供します。

WSDL上のサービスの説明へのパスを示すだけで十分です[4] 。 Windows認証を使用しているため、接続ではキーUseDefaultCredentialを指定します。 サービスプロキシ自体で、認証方法も指定する必要があります。

function Connect-ReportingService([string]$ssrsHost) { $reportingServiceUrl = $ssrsHost + "ReportService2005.asmx?wsdl" $reportingService= New-WebServiceProxy $reportingServiceUrl -UseDefaultCredential -namespace ReportingWebService $reportingService.UseDefaultCredentials = $true $reportingService }
      
      





$ ssrsHostパラメーターには、サービスが構成されている完全なパス(通常はservername / ReportServer )が含まれます。



レポートを追加する



レポートを作成または更新するために、CreateReportメソッド[5]があります。

パラメーターとして、レポートの名前、親フォルダーの名前(フォルダーを使用してレポートをグループ化し、さまざまなセキュリティポリシーを設定できます)、上書きのフラグ、レポートファイルのバイナリコンテンツ、および追加のプロパティ(通常は使用せず、$ nullを渡すことができます)を取ります。

このメソッドは、エラーメッセージと警告のコレクションを返します。

これらのうち、データソースに関するレポートは無視します。

呼び出しは次のようになります。

 (Connect-ReportingService $ssrsHost).CreateReport($report, $ssrsFolder, $true, $reportBits, $null)
      
      





したがって、レポートの追加は関数でラップできます。

 function Deploy-Report([string]$ssrsHost, [string]$reportDir, [string]$report, [string]$ssrsFolder) { <#    ,     (   ) #> $relativeReportLocation = "..\RS\$($report).rdl" #    if (-not (Test-Path $reportFile)) { $message = "Report file '{0}' was not found!" -f $reportFile Write-Warning $message return } #    [byte[]]$reportBits = [System.IO.File]::ReadAllBytes($reportFile) # ,      $warnings = (Connect-ReportingService $ssrsHost).CreateReport($report, $ssrsFolder, $true, $reportBits, $null) #    "" $cleanedWarnings = $warnings | ? { -not $_.Message.Contains("data source") } #     (    ) if(!$cleanedWarnings) { $result = "Report '{0}' published successfully with no warnings" -f $report Write-Host $result Write-Host "" } else { $warningHeader = "Report '{0}' published with warnings: " -f $report Write-Host $warningHeader $cleanedWarnings | % { Write-Warning $_.Message } Write-Host "" } }
      
      







結論



提示された実装は、単一のレポートを追加および更新する問題を解決し、同様のコードで使用できます。

  ls "..\RS\*.rdl") | % { $_.Name.Replace(".rdl", "") } | % { Deploy-Report $ssrsHost $reportDir $report $ssrsFolder }
      
      





PowerShellを介したWebサービスの呼び出しは簡単な作業です。

SSRSのWebサービス自体は、たとえばCreateDataSourceメソッド[6]を使用してデータソースを追加/変更するなど、はるかに多くの機能を提供します。



できる拡張機能


現在のプロジェクトでは、膨大な拡張モジュールを実装しています。



そのため、たとえば、最後のファイル変更の時間に基づいて、条件ごとにレポートを更新することもできます[7]

  #     () $deployedReports = (Connect-ReportingService $config).ListChildren($ssrsFolder, 1) [hashtable]$deployedReportsMap = @{} $deployedReports | % { $deployedReportsMap[$_.Name + '.rdl'] = $_ } ls "..\RS\*.rdl") ` | ? { ( -not $deployedReportsMap.ContainsKey($_.Name)) -or $deployedReportsMap[$_.Name].ModifiedDate -lt $_.LastWriteTime } ` | % { $_.Name.Replace(".rdl", "") } ` | % { Deploy-Report $ssrsHost $reportDir $report $ssrsFolder }
      
      





SetItemDataSourcesメソッドが使用されるレポートのデータソースを更新する必要がある場合があります。

多くの場合、レポートからキャッシュをフラッシュする必要があります(FlushCacheメソッド)。



一般に、すべてがシンプルで拡張可能です。


  1. psget.net
  2. msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.aspx
  3. technet.microsoft.com/en-us/library/dd315258.aspx
  4. www.w3.org/TR/wsdl
  5. msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.createreport.aspx
  6. msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.createdatasource.aspx
  7. ListChildrenメソッド: msdn.microsoft.com/en-us/library/reportservice2005.reportingservice2005.listchildren.aspx



All Articles