回答

1

如果您正在查找給定用戶的所有權限路徑,請使用sys.login_token和sys.user_token。

sys.login_token將爲您提供當前服務器主體所屬的所有AD組,這些AD組也被定義爲登錄名。例如,如果AD用戶[域\用戶]是[域\組1]和[域\組2]的成員,並且只有組1被定義爲登錄,則只有組1會出現在列表中。 sys.login_token還將列出登錄所屬的任何服務器級角色。

sys.user_token是一樣的,除了一切都是數據庫作用域。

由於這兩個視圖都是在「當前用戶」的上下文中操作的,因此您需要模擬其他人來查找其權限。語法是很容易的:

execute as login = 'domain\user'; 
select * from sys.login_token; 
select * from sys.user_token; 
revert; 

要獲得已明確授予用戶的任何權限,檢查出的sys.database_permissions和sys.server_permissions。

select * from sys.database_permissions 
where grantee_principal_id = user_id(); 

select * from sys.server_permissions 
where grantee_principal_id = suser_id(); 

最後,如果你不想去通過努力來計算,你可以從不同的路徑拿起所有權限,看看sys.fn_my_permissions。基本的語法是:

select * from sys.fn_my_permissions('dbo.table', 'object'); 
1

使用sys.fn_my_permissions

SELECT * FROM fn_my_permissions (NULL, 'DATABASE'); 

返回調用者的有效權限的列表。

SELECT * FROM fn_my_permissions('ATLY', 'USER'); 

返回名爲'ATLY'的用戶的有效權限列表。

+0

對於任何一個都不完全。第一條語句將返回授予當前用戶的任何數據庫級權限。也就是說,如果有人跑'grant select到[youruser]',那麼這個權限就會出現在這裏。第二,這將返回授予您的用戶對所述用戶的任何權限。也就是說,你會看到諸如「模仿」或「控制」之類的東西。但是,關於這一點,它不會告訴你任何關於用戶可以做什麼和不可以做什麼的事情。 – 2014-10-16 12:39:35

+0

我只是想爲我自己的參考添加一個存儲過程,使用WEXECUTE AS OWNER,如果我需要知道調用者的權限,則使用以下select:select database_user = USER_NAME(),[login] = SUSER_SNAME(),[原始登錄] = ORIGINAL_LOGIN() – 2014-10-20 12:29:59

相關問題