RSConfig генерирует строку подключения Dsn не работает

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?


Фон
После того, как я установил SSRS на Windows 2016 Server и восстановил 2 базы данных, мне нужно изменить строку подключения в файле конфигурации SSRS, чтобы указать новое имя/экземпляр сервера SQL.

enter image description here

проблема
Когда я пытаюсь изменить зашифрованную строку подключения в C:\Program Files\Microsoft SQL Server\MSRS13.SSRS\Reporting Services\ReportServer\RsReportServer.config с помощью утилиты RSConfig:

C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn>rsconfig -c -s Server0012 -i SSRS -d "reportserver$ssrs" -a SQL -u sa -p "[email protected]!" -t

Он изменяет строку подключения Dsn в файле RsReportServer.config.

До: <Dsn> AQAAANCMnd8BFdERjHoAwE/Cl + sBAAAAE + ТСК /4Vs0a0fdH0tCY8kgQAAAAiAAAAUgBlAHAAbwByAHQAaQBuAGcAIABTAGUAcgB2AGUAcgAAABBmAAAAAQAAIAAAAC2DBxZFsfVB16r0e3...... *

После: <Dsn> AQAAANCMnd8BFdERjHoAwE/Cl + sBAAAAE + tJc/4Vs0a0fdH0tCY8kgQAAAAiAAAAUgBlAHAAbwByAHQAaQBuAGcAIABTAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF)

Однако после этого изменения, переход на веб-сайт SSRS приводит к ошибке:

Сервер отчетов не может подключиться к своей базе данных. Убедитесь, что база данных работает и доступна. Вы также можете проверить подробности в журнале трассировки сервера отчетов.

enter image description here

Если я запускаю средство настройки служб отчетов SQL (GUI) и меняю строку подключения Dsn, то переход на веб-сайт SSRS работает!

enter image description here

enter image description here

Очевидно, это меняет Dsn, но я не могу понять, что еще он делает во время работы инструмента с графическим интерфейсом. Я использовал 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 = "[email protected]!"

$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 "[email protected]!"

Он изменяет строку подключения Dsn, но при переходе на веб-сайт SSRS выдается та же ошибка (см. Выше).

Как узнать, что еще делает RsConfigTool.exe при изменении текущей базы данных сервера отчетов? Или какие-то догадки, почему строка подключения, сгенерированная с помощью утилиты RSConfig, вышла из строя - я пробовал много разных комбинаций, кажется, что только RSConfigTool действительно может это сделать?

Примечание 1:
Я пишу все это как проект DevOps, и мы запекаем эти изображения с помощью упаковщика, поэтому ничего нельзя сделать вручную.

Заметка 2:
Компьютер присоединен к домену и переименован после установки SQL. Так что, используя файл Configuration.ini, я не думаю, что он будет работать.

Ответы

Ответ 1

Проблема не в RsConfigTool.exe. Это работает, и действительно правильно изменяет строку подключения.

Проблема просто сводится к одинарным кавычкам против двойных кавычек и наличию знака $ в названии.

Из документов:

Когда вы заключаете строку в двойные кавычки (строка в двойных кавычках), имена переменных, которым предшествует знак доллара ($), заменяются значением переменной перед передачей строки в команду для обработки.

Мы видим это, когда пытаемся вывести имя базы данных:

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 '[email protected]!' -t