Я пытаюсь запустить устаревшее приложение Windows в AWS, не изменяя код. Приложение использует проверку подлинности Windows для подключения к БД, поэтому я настроил следующее:
У меня установлен SSMS на сервере EC2, и я могу пройти аутентификацию в RDS либо с использованием аутентификации SQL Server с использованием основных учетных данных, либо с использованием аутентификации Windows в качестве делегированной учетной записи администратора домена.
В моем приложении есть пользователь службы, который используется для подключения. Я создал логин для этого пользователя в RDS (используя SSMS) и предоставил ему доступ к базе данных приложения.
Когда я пытаюсь запустить свое приложение, оно пытается подключиться, но выдает следующую ошибку:
Невозможно выполнить в качестве участника базы данных, так как главный «гость» не существует, этот тип участника не может быть олицетворен или у вас нет разрешения.
Пытаясь отследить это, я запустил трассировку пакетов с помощью Wireshark. Wireshark не может полностью проанализировать весь трафик. Я заметил несколько вещей. Во-первых, отправляется 'use [master]', который (успешно) переключает контекст из БД, которую я хочу использовать для управления. Я знаю, что у моего пользователя минимальный доступ к мастеру, и он ограничен RDS - если только я не пропущу способ предоставить больше доступа. Есть проверка версии, тогда этот запрос:
select loginname from dbo.sysusers u, master.dbo.syslogins l
where u.name = user and u.sid = l.sid
Кажется, что дает пустой результат (подтверждение: я получаю пустой результат, выполняя этот запрос от имени того же пользователя в SMSS против мастера). Затем выполняется эта недокументированная хранимая процедура:
exec sp_MSdbuserpriv N'ver'
И ответ - это сбой (как указано выше):
Невозможно выполнить в качестве участника базы данных, потому что главный «гость» не существует, этот тип участника не может быть олицетворен или у вас нет разрешения.
Я понимаю, что это что-то говорит мне о разрешениях, но я не знаю, что попробовать на основании этого. Насколько я знаю, моему пользователю нечего делать в master db.
Обновить
Более подробное рассмотрение захвата wirehark показывает, что первоначальное подключение к БД работает нормально. Я вижу, что информация успешно получена из БД. Затем он отключается, повторно подключается, переключается на главную базу данных и выполняет SP, упомянутый выше (который не приводит к ошибке, которую я вижу). Буду обновлять дальше, если найду что-нибудь еще.
Обновление # 2
Я все еще пытаюсь это сделать, но пока не добился реального прогресса. Одна вещь, которую я заметил, заключается в том, что рабочее соединение осуществляется через какой-то клиент .Net, тогда как соединение, которое не работает, использует DMO.
Это команды, отправленные клиентом DMO до того, как он откажется:
set quoted_identifier off
SET TEXTSIZE 64512
select @@microsoftversion
SELECT ISNULL(SUSER_SNAME(), SUSER_NAME())
use [master]
if (object_id('master.dbo.sp_MSSQLDMO90_version') is not null)
exec .dbo.sp_MSSQLDMO90_version
else if (object_id('master.dbo.sp_MSSQLDMO80_version') is not null)
exec master.dbo.sp_MSSQLDMO80_version
else if (object_id('master.dbo.sp_MSSQLDMO70_version') is not null)
exec master.dbo.sp_MSSQLDMO70_version
else select 0
select loginname from dbo.sysusers u, master.dbo.syslogins l where u.name = user and u.sid = l.sid<
exec sp_MSdbuserpriv N'ver'
Все это будет работать, кроме строки «пользовательский мастер». На данный момент я ожидаю, что это может быть фактическим несоответствием между этим приложением и предложением Amazon SQL Server RDS.