我们有一个 AD 组作为多台服务器的登录名,通常作为系统管理员,
但我发现一台服务器该登录名无权访问任何数据库并且只有服务器公共角色。
我已经和这个小组的一个成员谈过这个问题,
他告诉我他可以访问这个服务器的数据库。
通过在我的本地站以不同用户身份(使用他的 AD 凭据)打开 SSMS,
他可以选择、更新该服务器中的表,甚至缩小日志文件(但除了 sa 和该组之外看不到登录名)。
我找不到这些权限的来源:
没有 Login\User 和他的凭据,
还有其他 AD 组,但如果我从该组撤销连接,那么
他将无法再连接到该服务器。
公共服务器角色只能查看任何数据库权限
公共数据库角色对 dbo 模式没有权限
数据库未部分包含....
我还能在哪里搜索此登录权限的来源?
*我和服务器计算机上的 SQL Server 2012。
我用这个查询来登录这个
USE [master]
GO
DECLARE @username sysname
DECLARE @objname sysname
DECLARE @found integer
DECLARE @sql nvarchar(4000)
DECLARE @results TABLE (Login sysname)
SET @username = ' '
WHILE @username IS NOT NULL
BEGIN
SELECT @username = MIN(name)
FROM master.dbo.syslogins WITH (NOLOCK)
WHERE sysadmin = 0
AND securityadmin = 0
AND serveradmin = 0
AND setupadmin = 0
AND processadmin = 0
AND diskadmin = 0
AND dbcreator = 0
AND bulkadmin = 0
AND name > @username
AND Name NOT LIKE N'NT %'
AND Name NOT LIKE N'##%'
-- this is the list of non system logins
-- ids in server roles may not have corresponding users
-- any database but they should not be removed
SET @found = 0
IF @username IS NOT NULL
BEGIN
-- now we search through each non system database
-- to see if this login has database access
SET @objname = ''
WHILE @objname IS NOT NULL
BEGIN
SELECT @objname = MIN( name )
FROM master.dbo.sysdatabases WITH (NOLOCK)
WHERE
name > @objname
AND DATABASEPROPERTYEX(name, 'status') = 'ONLINE'
IF @objname IS NOT NULL
BEGIN
SET @sql = N'SELECT @found = COUNT(*) FROM [' + @objname
+ N'].dbo.sysusers s WITH (NOLOCK) JOIN master.dbo.syslogins x WITH (NOLOCK)
ON s.sid = x.sid WHERE hasdbaccess = 1 AND x.name = '''+ @username + ''''
EXEC sp_executesql @sql,N'@found Int OUTPUT',@found OUTPUT
--SELECT @found, @objname, @username
IF @found IS NOT NULL AND @found > 0
SET @objname = 'zzzzz' -- terminate as a corresponding user has been found
END
END
IF @found = 0
BEGIN
INSERT INTO @results
SELECT @username
END
END
END
SELECT SERVERPROPERTY('ServerName') ServerName ,Login
FROM @results r
ORDER BY Login
GO
以神秘用户身份登录。然后运行:
输出列表中的某处将是授予您访问权限的令牌。例如你可以试试这个(不保证有效):
最后我找到了这些权限的来源:
这个 AD 用户在数据库中有一个“孤立”用户,其权限高于 AD 组。
因此,为了连接到实例,该用户需要成为该组的一部分
但是在连接之后,他可以直接从他在数据库中的“孤立”用户那里获得权限
即使他所属的组只是公共组
这个组甚至不必在数据库中有相应的用户。
希望我说清楚,因为我不熟悉这个问题。