权限更低的EXECUTE AS USER切换后,如何切回初始登录用户?
问题背景
我们拥有Employees和Sales两个数据库,在新查询编辑器执行以下脚本时,返回结果正确:
select SUSER_SNAME() as user, original_login() as original
返回结果:
user original MyDomain\Bob.Smith MyDomain\Bob.Smith
我创建了仅拥有Sales数据库访问权限的TempUser用户,执行以下查询时触发预期错误:
The server principal "TempUser" is not able to access the DB "Employees" under the current security context.
执行的查询脚本:
EXECUTE AS USER = 'MyDomain\Bob.Smith'; select top 10* From Employees.dbo.NewEmployees EXECUTE AS USER = 'TempUser' GO select top 10* From Employees.dbo.NewEmployees
但尝试执行EXECUTE AS USER = 'MyDomain\Bob.Smith'切回初始登录用户时,出现以下错误:
Cannot execute as the database principal because the principal "MyDomain\Bob.Smith" does not exist, this type of principal cannot be impersonated, or you do not have permission.
问题解答
1. 为何会出现第二个错误?
- 切换到TempUser后,当前会话的安全上下文是仅拥有Sales库权限的数据库用户,TempUser没有权限模拟MyDomain\Bob.Smith这个服务器登录名。
EXECUTE AS USER操作的是数据库用户,而MyDomain\Bob.Smith是服务器登录名,若该登录名未在当前默认的Sales数据库中映射对应的数据库用户,就会提示"主体不存在"。original_login()仅记录初始登录身份,不代表当前上下文具备模拟它的权限。
2. 当前SUSER_SNAME()为'TempUser',如何切回初始登录用户以查询Employees数据库?
有两种可行方案:
- 使用
REVERT命令:如果是通过EXECUTE AS切换的身份,执行REVERT即可回退到上一层安全上下文,多次切换的话需重复执行,直到回到初始登录用户。示例:REVERT; -- 验证身份 select SUSER_SNAME() as current_user, original_login() as original_user; - 重启会话:直接关闭当前查询编辑器,重新打开新会话,新会话会以初始登录身份MyDomain\Bob.Smith连接,自然能访问Employees数据库。
内容的提问来源于stack exchange,提问作者fdkgfosfskjdlsjdlkfsf
相关产品推荐
相关产品推荐

