我的用户属于哪个广告组登录?


13

我不确定是否为该问题选择了正确的标题。我真正要追求的是,​​给定单个Windows AD用户,我想找出有权访问此服务器中特定数据库的Windows AD组(登录)的列表。

当我运行以下查询时

select
    name,
    principal_id,
    type,
    type_desc,
    default_schema_name,
    create_date,
    modify_date,
    owning_principal_id,
    sid,
    is_fixed_role
from sys.database_principals

在我的服务器上

Microsoft SQL Server 2008 R2(SP1)-10.50.2500.0(X64)2011年6月17日00:54:03版权所有(c)Windows NT 6.1(Build 7601:Service Pack 1)上的Microsoft Corporation标准版(64位)

我得到以下结果(部分列表):

在此处输入图片说明

我需要知道特定登录名的所有权限。此登录名可以通过AD组访问我的服务器/数据库。

1)从上面的列表中,我的登录名属于哪个广告组?

在此处输入图片说明

我一直在下面进行此操作,但是我真的很想找出该用户所属的AD组(根据上图可以访问此服务器的列表)的列表。

首先,我以相关用户身份执行

    EXECUTE AS LOGIN='mycompany\HThorne'

    DECLARE @User VARCHAR(20)
    SELECT @USER = SUBSTRING(SUSER_SNAME(), 
CHARINDEX('\', SUSER_SNAME()) + 1, LEN(SUSER_SNAME()))

我确保我拥有正确的凭据

    SELECT   @USER 
            , SUSER_SNAME()
            ,SYSTEM_USER
            , USER_NAME()
            , CURRENT_USER
            , ORIGINAL_LOGIN()
            , USER
            ,SESSION_USER

我转到特定的数据库并使用fn_my_permissions-以有问题的用户身份运行

    use WebDataImportStage
    go
    SELECT * FROM fn_my_permissions (NULL, 'DATABASE');
    GO

    REVERT

这就是下面的结果:

在此处输入图片说明

Answers:


17

从上面的列表中,我的登录名属于哪个广告组?

您所需要做的就是执行以下命令:

EXEC xp_logininfo 'domain\useraccount','all';
GO

如果该帐户无权通过该服务器上的任何组访问,并且AND是域中的合法帐户,则不会返回任何记录。如果发现用户具有权限,则可以通过选中来标识他们有权访问的组permission path。这将返回domain\groupname授予域用户访问权限的组。


4

要回答您的特定问题,我发现(从SQL Server)获取用户所属的AD组列表的最简单方法是使用sys.login_tokensys.user_token

您将必须EXECUTE AS LOGIN =像上面一样使用,但是一旦您模拟了登录名,就可以查询sys.login_token以获取该登录名所属的组的列表。这包括任何服务器级别的角色和所有AD组。有一个principal_id列链接到sys.server_principals系统视图。它将为所有服务器角色和在中具有条目的AD组填充sys.server_principals

要获取更多数据库特定信息,您可以转到您感兴趣的数据库,并用于sys.user_token获取与该数据库关联的角色/ AD组的列表。在这种情况下principal_id与关联sys.database_principals


肯尼斯,你是一个传奇。脚本编写并保存!
奥利奥

2

如果我正确理解,则可以在xp_logininfo的帮助下完成此操作,该操作会返回有关Windows用户和Windows组的信息。

只需执行即可说

EXEC xp_logininfo 'mycompany\HThorne'

另外,您可以使用下面的查询来查询我一直在我的存储库中使用的查询,不确定从哪里得到这个:,),但仍然可以有所帮助:

;with ServerPermsAndRoles as
(
    select
        spr.name as principal_name,
        spr.type_desc as principal_type,
        spm.permission_name collate SQL_Latin1_General_CP1_CI_AS as security_entity,
        'permission' as security_type,
        spm.state_desc
    from sys.server_principals spr
    inner join sys.server_permissions spm
    on spr.principal_id = spm.grantee_principal_id
    where spr.type in ('s', 'u')

    union all

    select
        sp.name as principal_name,
        sp.type_desc as principal_type,
        spr.name as security_entity,
        'role membership' as security_type,
        null as state_desc
    from sys.server_principals sp
    inner join sys.server_role_members srm
    on sp.principal_id = srm.member_principal_id
    inner join sys.server_principals spr
    on srm.role_principal_id = spr.principal_id
    where sp.type in ('s', 'u')
)
select *
from ServerPermsAndRoles
order by principal_name
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.