SQL 服务器 EXECUTE AS 不当行为
SQL Server EXECUTE AS misbehavior
我有一个用户,我使用以下方式授予了访问凭据的权限:
GRANT ALTER ANY CREDENTIAL TO userA
当我使用该用户登录时,以下return是我的数据
SELECT * FROM sys.credentials
我可以看到我有SERVER级别的权限。这可以通过做
来验证
SELECT * FROM fn_my_permissions (NULL, 'SERVER')
使用另一个用户,比如 userB,我通过做
来模拟用户 A
GRANT IMPERSONATE ON USER::userA TO userB
在存储过程中,当我以 userB 身份登录时,我将上下文切换到 userA
EXECUTE AS user = 'userA'
SELECT user_name() AS ContextUserName
SELECT * FROM fn_my_permissions (NULL, 'SERVER')
SELECT * FROM sys.credentials
SELECT * FROM fn_my_permissions (NULL, 'SERVER')
没有 return 我更改任何凭据权限。
SELECT * FROM sys.credentials
return 我没有任何价值。
SELECT user_name()
return不过我是用户A。
这里有什么我遗漏的吗?为什么我不能像 userA 那样从 sys.credentials 获取数据?
谢谢!
问题可能在于,EXECUTE AS
仅向 UserB 授予 UserA 对您正在执行它的数据库的权限,而不是在服务器上授予的权限。
所以SELECT user_name()
显示的是UserA,而SELECT * FROM fn_my_permissions (NULL, 'SERVER')
显示的不是UserA的权限,而是UserB的权限。
微软文档:
EXECUTE AS (Transact-SQL)
"The scope of impersonation is restricted to the current database. A context switch to a database user does not inherit the server-level permissions of that user."
sys.fn_my_permissions
"SELECT * FROM fn_my_permissions(NULL, 'SERVER');
returns调用者在服务器上的有效权限列表。"
正如 Mathias 提到的,我是 Executing AS
USER 而不是 LOGIN。我必须 GRANT IMPERSONATE ON LOGIN::
才能正常工作。
我有一个用户,我使用以下方式授予了访问凭据的权限:
GRANT ALTER ANY CREDENTIAL TO userA
当我使用该用户登录时,以下return是我的数据
SELECT * FROM sys.credentials
我可以看到我有SERVER级别的权限。这可以通过做
来验证SELECT * FROM fn_my_permissions (NULL, 'SERVER')
使用另一个用户,比如 userB,我通过做
来模拟用户 AGRANT IMPERSONATE ON USER::userA TO userB
在存储过程中,当我以 userB 身份登录时,我将上下文切换到 userA
EXECUTE AS user = 'userA'
SELECT user_name() AS ContextUserName
SELECT * FROM fn_my_permissions (NULL, 'SERVER')
SELECT * FROM sys.credentials
SELECT * FROM fn_my_permissions (NULL, 'SERVER')
没有 return 我更改任何凭据权限。
SELECT * FROM sys.credentials
return 我没有任何价值。
SELECT user_name()
return不过我是用户A。
这里有什么我遗漏的吗?为什么我不能像 userA 那样从 sys.credentials 获取数据?
谢谢!
问题可能在于,EXECUTE AS
仅向 UserB 授予 UserA 对您正在执行它的数据库的权限,而不是在服务器上授予的权限。
所以SELECT user_name()
显示的是UserA,而SELECT * FROM fn_my_permissions (NULL, 'SERVER')
显示的不是UserA的权限,而是UserB的权限。
微软文档:
EXECUTE AS (Transact-SQL) "The scope of impersonation is restricted to the current database. A context switch to a database user does not inherit the server-level permissions of that user."
sys.fn_my_permissions
"SELECT * FROM fn_my_permissions(NULL, 'SERVER');
returns调用者在服务器上的有效权限列表。"
正如 Mathias 提到的,我是 Executing AS
USER 而不是 LOGIN。我必须 GRANT IMPERSONATE ON LOGIN::
才能正常工作。