この質問に適切なタイトルを選択したかどうかはわかりません。私が実際に求めているのは、個々の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)
次の結果(部分的なリスト)が表示されます。
特定のログインが持つすべての権限を知る必要があります。このログインは、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
そしてそれは私に以下の結果を与えています:
上記のリストから、私のログインはどのADグループに属していますか?
次のコマンドを実行するだけです。
EXEC xp_logininfo 'domain\useraccount','all';
GO
アカウントがそのサーバーのグループを介してアクセスできず、かつドメイン内の正当なアカウントである場合、レコードは返されません。ユーザーに権限があることが判明した場合は、permission path
を確認することで、ユーザーがアクセスできるグループを特定できます。これにより、ドメインユーザーにアクセス権を付与しているグループdomain\groupname
が返されます。
特定の質問に回答するには、ユーザーが(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
に関連付けられています。
私が正しく理解していれば、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