do jakich loginów grup AD należy mój użytkownik?


13

Nie jestem pewien, czy wybrałem właściwy tytuł dla tego pytania. tak naprawdę chcę, biorąc pod uwagę konkretnego użytkownika Windows AD, chciałbym znaleźć listę grup Windows AD (loginów), które mają dostęp do konkretnej bazy danych na tym serwerze

po uruchomieniu następującego zapytania

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

na moim serwerze

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 17 czerwca 2011 00:54:03 Prawa autorskie (c) Microsoft Corporation Standard Edition (64-bit) na Windows NT 6.1 (kompilacja 7601: Service Pack 1)

Otrzymuję następujące wyniki (częściowa lista):

wprowadź opis zdjęcia tutaj

Muszę znać wszystkie uprawnienia, które ma określony login. ten login ma dostęp do mojego serwera / baz danych poprzez grupy AD.

1) do jakich grup AD, z powyższej listy, należy mój login?

wprowadź opis zdjęcia tutaj

Robiłem to poniżej, ale naprawdę chciałbym znaleźć listę grup AD (które mają dostęp do tego serwera zgodnie z powyższym obrazkiem), do których należy ten użytkownik.

Najpierw wykonuję jako dany użytkownik

    EXECUTE AS LOGIN='mycompany\HThorne'

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

upewniam się, że mam odpowiednie poświadczenia

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

Przechodzę do konkretnej bazy danych i używam uprawnień fn_my_permissions - uruchamianych jako dany użytkownik

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

    REVERT

i to daje mi wynik poniżej:

wprowadź opis zdjęcia tutaj

Odpowiedzi:


17

do jakich grup AD, z powyższej listy, należy mój login?

Wszystko, co musisz zrobić, to wykonać następujące polecenie:

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

Jeśli konto nie ma dostępu przez żadną grupę na tym serwerze, ORAZ jest to legalne konto w domenie, nie otrzymasz żadnych rekordów. Jeśli okaże się, że użytkownik ma uprawnienia, możesz zidentyfikować grupę, do której ma dostęp, zaznaczając permission path. Zwróci to grupę, domain\groupnamektóra daje użytkownikowi domeny dostęp.


4

Aby odpowiedzieć na twoje pytanie, najłatwiejszym sposobem na znalezienie listy grup AD, do których należy użytkownik (z SQL Server), jest użycie sys.login_token lub sys.user_token .

Będziesz musiał użyć tego, EXECUTE AS LOGIN =co zrobiłeś powyżej, ale kiedy podszywasz się pod login, możesz zapytać, sys.login_tokenaby uzyskać listę grup, do których należy login. Obejmuje to wszelkie role na poziomie serwera i wszystkie grupy AD. Istnieje kolumna principal_id, która prowadzi do sys.server_principalswidoku systemu. Zostanie wypełniony dla wszystkich ról serwera i dla grup AD, które mają wpis sys.server_principals.

Aby uzyskać bardziej szczegółowe informacje na temat bazy danych, możesz przejść do bazy danych, którą jesteś zainteresowany, i użyć jej, sys.user_tokenaby uzyskać listę ról / grup AD powiązanych z tą bazą danych. W tym przypadku nazwa_zasadnika jest powiązana z sys.database_principals.


Kenneth, jesteś legendą. Skrypt napisany i zapisany!
Oreo,

2

Jeśli dobrze zrozumiałem, możesz to zrobić za pomocą xp_logininfo, która zwraca informacje o użytkownikach systemu Windows i grupach systemu Windows.

Powiedz po prostu wykonując

EXEC xp_logininfo 'mycompany\HThorne'

W przeciwnym razie możesz użyć poniższego zapytania, którego używałem z mojego repozytorium, nie jestem pewien, skąd go mam, :), ale nadal może być pomocny:

;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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.