回答

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

相关问题