Sql-Server
查看誰可以通過 AD 組成員訪問數據庫
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;