SQL Server Reporting Services 구성하는 수동 단계

중요

이 버전의 Service Manager 지원이 종료되었습니다. Service Manager 2022로 업그레이드하는 것이 좋습니다.

Service Manager 데이터 웨어하우스 관리 서버를 배포하는 동안 SSRS(Microsoft SQL Server Reporting Services)를 배포할 서버를 지정할 수 있습니다. 기본적으로 설치하는 동안 데이터 웨어하우스 관리 서버를 호스트하는 컴퓨터가 선택됩니다. SSRS를 호스트할 다른 컴퓨터를 지정하는 경우 이 절차에 따라 서버를 준비하라는 메시지가 표시됩니다. SSRS를 호스트하도록 원격 컴퓨터를 준비하는 과정에는 다음 단계가 포함되며, 이 섹션에서 이러한 단계를 자세히 다룹니다.

  • Service Manager 설치 미디어에 있는 Microsoft.EnterpriseManagement.Reporting.Code.dll 파일을 SSRS를 호스트하는 컴퓨터에 복사합니다.

  • SSRS를 호스트하는 컴퓨터의 rssrvpolicy 구성 파일에 코드 세그먼트를 추가합니다.

  • 동일한 컴퓨터의 rsreportserver 구성 파일에서 기존 Data 세그먼트에 Extension 태그를 추가합니다.

SQL Server 기본 instance 사용한 경우 Windows Explorer 사용하여 Service Manager 설치 미디어의 필수 구성 요소 폴더에 있는 Microsoft.EnterpriseManagement.Reporting.Code.dll \Program Files\Microsoft SQL Server\MSRS13 폴더로 끌어옵니다. SSRS를 호스팅하는 컴퓨터의 MSSQLSERVER\Reporting Services\ReportServer\Bin입니다. SQL Server 기본 instance 사용하지 않은 경우 필요한 폴더의 경로는 \Program Files\Microsoft SQL Server\MSRS13입니다.<>INSTANCE_NAME\Reporting Services\ReportServer\Bin. 다음 절차에서는 기본 인스턴스 이름이 사용됩니다.

Microsoft.EnterpriseManagement.Reporting.Code.dll 파일 복사

다음 단계를 사용합니다.

  1. 원격 SSRS를 호스트하는 컴퓨터에서 Windows 탐색기 인스턴스를 엽니다.

  2. SQL Server 2016의 경우 \Program Files\Microsoft SQL Server\MSRS13 폴더를 찾습니다. MSSQLSERVER\Reporting Services\ReportServer\Bin.

  3. 두 번째 Windows 탐색기 인스턴스를 시작하고 Service Manager 설치 미디어를 포함하는 드라이브를 찾은 다음 Prerequisites 폴더를 엽니다.

  4. 필수 구성 요소 폴더에서 Microsoft.EnterpriseManagement.Reporting.Code.dll선택하고 2단계 중 하나에 있는 폴더로 끕니다.

rssrvpolicy.config 파일에 코드 세그먼트 추가

다음 단계를 사용합니다.

  1. SSRS를 호스팅할 컴퓨터의 \Program Files\Microsoft SQL Server\MSRS13에서 파일 rssrvpolicy.config 찾습니다. SQL Server 2016용 MSSQLSERVER\Reporting Services\ReportServer 폴더입니다.

  2. 원하는 XML 편집기(예: 메모장)를 사용하여 rssrvpolicy.config 파일을 엽니다.

  3. rssrvpolicy.config 파일을 스크롤하여 <CodeGroup> 코드 세그먼트를 찾습니다. 다음 코드는 <CodeGroup> 세그먼트의 한 예를 나타냅니다.

    <CodeGroup
       class="UnionCodeGroup"
       version="1"
       PermissionSetName="FullTrust">
       <IMembershipCondition
          class="UrlMembershipCondition"
          version="1"
          Url="$CodeGen$/*"
       />
    </CodeGroup>
    
  4. 다른 <CodeGroup> 세그먼트와 동일한 섹션에서 다음 <CodeGroup> 세그먼트 전체를 추가합니다.

    <CodeGroup
       class="UnionCodeGroup"
       version="1"
       PermissionSetName="FullTrust"
       Name="Microsoft System Center Service Manager Reporting Code Assembly"
       Description="Grants the SCSM Reporting Code assembly full trust permission.">
       <IMembershipCondition
          class="StrongNameMembershipCondition"
          version="1"
          PublicKeyBlob="0024000004800000940000000602000000240000525341310004000001000100B5FC90E7027F67871E773A8FDE8938C81DD402BA65B9201D60593E96C492651E889CC13F1415EBB53FAC1131AE0BD333C5EE6021672D9718EA31A8AEBD0DA0072F25D87DBA6FC90FFD598ED4DA35E44C398C454307E8E33B8426143DAEC9F596836F97C8F74750E5975C64E2189F45DEF46B2A2B1247ADC3652BF5C308055DA9"
    />
    </CodeGroup>
    
  5. 변경 내용을 저장하고 XML 편집기를 닫습니다.

