Zu welchen AD-Gruppen gehört die Anmeldung meines Benutzers?

13

Ich bin mir nicht sicher, ob ich den richtigen Titel für diese Frage gewählt habe. Was ich wirklich möchte, ist, dass ich bei einem bestimmten Windows AD-Benutzer die Liste der Windows AD-Gruppen (Anmeldungen) herausfinden möchte, die Zugriff auf eine bestimmte Datenbank auf diesem Server haben

wenn ich die folgende Abfrage ausführen

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

in meinem Server

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 17. Juni 2011, 00:54:03 Uhr Copyright (c) Microsoft Corporation Standard Edition (64-Bit) unter Windows NT 6.1 (Build 7601: Service Pack 1)

Ich erhalte folgende Ergebnisse (Teilliste):

Bildbeschreibung hier eingeben

Ich muss alle Berechtigungen eines bestimmten Logins kennen. Dieses Login hat über AD-Gruppen Zugriff auf meine Server / Datenbanken.

1) Zu welchen AD-Gruppen aus der obigen Liste gehört mein Login?

Bildbeschreibung hier eingeben

Ich habe dies unten getan, aber ich möchte wirklich die Liste der AD-Gruppen (die Zugriff auf diesen Server gemäß dem obigen Bild haben) herausfinden, zu denen dieser Benutzer gehört.

Zuerst führe ich als fraglicher User aus

    EXECUTE AS LOGIN='mycompany\HThorne'

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

Ich stelle sicher, dass ich die richtigen Anmeldeinformationen habe

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

Ich gehe zu der spezifischen Datenbank und benutze die fn_my_permissions - als der fragliche Benutzer ausgeführt

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

    REVERT

und das gibt mir das Ergebnis unten:

Bildbeschreibung hier eingeben

Marcello Miorelli
quelle

Antworten:

16

Zu welchen AD-Gruppen aus der obigen Liste gehört mein Login?

Alles was Sie tun müssen, ist den folgenden Befehl auszuführen:

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

Wenn das Konto über keine Gruppe auf diesem Server Zugriff hat und es sich um ein legitimes Konto in der Domäne handelt, werden keine Datensätze zurückgegeben. Wenn der Benutzer über Berechtigungen verfügt, können Sie die Gruppe identifizieren, auf die er Zugriff hat, indem Sie das Kontrollkästchen aktivieren permission path. Dadurch wird die Gruppe zurückgegeben domain\groupname, die dem Domänenbenutzer Zugriff gewährt.


quelle
4

Um Ihre spezifische Frage am einfachsten zu beantworten und eine Liste der AD-Gruppen zu erhalten, zu denen ein Benutzer gehört (von SQL Server), verwenden Sie sys.login_token oder sys.user_token .

Sie müssen das verwenden EXECUTE AS LOGIN = die oben beschriebene Methode verwenden, aber sobald Sie sich als Benutzer ausgeben, können Sie eine Abfrage durchführen sys.login_token, um eine Liste der Gruppen zu erhalten, zu denen der Benutzer gehört. Dies umfasst alle Rollen auf Serverebene und alle AD-Gruppen. Es gibt eine Spalte "principal_id", die mit der sys.server_principalsSystemansicht verknüpft ist. Es wird für alle Serverrollen und für AD-Gruppen mit einem Eintrag in ausgefüllt sys.server_principals.

Um weitere datenbankspezifische Informationen zu erhalten, können Sie die gewünschte Datenbank aufrufen und sys.user_tokeneine Liste der Rollen / AD-Gruppen abrufen, die dieser Datenbank zugeordnet sind. In diesem Fall ist principal_id mit verknüpft sys.database_principals.

Kenneth Fisher
quelle
Kenneth, du bist eine Legende. Skript geschrieben und gespeichert!
Oreo
2

Wenn ich es richtig verstanden habe, kannst du dies mit Hilfe von xp_logininfo erledigen das Informationen über Windows-Benutzer und Windows-Gruppen zurückgibt.

Sprich durch einfaches Ausführen

EXEC xp_logininfo 'mycompany\HThorne'

Andernfalls können Sie die folgende Abfrage verwenden, die ich aus meinem Repository verwendet habe, nicht sicher, woher ich das habe, :), aber sie kann trotzdem hilfreich sein:

;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
quelle