未在SQL Server安全组中定义的用户为何能通过Windows凭据登录?
可能的原因分析
Windows组嵌套导致间接权限:该用户可能隶属于某个Windows组,而这个组又嵌套在另一个已被授予SQL Server登录权限的组中。比如用户在GroupA里,GroupA属于GroupB,而GroupB是SQL Server的合法登录账户。如果只检查了直接关联的组或单个用户,没深入嵌套层级,就会看不到权限关联。可以执行以下SQL查询确认:
EXEC sp_helplogins 'DOMAIN\UserName'; SELECT sp.name, sp.type_desc FROM sys.server_principals sp JOIN sys.server_role_members srm ON sp.principal_id = srm.member_principal_id WHERE sp.name LIKE '%DOMAIN%';内置Windows组的默认权限:用户可能是
BUILTIN\Administrators这类内置组的成员,而很多SQL Server实例会默认给这个组分配sysadmin权限。如果没重点排查这类内置系统组,就容易忽略用户的权限来源。数据库权限通过Windows组映射:实例层面的登录账户是某个Windows组,数据库中对应的也是该组的用户(而非单个用户账户)。所以单独搜索用户个人账户时,找不到对应的数据库用户记录,但用户通过组继承了数据库访问权限。可以查询数据库层面的权限关系:
SELECT dp.name, dp.type_desc FROM sys.database_principals dp JOIN sys.database_role_members drm ON dp.principal_id = drm.member_principal_id WHERE dp.type_desc = 'WINDOWS_GROUP';登录账户名称不匹配或被隐藏:用户可能使用了域用户别名登录,或者登录账户的名称与显示名不一致,导致搜索时没匹配到。可以列出所有Windows相关的登录账户逐一排查:
SELECT name, type_desc FROM sys.server_principals WHERE type IN ('U', 'G'); -- U=Windows用户, G=Windows组服务器角色间接赋予权限:用户所在的Windows组被添加到了某个服务器角色(如sysadmin、db_datareader等),权限通过角色继承而来。如果只检查了直接的登录权限,没查看角色成员关系,就会看不到关联。可以查询服务器角色成员:
SELECT sp.name AS 成员账户, sr.name AS 所属角色 FROM sys.server_role_members srm JOIN sys.server_principals sp ON srm.member_principal_id = sp.principal_id JOIN sys.server_principals sr ON srm.role_principal_id = sr.principal_id;
内容的提问来源于stack exchange,提问作者afii_palang
相关产品推荐
相关产品推荐

