a quais grupos de logins do AD o usuário pertence?


13

Não tenho certeza se escolhi o título certo para esta pergunta. o que realmente quero é que, dado um usuário individual do Windows AD, eu gostaria de descobrir a lista dos grupos do Windows AD (logins) que têm acesso a um banco de dados específico neste servidor

quando executo a seguinte consulta

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

no meu servidor

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 17 de junho de 2011 00:54:03 Direitos autorais (c) Microsoft Corporation Standard Edition (64 bits) no Windows NT 6.1 (Build 7601: Service Pack 1)

Recebo os seguintes resultados (lista parcial):

insira a descrição da imagem aqui

Preciso conhecer todas as permissões que um login específico possui. esse logon tem acesso ao meu servidor / banco de dados através de grupos do AD.

1) a quais grupos do AD, da lista acima, pertence meu logon?

insira a descrição da imagem aqui

Fiz isso abaixo, mas gostaria realmente de descobrir a lista dos grupos do AD (que têm acesso a esse servidor de acordo com a imagem acima) à qual esse usuário pertence.

Primeiro eu executo como o usuário em questão

    EXECUTE AS LOGIN='mycompany\HThorne'

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

certifico-me de que tenho as credenciais corretas

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

Eu vou ao banco de dados específico e uso o fn_my_permissions - executado como o usuário em questão

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

    REVERT

e isso está me dando o resultado abaixo:

insira a descrição da imagem aqui

Respostas:


17

a quais grupos do AD, da lista acima, pertence meu logon?

Tudo que você precisa fazer é executar o seguinte comando:

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

Se a conta não tiver acesso através de nenhum grupo nesse servidor, AND for uma conta legítima no domínio, você não receberá nenhum registro retornado. Se o usuário tiver permissões, você poderá identificar o grupo ao qual tem acesso, marcando o permission path. Isso retornará o grupo domain\groupnameque está dando acesso ao usuário do domínio.


4

Para responder sua pergunta específica, a maneira mais fácil de obter uma lista de grupos do AD aos quais um usuário pertence (do SQL Server) é usar sys.login_token ou sys.user_token .

Você terá que usar o EXECUTE AS LOGIN =que fez acima, mas depois de se passar pelo login, você pode consultar sys.login_tokenpara obter uma lista de grupos aos quais o login pertence. Isso inclui todas as funções no nível do servidor e todos os grupos do AD. Há uma coluna principal_id que se vincula à sys.server_principalsvisualização do sistema. Será preenchido para todas as funções de servidor e para grupos do AD que tenham uma entrada sys.server_principals.

Para obter mais informações específicas do banco de dados, acesse o banco de dados de seu interesse e use-o sys.user_tokenpara obter uma lista de funções / grupos de anúncios associados a esse banco de dados. Nesse caso, principal_id está associado sys.database_principals.


Kenneth, você é uma lenda. Script escrito e salvo!
Oreo

2

Se entendi corretamente, você pode fazer isso com a ajuda do xp_logininfo, que retorna informações sobre usuários e grupos do Windows.

Diga simplesmente executando

EXEC xp_logininfo 'mycompany\HThorne'

Caso contrário, você pode usar a consulta abaixo, que eu tenho usado no meu repositório, não tenho certeza de onde obtive isso :), mas ainda pode ser útil:

;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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.