You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何检查用户是否拥有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_ownerdb_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

火山引擎 最新活动