web-dev-qa-db-ja.com

ユーザーが属するADグループのログイン

この質問に適切なタイトルを選択したかどうかはわかりません。私が実際に求めているのは、個々の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)Jun 17 2011 00:54:03 Copyright(c)Microsoft Corporation Standard Edition(64-bit)on Windows NT 6.1(Build 7601:Service Pack 1)

次の結果(部分的なリスト)が表示されます。

enter image description here

特定のログインが持つすべての権限を知る必要があります。このログインは、ADグループを介してサーバー/データベースにアクセスできます。

1)上記のリストから、私のログインはどのADグループに属していますか?

enter image description here

私はこれを以下で行っていますが、このユーザーが属する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

そしてそれは私に以下の結果を与えています:

enter image description here

13

上記のリストから、私のログインはどのADグループに属していますか?

次のコマンドを実行するだけです。

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

アカウントがそのサーバーのグループを介してアクセスできず、かつドメイン内の正当なアカウントである場合、レコードは返されません。ユーザーに権限があることが判明した場合は、permission pathを確認することで、ユーザーがアクセスできるグループを特定できます。これにより、ドメインユーザーにアクセス権を付与しているグループdomain\groupnameが返されます。

17
user507

特定の質問に回答するには、ユーザーが(SQL Serverから)ADグループのリストを取得する最も簡単な方法は、 sys.login_token または sys.user_token

上記と同じようにEXECUTE AS LOGIN =を使用する必要がありますが、ログインを偽装したら、sys.login_tokenをクエリして、ログインが属するグループのリストを取得できます。これには、すべてのサーバーレベルの役割とすべてのADグループが含まれます。 sys.server_principalsシステムビューにリンクするprincipal_id列があります。すべてのサーバーの役割、およびsys.server_principalsにエントリがあるADグループについて入力されます。

データベース固有の詳細情報を取得するには、目的のデータベースに移動し、sys.user_tokenを使用して、そのデータベースに関連付けられているロール/ ADグループのリストを取得します。この場合、principal_idはsys.database_principalsに関連付けられています。

4
Kenneth Fisher

私が正しく理解していれば、WindowsユーザーとWindowsグループに関する情報を返す xp_logininfo の助けを借りてこれを行うことができます。

単に実行して言う

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
2
KASQLDBA