rsreportserver.conf 파일의 데이터 세그먼트에 확장 태그 추가

다음 단계를 사용합니다.

  1. SSRS를 호스팅하는 컴퓨터의 \Program Files\Microsoft SQL Server\MSRS13에서 파일 rsreportserver.config 찾습니다. SQL Server 2016용 MSSQLSERVER\Reporting Services\ReportServer 폴더입니다.

  2. 원하는 XML 편집기(예: 메모장)를 사용하여 rsreportserver.config 파일을 엽니다.

  3. rsreportserver.config 파일을 스크롤하여 <Data> 코드 세그먼트를 찾습니다. 이 파일에는 하나의 <Data> 코드 세그먼트만 있습니다.

  4. 다음 Extension 태그를 다른 모든 <Data> 태그가 있는 Extension 코드 세그먼트에 추가합니다.

    <Extension Name="SCDWMultiMartDataProcessor" Type="Microsoft.EnterpriseManagement.Reporting.MultiMartConnection, Microsoft.EnterpriseManagement.Reporting.Code" />
    
  5. 변경 내용을 저장하고 XML 편집기를 닫습니다.

SSRS 설치 확인

DW(Service Manager Data Warehouse) 버전 2016 이상에서는 다음과 같은 알려진 문제가 관찰됩니다.

Service Manager Data Warehouse(DW)에서는 다음과 같은 알려진 문제가 관찰됩니다.

SSRS(SQL Server Reporting Services)가 Data Warehouse 관리 서버에서 로컬로 실행되고 SSRS가 2017 이상인 경우 Data Warehouse 설치가 성공적으로 완료되지만 지정된 로컬 SSRS instance 제대로 구성하지 못할 수 있습니다.

아래 스크립트를 사용하여 LOCAL SSRS 설치가 올바르게 구성되었으며 Service Manager Data Warehouse 사용할 수 있는지 확인합니다.

참고

이 PowerShell 스크립트는 Service Manager Data Warehouse 설치 후에 실행할 수 있습니다. 스크립트는 구성을 변경하지 않고 확인합니다. 스크립트를 필요한 횟수만큼 실행할 수 있습니다.

#region function definitions

