до яких груп оголошень AD входить мій користувач?


13

Я не впевнений, чи обрав правильну назву для цього питання. те, про що я насправді - це, враховуючи окремого користувача Windows AD, я хотів би дізнатися список груп Windows AD (логінів), які мають доступ до певної бази даних на цьому сервері

коли я запускаю наступний запит

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

на моєму сервері

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 17 червня 2011 00:54:03 Авторські права (c) Стандартна версія Microsoft Corporation (64-розрядна версія) для Windows NT 6.1 (Build 7601: Service Pack 1)

Я отримую такі результати (частковий список):

введіть тут опис зображення

Мені потрібно знати всі дозволи, які має певний логін. цей вхід має доступ до мого сервера / баз даних через групи AD.

1) до яких груп оголошень з наведеного вище списку належить мій логін?

введіть тут опис зображення

Я робив це нижче, але я дуже хотів би дізнатися список груп AD (які мають доступ до цього сервера відповідно до наведеної картини), до якого належить цей користувач.

Спочатку я виконую як відповідний користувач

    EXECUTE AS LOGIN='mycompany\HThorne'

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

я переконуюсь, що я маю правильні дані

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

Я переходжу до конкретної бази даних і використовую fn_my_permissions - запускаю як користувач, про який йде мова

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

    REVERT

і це дає мені результат нижче:

введіть тут опис зображення

Відповіді:


17

до яких груп оголошень з наведеного вище списку належить мій логін?

Все, що вам потрібно зробити, це виконати таку команду:

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

Якщо обліковий запис не має доступу через будь-яку групу на цьому сервері, і це законний обліковий запис у домені, ви не отримаєте жодних записів. Якщо у користувача є дозволи, ви можете визначити групу, до якої він має доступ, перевіривши permission path. Це поверне групу, domain\groupnameяка надає користувачу домену доступ.


4

Щоб відповісти на ваше конкретне запитання, найпростішим способом отримання списку груп AD, до якого належить користувач (із SQL Server), є використання sys.login_token або sys.user_token .

Вам доведеться використовувати так EXECUTE AS LOGIN =само, як ви робили вище, але як тільки ви себе представляєте за входом, ви можете здійснити запит, sys.login_tokenщоб отримати список груп, до яких належить вхід. Сюди входять будь-які ролі серверного рівня та всі групи AD. Існує стовпець main_id, який посилається на подання sys.server_principalsсистеми. Він буде заповнений для всіх ролей сервера та для груп AD, які мають запис sys.server_principals.

Щоб отримати більше інформації, що стосується баз даних, ви можете перейти до бази даних, яка вас цікавить, і використовувати sys.user_tokenдля отримання списку ролей / груп оголошень, пов’язаних із цією базою даних. У цьому випадку glavnih_ід асоціюється з sys.database_principals.


Кеннет, ти легенда. Сценарій написаний і збережений!
Орео

2

Якщо я правильно зрозумів, ви можете зробити це за допомогою xp_logininfo, який повертає інформацію про користувачів Windows та групи Windows.

Скажіть, просто виконавши

EXEC xp_logininfo 'mycompany\HThorne'

В іншому випадку ви можете використовувати нижче запит, який я використовував зі свого сховища, не впевнений, звідки я це взяв, :), але все ще може бути корисним:

;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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.