web-dev-qa-db-fra.com

à quels groupes AD se connecte mon utilisateur?

Je ne sais pas si j'ai choisi le bon titre pour cette question. ce que je recherche vraiment, c'est que, étant donné un utilisateur Windows AD individuel, j'aimerais connaître la liste des groupes Windows AD (connexions) qui ont accès à une base de données spécifique sur ce serveur.

quand j'exécute la requête suivante

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

sur mon serveur

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 17 juin 2011 00:54:03 Copyright (c) Microsoft Corporation Standard Edition (64 bits) sur Windows NT 6.1 (Build 7601: Service Pack 1)

J'obtiens les résultats suivants (liste partielle):

enter image description here

J'ai besoin de connaître toutes les autorisations d'une connexion particulière. cette connexion a accès à mon serveur/bases de données via des groupes AD.

1) À quels groupes AD, dans la liste ci-dessus, ma connexion appartient-elle?

enter image description here

Je l'ai fait ci-dessous, mais j'aimerais vraiment connaître la liste des groupes AD (qui ont accès à ce serveur selon l'image ci-dessus) auxquels cet utilisateur appartient.

J'exécute d'abord en tant qu'utilisateur en question

    EXECUTE AS LOGIN='mycompany\HThorne'

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

je m'assure que j'ai les bonnes informations d'identification

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

Je vais à la base de données spécifique et utilise les fn_my_permissions - exécuter en tant qu'utilisateur en question

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

    REVERT

et cela me donne le résultat ci-dessous:

enter image description here

13
Marcello Miorelli

à quels groupes AD, dans la liste ci-dessus, ma connexion appartient-elle?

Il vous suffit d'exécuter la commande suivante:

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

Si le compte n'a accès via aucun groupe sur ce serveur, ET est un compte légitime dans le domaine, vous ne recevrez aucun enregistrement. Si l'utilisateur possède des autorisations, vous pouvez identifier le groupe auquel il a accès en vérifiant le permission path. Cela renverra le groupe domain\groupname qui donne accès à l'utilisateur du domaine.

17
user507

Pour répondre à votre question spécifique, le moyen le plus simple que j'ai trouvé pour obtenir une liste des groupes AD auxquels un utilisateur appartient (à partir de SQL Server) consiste à utiliser sys.login_token ou sys.user_token .

Vous devrez utiliser le EXECUTE AS LOGIN = comme vous l'avez fait ci-dessus, mais une fois que vous vous faites passer pour la connexion, vous pouvez interroger sys.login_token pour obtenir une liste des groupes auxquels la connexion appartient. Cela inclut tous les rôles au niveau du serveur et tous les groupes AD. Il existe une colonne principal_id qui renvoie à sys.server_principals vue système. Il sera rempli pour tous les rôles de serveur et pour les groupes AD qui ont une entrée dans sys.server_principals.

Pour obtenir plus d'informations spécifiques à la base de données, vous pouvez accéder à la base de données qui vous intéresse et utiliser sys.user_token pour obtenir une liste des rôles/groupes AD associés à cette base de données. Dans ce cas, principal_id est associé à sys.database_principals.

4
Kenneth Fisher

Si j'ai bien compris, vous pouvez le faire à l'aide de xp_logininfo qui renvoie des informations sur les utilisateurs et les groupes Windows.

Dites en exécutant simplement

EXEC xp_logininfo 'mycompany\HThorne'

Sinon, vous pouvez utiliser la requête ci-dessous que j'utilise depuis mon référentiel, je ne sais pas d'où je l'ai obtenu, :), mais peut toujours être utile:

;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
2
KASQLDBA