TL; DR 。
复制步骤,备份C:\Program Files\Microsoft SQL Server\MSRS13.SSRS\Reporting Services\ReportServer\RsReportServer.config
运行以下命令以更新SSRS的配置中的连接字符串:
C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn>rsconfig -c -s <ServerName> -i <instanceNameIfNotDefault> -d "reportserver$ssrs" -a SQL -u sa -p "YourSAPassword" -t
现在浏览到SSRS网站,它不起作用!要修复此问题,请还原您的配置文件或通过SSRS GUI工具运行它!
RsConfig实用程序如何工作?
背景
在Windows 2016 Server上安装SSRS并还原2个数据库后,我需要在SSRS配置文件中更改“连接字符串”以指向新的SQL Server名称/实例。
问题
当我尝试使用RSConfig实用程序更改C:\Program Files\Microsoft SQL Server\MSRS13.SSRS\Reporting Services\ReportServer\RsReportServer.config
文件中的加密连接字符串时:
C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn>rsconfig -c -s Server0012 -i SSRS -d "reportserver$ssrs" -a SQL -u sa -p "P@ssw0rd!" -t
它更改RsReportServer.config中的Dsn连接字符串。
之前:
之后:
但是,此更改之后,浏览到SSRS网站会导致错误:
报表服务器无法连接到其数据库。确保数据库正在运行并且可以访问。您还可以检查报表服务器跟踪日志以了解详细信息。
如果我运行SQL Reporting Services配置工具(GUI)并更改Dsn连接字符串,则浏览到SSRS网站就可以了!
很明显,它更改了Dsn,但是在GUI工具运行时,我无法确定它还有什么其他用途。我使用过ProcessMonitor,并且看到GUI工具不使用RSConfig.exe实用程序,它本身使用RsConfigTool.exe!因此,我什至无法捕获实际的命令/连接字符串应该是什么的命令行参数。同样,每次我们更改连接字符串时,都会生成一个新的随机字符串,因此不确定如何进行实际与预期的比较。
我做了一个注册表项的WinDiff,除了一些加密的十六进制差异外,什么都没有。
我运行SQLProfiler,我在PowerShell脚本中模拟了一堆赠款,例如:
$sqls += @"
USE [ReportServer`$SSRSTempDB]
if not exists (select * from sysusers where issqlrole = 1 and name = 'RSExecRole')
BEGIN
EXEC sp_addrole 'RSExecRole'
END;
GO
我的直觉是SQL数据库名称中的$符号,而在运行命令时,“ make up / simulated”密码中的@不会被转义,例如:
$MachineName = "server0012"
$instanceName = "SSRS"
$saPassword = "P@ssw0rd!"
$rsConfigPath = "C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\rsconfig.exe"
$setupArgs = -join('-c -s "', $MachineName,'" -i "', $instanceName,'" -d ','"ReportServer`$SSRS" -t -a SQL -u "sa" -p "', $saPassword,"""")
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
Write-Host $rsConfigPath $setupArgs
$args = $setupArgs.Split(" ")
& "$rsConfigPath" $args
Restart-Service -Force "SQL Server ($instanceName)"
当我在命令提示符中运行这些香草命令时(无需转义PowerShell字符):
rsconfig -c -s Server0012 -i SSRS -d "reportserver$ssrs" -a SQL -u sa -p "P@ssw0rd!"
它更改了Dsn连接字符串,但浏览到SSRS网站也出现相同的错误(上面)。
在更改当前报表服务器数据库时,如何找出RsConfigTool.exe的其他功能?还是有任何猜测为什么使用RSConfig Utility生成的连接字符串不合时宜-我尝试了许多不同的组合,似乎只有RSConfigTool才能真正做到这一点?
注1:
我将所有这些脚本编写为一个DevOps项目,并且我们正在使用打包程序来烘焙这些图像,因此无法手动完成任何操作。
注2:
计算机已加入域,并在安装SQL之后重命名。因此,我认为使用Configuration.ini文件不起作用。
答案 0 :(得分:1)
诀窍是,您需要使用Powershell Invoke-Expression
命令,服务器名称必须包含实例名称,且不带引号server \ instance,并且您必须在RsConfig.exe命令中转义$符号: -d ','"reportserver<tilda>$ssrs"'
如果您不使用Invoke-Expression
并转义$符号,则DatabaseName称为 ReportServer 而不是 ReportServer $ SSRS
您可以在SSRS日志中看到它:
库!WindowsService_1!30c!05/17 / 2019-03:56:29 :: e错误:抛出 Microsoft.ReportingServices.Library.ReportServerDatabaseUnavailableException: , Microsoft.ReportingServices.Library.ReportServerDatabaseUnavailableException: 报表服务器无法打开与报表服务器的连接 数据库。所有请求都需要连接到数据库 和处理。 ---> System.Data.SqlClient.SqlException:一个 建立时发生与网络相关或特定于实例的错误 与SQL Server的连接。 找不到服务器或找不到服务器 无障碍。验证实例名称正确和SQL 服务器配置为允许远程连接。(提供者:命名为 Pipes Provider,错误:40-无法打开与SQL Server的连接)
这是我用来修复已重命名的服务器上损坏的SQL安装的脚本:
Param(
[parameter(mandatory=$true,helpmessage="New Machine Name")]
[string]$MachineName,
[parameter(mandatory=$false,helpmessage="SQL Instance Name")]
[string]$instanceName = "SSRS",
[parameter(mandatory=$false,helpmessage="SQL SA Password")]
[string]$saPassword = "P@ssword1" #this is encrypted IRL
)
#1. Start the logging
Start-Transcript -Path "C:\temp\rename-ssrs-computer.txt"
#2. Change the SQL Server's name
Write-Host "Change the SQL Server Instance Name to $MachineName"
$moduleName = "SqlServer"
Import-Module $moduleName -Verbose
$sql = 'select @@SERVERNAME'
$serverNameQry = Invoke-SqlCmd -Serverinstance ".\$instanceName" -Query $sql -username "sa" -password $saPassword -querytimeout ([int]::MaxValue)
$serverName = $serverNameQry.Column1
$sql = -join('sp_dropserver ''', $serverName,'''
GO
sp_addserver ''', $MachineName, "\", $instanceName,''',''local''
GO
')
Invoke-SqlCmd -Serverinstance ".\$instanceName" -Query $sql -username "sa" -password $saPassword -querytimeout ([int]::MaxValue)
#3. Change the SSRS database permissions
$sqls = @()
$sqls += @"
USE master
DECLARE @AccountName nvarchar(260)
SET @AccountName = SUSER_SNAME(0x010100000000000514000000)
if not exists (select name from syslogins where name = @AccountName and hasaccess = 1 and isntname = 1)
BEGIN
EXEC sp_grantlogin @AccountName
END;
GO
"@
#..... all the SQL Profile trace outputs...#
Foreach ($sql in $sqls)
{
Invoke-SqlCmd -Serverinstance ".\$instanceName" -Query $sql -username "sa" -password $saPassword -querytimeout ([int]::MaxValue)
}
#4. Change all the registry key values with the AMI Original Computer Name
Write-Host "Change the SQL Server Name in the Registry to $MachineName"
$txt = -join('Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\130\Machines]
"OriginalMachineName"="',$MachineName,'"
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SQL Server\90\Machines]
"OriginalMachineName"="',$MachineName,'"
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SQL Server\140\Machines]
"OriginalMachineName"="',$MachineName,'"
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SQL Server\130\Machines]
"OriginalMachineName"="',$MachineName,'"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Services\SSIS Server]
"GroupPrefix"="SQLServerDTSUser$',$MachineName,'"
"LName"=""
"Name"="MsDtsServer"
"Type"=dword:00000004
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SQL Server\Services\SSIS Server]
"GroupPrefix"="SQLServerDTSUser$',$MachineName,'"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Services\Report Server]
"Name"="ReportServer"
"LName"="ReportServer$"
"Type"=dword:00000006
"GroupPrefix"="SQLServerReportServerUser$',$MachineName,'$"
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SQL Server\Services\Report Server]
"Name"="ReportServer"
"LName"="ReportServer$"
"Type"=dword:00000006
"GroupPrefix"="SQLServerReportServerUser$',$MachineName,'$"'
)
Add-Content "C:\temp\output.reg" $txt
regedit /s "C:\temp\output.reg"
#5. Set the encrypted connection string DONT CHANGE THIS!!!
$rsConfigPath = "C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\"
$setupArgs = -join('-c -s ', $MachineName, '\' , $instanceName,' -i ', $instanceName,' -d ','"reportserver`$ssrs"', ' -t -a SQL -u sa -p "', $saPassword,'"')
Write-Host "Setup args for RSConfig $rsConfigPath $setupArgs"
Write-Host "Running RSConfig"
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
Write-Host $rsConfigPath $setupArgs
Set-Location "$rsConfigPath"
Invoke-Expression $("rsconfig.exe " + $setupArgs)
Write-Host "RSConfig Dsn complete, new Connection string under Dsn saved to rsconfig.config file."
#6. Restart the SQL Service
Write-Host "Restarting $instanceName"
Restart-Service -Force "SQL Server ($instanceName)"
Write-Host "Restarted $instanceName"
#7. Set regional format (date/time etc.) to English (Australia) - this applies to all users
Import-Module International
Set-Culture en-AU
# Check language list for non-US input languages, exit if found
$currentlist = Get-WinUserLanguageList
$currentlist | ForEach-Object {if(($.LanguageTag -ne "en-AU") -and ($.LanguageTag -ne "en-US")){exit}}
# Set the language list for the user, forcing English (Australia) to be the only language
Set-WinUserLanguageList en-AU -Force
Set-TimeZone -Name "AUS Eastern Standard Time"
# Lastly Stop the transcript (before the PC gets rebooted by the calling script).
Stop-Transcript
答案 1 :(得分:0)
RsConfigTool.exe不存在此问题。它可以正常工作,并且确实可以正确更改连接字符串。
问题只可以归结为单引号和双引号,并且名称中带有$符号。
来自docs:
将字符串用双引号引起来时(双引号引起来 字符串),以美元符号($)开头的变量名是 在将字符串传递给字符串之前,用变量的值替换 处理命令。
当我们尝试输出数据库名称时,我们可以看到这一点:
PS C:\> Write-Output "ReportServer$SSRS"
ReportServer
我们可以看到,它返回“ ReportServer”,然后返回$SSRS
变量的内容(为空)。
为证明这一点,如果我们创建$SSRS
变量并将其设置为一个值:
PS C:\> $SSRS = "SomethingElse"
PS C:\> Write-Output "ReportServer$SSRS"
ReportServerSomethingElse
我们收到“ SomethingElse” ;-)。但是,如果我们将其用单引号引起来,它将不会进行变量替换:
PS C:\> Write-Output 'ReportServer$SSRS'
ReportServer$SSRS
因此,解决方法是从PowerShell调用RsConfigTool.exe工具时,只需将双引号替换为单引号即可。
rsconfig -c -s Server0012 -i SSRS -d 'reportserver$ssrs' -a SQL -u sa -p 'P@ssw0rd!' -t