function SelfElevate() {
    #got from http://www.expta.com/2017/03/how-to-self-elevate-powershell-script.html   and changed a bit
    if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
     if ([int](Get-WmiObject -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
      $CommandLine = "-File `"" + $Script:MyInvocation.MyCommand.Path + "`" " + $Script:MyInvocation.UnboundArguments
      Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $CommandLine
      Exit
     }
    }
}
function EndScriptExecution() {
    Write-Host ""
    Read-Host "Press ENTER to stop execution" 
    Exit
}
#endregion
#region Init
SelfElevate
#endregion 

#region Select SSRS service
$ssrsServicesAvailable = gwmi win32_service | ?{ $_.DisplayName -like 'SQL Server Reporting Services*' }
if ($ssrsServicesAvailable -eq $null) {
    Write-Host "No SSRS service(s) detected on this machine. " -NoNewline
    Write-Host "Aborting ..." -ForegroundColor Yellow
    EndScriptExecution
}

if ( ($ssrsServicesAvailable | Measure-Object).Count -eq 1) {
    $ssrsServiceToVerify = ($ssrsServicesAvailable | Select-Object -Property DisplayName, State, PathName) | Select-Object -First 1
}
else {
    $ssrsServiceToVerify = $ssrsServicesAvailable | Select-Object -Property DisplayName, State, PathName | Out-GridView  -Title 'Select the SSRS service to verify and then click OK...' -OutputMode Single
    if ($ssrsServiceToVerify -eq $null) {
        Write-Host "No SSRS service selected to verify. " -NoNewline
        Write-Host "Aborting ..." -ForegroundColor Yellow
        EndScriptExecution
    }
}
#endregion

#region Preparation
Write-Host "--------------------------------------------------------------------"
Write-Host "Verifiying selected SSRS service : " -NoNewline
Write-Host "'$($ssrsServiceToVerify.DisplayName)'"  -ForegroundColor Cyan
Write-Host "--------------------------------------------------------------------"
Write-Host ""

$ssrsExePath = $ssrsServiceToVerify.PathName.Replace('"','')
$ssrsExeFileVersion = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($ssrsExePath)
$ssrsMajorVersion = $ssrsExeFileVersion.ProductMajorPart
$ssrsVersionDisplayName = switch ($ssrsMajorVersion)
{
    11 {"2012"}
    12 {"2014"}
    13 {"2016"}
    14 {"2017"}
    15 {"2019"}
    default {""}
}
if ($ssrsVersionDisplayName -eq "") {
    Write-Host "Unknown SSRS Version detected. " -NoNewline
    Write-Host "Aborting ..." -ForegroundColor Yellow
    EndScriptExecution
}

[System.IO.DirectoryInfo]$ssrsReportServerFolder = (Get-Item -Path $ssrsExePath).Directory.Parent
if ($ssrsMajorVersion -ge 14) {
    $ssrsReportServerFolder =    Join-Path $ssrsReportServerFolder.FullName "ReportServer"
}
[string]$ssrsReportServerFolder = $ssrsReportServerFolder.FullName 
[string]$ssrsReportServerBinFolder = Join-Path $ssrsReportServerFolder "bin"
#endregion

#region Checking DLL
$scsmDllFileExists = $false
$scsmDllFileName = "Microsoft.EnterpriseManagement.Reporting.Code.dll"
$scsmDllFilePath = Join-Path $ssrsReportServerBinFolder $scsmDllFileName
$scsmDllFileExists = (Test-Path -Path $scsmDllFilePath)
if (-not $scsmDllFileExists) {
    Write-Host "ERROR: "  -ForegroundColor Yellow -NoNewline
    Write-Host "The file '$scsmDllFileName' does *NOT* exist in '$ssrsReportServerBinFolder'"
}
else {
    Write-Host " Pass: The file '$scsmDllFileName' does exist in '$ssrsReportServerBinFolder'" 
}
Write-Host ""
#endregion

#region Checking rssrvpolicy.config
$rssrvpolicy_configIsCorrect = $false
$rssrvpolicy_configFileName = "rssrvpolicy.config"
$rssrvpolicy_configFilePath = Join-Path $ssrsReportServerFolder $rssrvpolicy_configFileName
$rssrvpolicy_configFileExists = (Test-Path -Path $rssrvpolicy_configFilePath)
if (-not $rssrvpolicy_configFileExists) {
    Write-Host "$rssrvpolicy_configFileName does *NOT* exist in $ssrsReportServerFolder" -ForegroundColor Yellow
}
if ($rssrvpolicy_configFileExists) {    
    
    [xml]$xml = Get-Content $rssrvpolicy_configFilePath
    
    $tagNameToFind = "CodeGroup"
    $attributeNameToFind = "Name"
    $attributeValueToFind = "Microsoft System Center Service Manager Reporting Code Assembly"
    $nodeToFind = Select-Xml -XPath "//$tagNameToFind[@$attributeNameToFind='$attributeValueToFind']" -Xml $xml

    if ($nodeToFind -eq $null) {
        Write-Host "ERROR: "  -ForegroundColor Yellow -NoNewline
        Write-Host "The file '$rssrvpolicy_configFileName' in '$ssrsReportServerFolder' does *NOT* contain the correct <$tagNameToFind> node." 
    }
    else {

        $CodeGroup_NodeToVerify = [System.Xml.XmlNode]$nodeToFind.Node
        $IMembershipCondition_NodeToVerify = [System.Xml.XmlNode]$CodeGroup_NodeToVerify.IMembershipCondition

        $rssrvpolicy_configIsCorrect =  ( $CodeGroup_NodeToVerify.class -eq "UnionCodeGroup" `
            -and $CodeGroup_NodeToVerify.version -eq "1" `
            -and $CodeGroup_NodeToVerify.PermissionSetName -eq "FullTrust" `
            -and $IMembershipCondition_NodeToVerify.class -eq "StrongNameMembershipCondition" `
            -and $IMembershipCondition_NodeToVerify.version -eq "1" `
            -and $IMembershipCondition_NodeToVerify.PublicKeyBlob -eq "0024000004800000940000000602000000240000525341310004000001000100B5FC90E7027F67871E773A8FDE8938C81DD402BA65B9201D60593E96C492651E889CC13F1415EBB53FAC1131AE0BD333C5EE6021672D9718EA31A8AEBD0DA0072F25D87DBA6FC90FFD598ED4DA35E44C398C454307E8E33B8426143DAEC9F596836F97C8F74750E5975C64E2189F45DEF46B2A2B1247ADC3652BF5C308055DA9"
        ) 

        if (-not $rssrvpolicy_configIsCorrect) {
            Write-Host "ERROR: "  -ForegroundColor Yellow -NoNewline
            Write-Host "The <$tagNameToFind> node in '$rssrvpolicy_configFileName' in '$ssrsReportServerFolder' does exists but its content is *NOT* correct."
        }
        else {
            Write-Host " Pass: The content of '$rssrvpolicy_configFileName'    in '$ssrsReportServerFolder' is correct."             
        }
    }

}
Write-Host ""
#endregion

