【发布时间】:2019-09-23 17:18:29
【问题描述】:
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 服务器上安装 SSRS 并恢复 2 个数据库后,我需要更改 SSRS 配置文件中的连接字符串以指向新的 SQL 服务器名称/实例。
问题
当我尝试使用 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 数据库名称中的 $ 符号,当我运行命令时,“虚构/模拟”密码中的 @ 没有被转义,例如:
$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 实用程序生成的连接字符串不正常 - 我尝试了许多不同的组合,似乎只有 RSConfigTool 才能真正做到?
注 1:
我将这一切编写为一个 DevOps 项目,我们正在使用打包程序烘焙这些图像,因此无法手动完成任何操作。
注2:
机器加入域并在安装 SQL 后重命名。所以使用我认为行不通的 Configuration.ini 文件。
【问题讨论】:
-
哇,这看起来很有趣。 “我怎样才能知道 RsConfigTool.exe 的其他功能[...]”您是否尝试对驱动器进行快照并对其进行比较?也许它让那个魔法更加清晰。
-
您应该能够使用 VSS 创建快照并区分目录结构和文件内容。两者都适用于 PowerShell。您还应该能够解码 dsn 字符串以区分它们。
-
制作你的驱动器的快照并进行比较? - 我不需要,因为我知道这是我感兴趣的配置文件(除了 SQL 命令)。 您还应该能够解码 dsn 字符串以区分它们。 - 这在 afaik 中是不可能的,加密的注册表项也是如此(这将是一个巨大的漏洞)。谢谢
标签: sql powershell encryption reporting-services connection-string