0

(SQL 2005 または 2008) で、システム テーブルに対してカスタム クエリを実行したり、AD グループ メンバーシップから継承されたものを含め、データベース内の特定のユーザーのすべての権限を表示する sp_help* proc を実行したりすることは可能ですか?

更新 #1

AD グループのメンバーシップ (データベースで権限が付与されている) によって権限を持つすべてのユーザーを表示したいと考えています。[UserA] はAD グループ[SuperUsers] のメンバーであり、[SuperUsers] は SQL ロール db_datareader に属しています。[UserA] に db_datareader 権限が付与されていることを期待しています。(この場合、[UserA] にはデータベースへのアクセス許可が明示的に付与されていません。すべてのアクセス許可はグループ [SuperUsers] から継承されます

これまでに投稿された例をテストするために、データベースに新しいユーザーを追加し、そのログイン名を既知の AD グループに設定し、AD グループに db_datareader を付与しました。私が見たいのは、その AD グループ内のすべての AD ユーザーがこのクエリ内に表示されることです。

投稿された例のいずれを使用しても、この出力は表示されません。彼らは何か違うものを提供していますか、それとも実際に私が望むことをしていますが、私のテスト構成は間違っていますか?

SQL Server が Active Directory グループを列挙できるようにする必要があるため、これは文字通り不可能である可能性があります。

アップデート #2

SQL Server は AD グループ内の AD ユーザーをネイティブに認識していないため、これを実現することはできません。

注: これに関連する別の質問 (ただし、AD ユーザーとグループではなく、SQL Server ユーザーとロールを扱う) は、次の場所にあります。

データベース内のすべてのユーザーのすべての権限/アクセスを検索する SQL Server クエリ

4

3 に答える 3

1

これは有用な出発点かもしれません:

-- Server Pricipals - Who has access to this server?
SELECT 
    'Server Principals'
    , ServerPrincipals.name AS ServerObject
    , ServerPrincipals.type_desc AS ServerObjectType
    , ServerPrincipals.is_disabled AS [Disabled]
FROM sys.server_principals ServerPrincipals
ORDER BY type_desc

-- Server Roles - What server roles do my server logins have?
SELECT 
    'Server Roles'
    , ServerMemberPrincipal.name
    , ServerMemberPrincipal.type_desc
    , ServerRolePrincipal.name
    , ServerRolePrincipal.type_desc
FROM sys.server_role_members ServerRoleMembers
INNER JOIN sys.server_principals ServerMemberPrincipal
    ON ServerRoleMembers.member_principal_id = ServerMemberPrincipal.principal_id
INNER JOIN sys.server_principals ServerRolePrincipal
    ON ServerRoleMembers.role_principal_id = ServerRolePrincipal.principal_id

-- Database Users - Who has access to this database?
SELECT
    'Database Users'
    , UserName = DatabasePrincipal.name
    , UserType = DatabasePrincipal.type_desc
    , LoginName = sp.name
    , LoginType = sp.type_desc
FROM sys.database_principals DatabasePrincipal
INNER JOIN sys.server_principals sp 
    ON DatabasePrincipal.principal_id = sp.principal_id
ORDER BY LoginType, UserName, UserType, LoginName

-- Database Roles - What database roles do the users in this database have?
SELECT
    'Database Roles'
    , DatabaseMemberPrincipal.name
    , DatabaseMemberPrincipal.type_desc
    , DatabaseRolePrincipal.name
    , DatabaseRolePrincipal.type_desc
    , DatabaseRolePrincipal.is_fixed_role
FROM sys.database_role_members DatabaseRoleMembers
INNER JOIN sys.database_principals DatabaseMemberPrincipal
    ON DatabaseRoleMembers.member_principal_id = DatabaseMemberPrincipal.principal_id
INNER JOIN sys.database_principals DatabaseRolePrincipal 
    ON DatabaseRoleMembers.role_principal_id = DatabaseRolePrincipal.principal_id

-- Database Permissions - What can my database users and roles do?  
SELECT
    'Database Permissions'
    , GranteeName = grantee.name
    , [State] = DatabasePermissions.state_desc
    , Granted = DatabasePermissions.permission_name
    , [For] = DatabasePermissions.class_desc
    , [On] = COALESCE(OBJECT_NAME(DatabasePermissions.major_id), XmlSchemaCollection.name, DbName.Name, SymmetricKeys.Name, CertificateName.Name)
    , [By] = grantor.name
FROM sys.database_permissions DatabasePermissions
INNER JOIN sys.database_principals Grantee 
    ON DatabasePermissions.grantee_principal_id = grantee.principal_id
INNER JOIN sys.database_principals Grantor 
    ON DatabasePermissions.grantor_principal_id = grantor.principal_id
LEFT JOIN sys.xml_schema_collections XmlSchemaCollection
    ON XmlSchemaCollection.xml_collection_id = DatabasePermissions.major_id
    AND DatabasePermissions.class_desc = 'XML_SCHEMA_COLLECTION'
OUTER APPLY (SELECT DB_NAME() AS Name WHERE DatabasePermissions.class_desc = 'DATABASE') DbName
LEFT JOIN sys.symmetric_keys SymmetricKeys
    ON SymmetricKeys.symmetric_key_id = DatabasePermissions.major_id
    AND DatabasePermissions.class_desc = 'SYMMETRIC_KEYS'
LEFT JOIN sys.certificates CertificateName
    ON CertificateName.certificate_id = DatabasePermissions.major_id
    AND DatabasePermissions.class_desc = 'CERTIFICATE'
ORDER BY GranteeName, Granted, [For], [On], [State], [By]
于 2012-06-19T19:21:47.547 に答える
1

これは不可能です。

@JeremyPridemore が指摘しているように、SQL Server は AD サービスへの SQLCLR 呼び出しを行わないと AD 情報にアクセスできません。(またはADへの他の形式の呼び出し)

于 2012-06-20T18:25:28.973 に答える