如何检查用户是否拥有IMPERSONATE权限及执行EXECUTE AS语句的能力?
嘿,我来给你分享几个精准的查询方法,帮你确认SQL Server里某个用户是否拥有IMPERSONATE权限,以及能不能执行EXECUTE AS语句。毕竟权限来源可能有好几种情况——显式授予、角色继承,或者本身是sa身份,所以得全方位检查:
1. 查询显式授予的IMPERSONATE权限
IMPERSONATE权限可以针对服务器登录名或数据库用户分别授予,所以分两种场景查询:
检查服务器级别的IMPERSONATE权限(针对登录名)
USE master; SELECT grantee_principal.name AS [User/Login Name], grantor_principal.name AS [Grantor Name], permission_name, class_desc, state_desc FROM sys.server_permissions JOIN sys.server_principals grantee_principal ON sys.server_permissions.grantee_principal_id = grantee_principal.principal_id WHERE permission_name = 'IMPERSONATE' AND grantee_principal.name = N'YourLoginName'; -- 替换成要检查的登录名
检查数据库级别的IMPERSONATE权限(针对数据库用户)
USE YourDatabaseName; -- 替换成目标数据库名 SELECT grantee_principal.name AS [Database User Name], grantor_principal.name AS [Grantor Name], permission_name, class_desc, state_desc FROM sys.database_permissions JOIN sys.database_principals grantee_principal ON sys.database_permissions.grantee_principal_id = grantee_principal.principal_id WHERE permission_name = 'IMPERSONATE' AND grantee_principal.name = N'YourUserName'; -- 替换成要检查的数据库用户
2. 检查是否属于sysadmin角色或拥有sa身份
sysadmin固定服务器角色的成员默认拥有所有服务器级权限,包括IMPERSONATE和执行EXECUTE AS;而sa本身就是sysadmin角色的默认成员,权限最高。
查询是否在sysadmin角色中
USE master; SELECT sp.name AS [Login Name], sp.type_desc FROM sys.server_principals sp JOIN sys.server_role_members srm ON sp.principal_id = srm.member_principal_id JOIN sys.server_principals spr ON srm.role_principal_id = spr.principal_id WHERE spr.name = N'sysadmin' AND sp.name = N'YourLoginName'; -- 替换成要检查的登录名
直接检查是否为sa登录
USE master; SELECT name, is_disabled FROM sys.server_principals WHERE name = N'sa' AND name = N'YourLoginName';
3. 实际验证能否执行EXECUTE AS
有时候权限可能存在继承或隐性规则,直接测试是最准确的方式:
测试模拟登录名
BEGIN TRY EXECUTE AS LOGIN = N'TargetLoginName'; -- 替换成要模拟的目标登录名 PRINT '✅ 成功执行 EXECUTE AS LOGIN'; REVERT; -- 还原回原身份 END TRY BEGIN CATCH PRINT '❌ 执行 EXECUTE AS LOGIN 失败: ' + ERROR_MESSAGE(); END CATCH
测试模拟数据库用户
USE YourDatabaseName; -- 替换成目标数据库名 BEGIN TRY EXECUTE AS USER = N'TargetUserName'; -- 替换成要模拟的目标数据库用户 PRINT '✅ 成功执行 EXECUTE AS USER'; REVERT; -- 还原回原身份 END TRY BEGIN CATCH PRINT '❌ 执行 EXECUTE AS USER 失败: ' + ERROR_MESSAGE(); END CATCH
4. 检查是否通过数据库角色继承权限
部分数据库角色(比如db_owner、db_securityadmin)的成员在数据库内拥有隐性的IMPERSONATE权限,你可以这样查询:
USE YourDatabaseName; -- 替换成目标数据库名 SELECT dp.name AS [Database User], dr.name AS [Database Role] FROM sys.database_principals dp JOIN sys.database_role_members drm ON dp.principal_id = drm.member_principal_id JOIN sys.database_principals dr ON drm.role_principal_id = dr.principal_id WHERE dr.name IN (N'db_owner', N'db_securityadmin') AND dp.name = N'YourUserName'; -- 替换成要检查的数据库用户
把这些查询结合起来,就能全面精准地判断用户的IMPERSONATE权限和EXECUTE AS执行能力啦。
内容的提问来源于stack exchange,提问作者Dmitrij Kultasev




