sql-server - SQL Server EXECUTE AS 不当行为
问题描述
我有一个用户,我使用以下方式授予访问凭据的权限:
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 中获取数据?
谢谢!
解决方案
问题可能是,这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');
返回调用者在服务器上的有效权限列表。"
推荐阅读
- amazon-web-services - 适用于最终用户的 AWS Rekognition
- android - 发布应用程序中权限更改后的问题
- gradle - 如何使用 kotlin DSL 将系统属性传递给 gradle 测试
- excel - 两个 ListBox - 一个返回空值
- c# - C# API:如何在其他 API 中使用 access_token
- qt - 动态添加到 qml tabbar 和 stacklayout
- c# - 如何手动从机器人向 Microsoft Teams 发送“对话更新”?
- javascript - 来自用户界面的 Spring Boot AJAX POST 请求和 knockout.js 调试错误
- node.js - Node js html-pdf命令不适用于PHP
- javascript - 切换 Bootstrap 导航下拉菜单