à quels groupes AD se connecte mon utilisateur?

13

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):

entrez la description de l'image ici

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?

entrez la description de l'image ici

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écuté 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:

entrez la description de l'image ici

Marcello Miorelli
la source

Réponses:

17

À 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 cochant le permission path. Cela retournera le groupe domain\groupnamequi donne l'accès à l'utilisateur du domaine.


la source
4

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 =code comme vous l'avez fait ci-dessus, mais une fois que vous avez usurpé l'identité de la connexion, vous pouvez interroger sys.login_tokenpour 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 à la sys.server_principalsvue système. Il sera rempli pour tous les rôles de serveur et pour les groupes AD qui ont une entrée 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_tokenpour 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.

Kenneth Fisher
la source
Kenneth, tu es une légende. Script écrit et enregistré!
Oreo du
2

Si j'ai bien compris, vous pouvez le faire avec 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
KASQLDBA
la source