в какие группы 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 Standard Edition (64-разрядная версия) в Windows NT 6.1 (сборка 7601: пакет обновления 1)

Я получаю следующие результаты (неполный список):

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

Мне нужно знать все разрешения, которые имеет конкретный логин. этот логин имеет доступ к моему серверу / базам данных через группы AD.

1) к каким группам AD из моего списка относится мой логин?

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

Ниже я делаю это, но мне бы очень хотелось узнать список групп 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

к каким группам AD из приведенного выше списка относится мой логин?

Все, что вам нужно сделать, это выполнить следующую команду:

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. Существует столбец Principal_id, который связан с sys.server_principalsсистемным представлением. Он будет заполнен для всех ролей сервера и для групп AD, в которых есть запись sys.server_principals.

Для получения дополнительной информации о базе данных вы можете перейти к интересующей вас базе данных и использовать ее sys.user_tokenдля получения списка ролей / групп AD, связанных с этой базой данных. В этом случае Principal_id ассоциируется с sys.database_principals.

Кеннет Фишер
источник
Кеннет, ты легенда. Сценарий написан и сохранен!
Oreo
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
KASQLDBA
источник