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.
проблема
Когда я пытаюсь изменить зашифрованную строку подключения в 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 приводит к ошибке:
Сервер отчетов не может подключиться к своей базе данных. Убедитесь, что база данных работает и доступна. Вы также можете проверить подробности в журнале трассировки сервера отчетов.
Если я запускаю средство настройки служб отчетов SQL (GUI) и меняю строку подключения Dsn, то переход на веб-сайт SSRS работает!
Очевидно, это меняет 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