Sql-Server

查看誰可以通過 AD 組成員訪問數據庫

  • May 18, 2017

SharePoint 有一個“檢查權限”按鈕。在這裡,您可以從 Active Directory 中選擇一個使用者,它會神奇地遍歷組,並根據使用者所在的組向您顯示該使用者在站點上的所有訪問權限。

這是一個很長的鏡頭,因為我已經使用 SQL Server 很長一段時間了並且從未聽說過這個,但以防萬一我錯過了什麼……

SQL Server 中有類似的東西嗎?現在,檢查權限包括查看在實例上登錄的 AD 組,並手動通過 AD 以查看誰在哪個組中,然後手動查看數據庫權限。像 SharePoint 這樣的“檢查權限”可以節省大量時間。

我能夠將這裡的建議與我躺在身邊的舊腳本結合起來,提出以下內容,它將顯示使用者所在的所有組,以及它們映射到的數據庫角色。請注意,這沒有經過徹底測試,但它給出了我需要的結果。

-- SHOW PERMISSIONS FOR A USER BASED ON MEMBERSHIP IN AD GROUPS ONLY
DECLARE @LoginName varchar(50)
SET @LoginName = 'DOMAIN\USERNAME'



CREATE TABLE #tmpResults
(
[account name] sysname,
[type] char(8),
privilege char(9),
[mapped login name] sysname,
[permission path] sysname NULL
)

INSERT INTO #tmpResults
exec xp_logininfo @LoginName, 'all'

-------------------
DECLARE @DB_USers TABLE
(DBName sysname, UserName sysname, LoginType sysname, AssociatedRole varchar(max),create_date datetime,modify_date datetime)

INSERT @DB_USers
EXEC sp_MSforeachdb

'
use [?]
SELECT ''?'' AS DB_Name,
case prin.name when ''dbo'' then prin.name + '' (''+ (select SUSER_SNAME(owner_sid) from master.sys.databases where name =''?'') + '')'' else prin.name end AS UserName,
prin.type_desc AS LoginType,
isnull(USER_NAME(mem.role_principal_id),'''') AS AssociatedRole ,create_date,modify_date
FROM sys.database_principals prin
LEFT OUTER JOIN sys.database_role_members mem ON prin.principal_id=mem.member_principal_id
WHERE prin.sid IS NOT NULL and prin.sid NOT IN (0x00) and
prin.is_fixed_role <> 1 AND prin.name NOT LIKE ''##%'''

SELECT dbname,username, [mapped login name],logintype ,create_date ,modify_date ,
STUFF(
(
SELECT ',' + CONVERT(VARCHAR(500),associatedrole)
FROM @DB_USers user2
WHERE user1.DBName=user2.DBName AND user1.UserName=user2.UserName
FOR XML PATH('')
)
,1,1,'') AS Permissions_user
FROM @DB_USers user1 JOIN #tmpResults ON UserName = [Permission Path]
GROUP BY [mapped login name], dbname,username ,logintype ,create_date ,modify_date
ORDER BY DBName,username


DROP TABLE #tmpResults

> > > > > > 只需查看使用者所在的哪些組在實例上也有登錄名就好了 > > > > > > > > >

您可以使用以下程式碼完成此操作:

exec xp_logininfo 'dom\acc', 'all';

或者您可以模擬該登錄名並像這樣使用 sys.login_token :

exec as login = 'dom\acc';
select distinct name
from sys.login_token
where principal_id > 0
     and type = 'WINDOWS GROUP';
revert;

引用自:https://dba.stackexchange.com/questions/173938