#region Checking rsreportserver.config
$rsreportserver_configIsCorrect = $false
$rsreportserver_configFileName = "rsreportserver.config"
$rsreportserver_configFilePath = Join-Path $ssrsReportServerFolder $rsreportserver_configFileName
$rsreportserver_configFileExists = (Test-Path -Path $rsreportserver_configFilePath)
if (-not $rsreportserver_configFileExists) {
    Write-Host "$rsreportserver_configFileName does *NOT* exist in $ssrsReportServerFolder" -ForegroundColor Yellow
}
if ($rsreportserver_configFileExists) {
     
    [xml]$xml = Get-Content $rsreportserver_configFilePath
    
    $tagNameToFind = "Extension"
    $attributeNameToFind = "Name"
    $attributeValueToFind = "SCDWMultiMartDataProcessor"
    $nodeToFind = Select-Xml -XPath "//$tagNameToFind[@$attributeNameToFind='$attributeValueToFind']" -Xml $xml

    if ($nodeToFind -eq $null) {
        Write-Host "ERROR: "  -ForegroundColor Yellow -NoNewline
        Write-Host "The file '$rsreportserver_configFileName' in '$ssrsReportServerFolder' does *NOT* contain the correct <$tagNameToFind> node."
    }
    else {

        $Extension_NodeToVerify = [System.Xml.XmlNode]$nodeToFind.Node
        $rsreportserver_configIsCorrect =  ( $Extension_NodeToVerify.Type.Replace(" ","") -eq "Microsoft.EnterpriseManagement.Reporting.MultiMartConnection, Microsoft.EnterpriseManagement.Reporting.Code".Replace(" ","") ) 

        if (-not $rsreportserver_configIsCorrect) {
            Write-Host "ERROR: "  -ForegroundColor Yellow -NoNewline
            Write-Host "The <$tagNameToFind> node in '$rsreportserver_configFileName' in '$ssrsReportServerFolder' does exists but its content is *NOT* correct." 
        }
        else {
            Write-Host " Pass: The content of '$rsreportserver_configFileName' in '$ssrsReportServerFolder' is correct."             
        }
    }

}
Write-Host ""
#endregion

#region Conclusion
""
Write-Host "Conclusion:" -ForegroundColor Cyan
Write-Host "==========="
if ($scsmDllFileExists -and $rsreportserver_configIsCorrect -and $rssrvpolicy_configIsCorrect) {
    Write-Host "The selected SSRS instance is configured correctly."
}
else {
    Write-Host "The selected SSRS instance is " -NoNewline
    Write-Host "*NOT* configured correctly." -ForegroundColor Yellow
    Write-Host "Please follow the steps at  " -NoNewline
    Write-Host "https://learn.microsoft.com/system-center/scsm/config-remote-ssrs" -ForegroundColor Yellow
}
EndScriptExecution
#endregion

다음 단계