【问题标题】:SQL Server EXECUTE AS misbehaviorSQL Server EXECUTE AS 不当行为
【发布时间】:2020-07-15 05:21:09
【问题描述】:

我有一个用户,我通过以下方式授予访问凭据的权限:

GRANT ALTER ANY CREDENTIAL TO userA

当我使用该用户登录时,以下内容会返回给我数据

SELECT * FROM sys.credentials

我可以看到我拥有 SERVER 级别的权限。这可以通过做来验证

SELECT * FROM fn_my_permissions (NULL, 'SERVER')

使用另一个用户,比如 userB,我通过这样做来模拟 userA

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') 不会返回给我 ALTER ANY CREDENTIAL 权限。
SELECT * FROM sys.credentials 不会返回任何值。
SELECT user_name() 会返回给我 userA。

这里有什么我错过的吗?为什么我不能像 userA 那样从 sys.credentials 中获取数据?

谢谢!

【问题讨论】:

    标签: sql-server tsql impersonation execute-as


    【解决方案1】:

    正如 Mathias 所提到的,我是 Executing AS 用户而不是登录。我必须 GRANT IMPERSONATE ON LOGIN:: 才能让它工作。

    【讨论】:

    【解决方案2】:

    问题可能是,EXECUTE AS 仅授予 UserB 在您正在执行它的数据库上的 UserA 权限,而不是在服务器上授予的权限。 这就是为什么SELECT user_name()显示的是UserA,而SELECT * FROM fn_my_permissions (NULL, 'SERVER')显示的不是UserA的权限,而是UserB的权限。

    微软文档:

    EXECUTE AS (Transact-SQL) “模拟的范围仅限于当前数据库。切换到数据库用户的上下文不会继承该用户的服务器级权限。”

    sys.fn_my_permissions "SELECT * FROM fn_my_permissions(NULL, 'SERVER'); 返回调用者在服务器上的有效权限列表。"

    【讨论】:

    • 谢谢!我想昨晚的编码确实有它的警告。
    猜你喜欢
    • 2010-10-22
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多