Вывод списка существующих логинов и пользователей SQL Server

14

Я знаю, что мы можем проверить имена входа и определенных пользователей, используя графический интерфейс в SQL Server, но мне интересно, как мы можем сделать эту проверку с помощью скрипта.

Я выполнил запрос ниже, но он показывает Principal_id, который я не уверен, как сопоставить, чтобы получить уровень разрешений.

SELECT * FROM Sys.login_token 

Так есть ли встроенный сохраненный процесс, который может перечислить имена входа и пользователей с их уровнем разрешений ?

Спасибо.

Небо
источник
Определите «уровень разрешений». Права объекта, членство в роли базы данных, членство в роли сервера?
Мрденни
В случае сомнений включите Profiler для Management Studio и посмотрите, что он делает.
Джон Зигель

Ответы:

14

Не уверен, что есть встроенный способ, но попробуйте этот запрос для принципалов сервера:

;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

В основном то, что он делает, он получает разрешения и отказывает, и объединяет его с членством роли. Это должно дать вам краткий обзор безопасности для входа на сервер. Дай мне знать, если это то, что ты ищешь.

Томас Стрингер
источник
Это было очень полезно! Я добавил конкатенацию строк, чтобы «показать мне команду для предоставления / отзыва разрешений для каждого из перечисленных CAST([srvperm].[state_desc] AS VARCHAR(MAX)) + ' ' + CAST(srvperm.[permission_name] AS VARCHAR(MAX)) + ' TO [' + CAST(srvprin.name AS VARCHAR(MAX)) + '];' as GrantQueryимен входа», например, - что помогает реплицировать эти разрешения при миграции сервера :)
NateJ
8

Попробуйте это - здесь будут перечислены пользователи, объекты и разрешения, которые они имеют для этих объектов:

SELECT p.name, o.name, d.*
FROM sys.database_principals AS p
JOIN sys.database_permissions AS d ON d.grantee_principal_id = p.principal_id
JOIN sys.objects AS o ON o.object_id = d.major_id

Вам также следует проверить функцию sys.fn_my_permissions:

http://msdn.microsoft.com/en-us/library/ms188367.aspx

Вот несколько ссылок, которые также должны вам помочь:

РАЗРЕШЕНИЯ: http://msdn.microsoft.com/en-us/library/ms191291.aspx

SYS.DATABASE_PERMISSIONS: http://msdn.microsoft.com/en-us/library/ms188367.aspx

Я надеюсь, это поможет вам.

Mr.Brownstone
источник