![具有旧应用程序的 Amazon RDS SQL Server 权限](https://linux22.com/image/720741/%E5%85%B7%E6%9C%89%E6%97%A7%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%20Amazon%20RDS%20SQL%20Server%20%E6%9D%83%E9%99%90.png)
我正在尝试在 AWS 中运行旧版 Windows 应用程序而不修改代码。该应用程序使用 Windows 身份验证进行数据库连接,因此我进行了如下设置:
- 一个简单目录服务实例(具有“真实” AD,而不是具有 2 个域控制器的 Samba 服务)
- 已加入域的 Windows 2012r2 Server EC2 实例:这是我想要运行应用程序的地方
- 一个小型 RDS SQL Server 2014 Express 版本,也加入了域
我在 EC2 服务器上安装了 SSMS,并且我可以使用 SQL Server 身份验证和主凭据或使用 Windows 身份验证作为委派的域管理员帐户对 RDS 进行身份验证。
我的应用程序有一个用于连接的服务用户。我在 RDS 中为该用户创建了一个登录名(使用 SSMS),并授予其访问应用程序数据库的权限。
当我尝试启动我的应用程序时,它尝试连接但失败并出现以下错误:
无法以数据库主体身份执行,因为主体“guest”不存在、无法模拟此类主体或者您没有权限。
为了追踪这个问题,我使用 Wireshark 进行了数据包跟踪。Wireshark 无法完全解析所有流量。我确实注意到了一些事情。首先,发送了“use [master]”,它(成功)将上下文从我想要使用的数据库切换到 master。我知道我的用户对 master 的访问权限很小,而且这受到 RDS 的限制——除非我错过了授予更多访问权限的方法。有一个版本检查,然后是这个查询:
select loginname from dbo.sysusers u, master.dbo.syslogins l
where u.name = user and u.sid = l.sid
似乎得到了一个空结果(确认:我在 SMSS 中以同一用户身份针对 master 运行此查询时得到了一个空结果)。然后执行这个未记录的存储过程:
exec sp_MSdbuserpriv N'ver'
响应是此失败(如上):
无法以数据库主体身份执行,因为主体“guest”不存在、无法模拟此类主体或者您没有权限。
我知道这在告诉我有关权限的事情,但我不知道根据它该尝试什么。据我所知,我的用户无权在主数据库中执行任何操作。
更新
更详细地查看 wireshark 捕获显示,与数据库的初始连接工作正常。我可以看到信息已成功从数据库中提取。然后它断开连接,重新连接,切换到主数据库并执行上面提到的 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'
除了“用户主”行之外,所有这些都可以正常工作。此时,我预计这可能是该应用程序与亚马逊的 SQL Server RDS 产品之间的不匹配。