ユーザーが属する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)2011年6月17日00:54:03著作権(c)Windows NT 6.1(ビルド7601:Service Pack 1)上のMicrosoft Corporation Standard Edition(64ビット)

次の結果が得られます(一部のリスト):

ここに画像の説明を入力してください

特定のログインが持つすべての許可を知る必要があります。このログインは、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

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

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

より多くのデータベース固有の情報を取得するには、関心のあるデータベースにアクセスし、sys.user_tokenそのデータベースに関連付けられているロール/ ADグループのリストを取得するために使用できます。この場合、principal_idはに関連付けられていsys.database_principalsます。


ケネス、あなたは伝説です。スクリプトを作成して保存しました!
オレオ

2

正しく理解できれば、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.