web-dev-qa-db-ja.com

ADグループメンバーシップを介してデータベースにアクセスできるユーザーを確認する

SharePointには、「権限の確認」ボタンがあります。ここでActive Directoryからユーザーを選択すると、グループを魔法のように走査し、ユーザーが所属するグループに基づいて、ユーザーがサイトで持っているすべてのアクセスを表示します。

SQL Serverをかなり長い間使用していて、これについて聞いたことがないので、これはロングショットですが、念のために何かを見逃してしまいました...

SQL Serverで同様のものはありますか?現在、権限を確認するには、インスタンスにログインしているADグループを確認し、ADを手動で調べて、誰がどのグループに属しているかを確認してから、データベース権限を手動で確認します。 SharePointのような「権限の確認」により、多くの時間を節約できます。

4
SomeGuy

ここで提案を、私が横になっていた古いスクリプトと組み合わせることができました。これにより、ユーザーが属しているすべてのグループと、それらがマップされているデータベースロールが表示されます。これは完全にはテストされていませんが、必要な結果が得られたことに注意してください。

-- SHOW PERMISSIONS FOR A USER BASED ON MEMBERSHIP IN AD GROUPS ONLY
DECLARE @LoginName varchar(50)
SET @LoginName = 'DOMAIN\USERNAME'



CREATE TABLE #tmpResults
(
[account name] sysname,
[type] char(8),
privilege char(9),
[mapped login name] sysname,
[permission path] sysname NULL
)

INSERT INTO #tmpResults
exec xp_logininfo @LoginName, 'all'

-------------------
DECLARE @DB_USers TABLE
(DBName sysname, UserName sysname, LoginType sysname, AssociatedRole varchar(max),create_date datetime,modify_date datetime)

INSERT @DB_USers
EXEC sp_MSforeachdb

'
use [?]
SELECT ''?'' AS DB_Name,
case prin.name when ''dbo'' then prin.name + '' (''+ (select SUSER_SNAME(owner_sid) from master.sys.databases where name =''?'') + '')'' else prin.name end AS UserName,
prin.type_desc AS LoginType,
isnull(USER_NAME(mem.role_principal_id),'''') AS AssociatedRole ,create_date,modify_date
FROM sys.database_principals prin
LEFT OUTER JOIN sys.database_role_members mem ON prin.principal_id=mem.member_principal_id
WHERE prin.sid IS NOT NULL and prin.sid NOT IN (0x00) and
prin.is_fixed_role <> 1 AND prin.name NOT LIKE ''##%'''

SELECT dbname,username, [mapped login name],logintype ,create_date ,modify_date ,
 STUFF(
 (
 SELECT ',' + CONVERT(VARCHAR(500),associatedrole)
 FROM @DB_USers user2
 WHERE user1.DBName=user2.DBName AND user1.UserName=user2.UserName
 FOR XML PATH('')
 )
 ,1,1,'') AS Permissions_user
 FROM @DB_USers user1 JOIN #tmpResults ON UserName = [Permission Path]
 GROUP BY [mapped login name], dbname,username ,logintype ,create_date ,modify_date
 ORDER BY DBName,username


 DROP TABLE #tmpResults
1
SomeGuy

ユーザーがどのグループに属していて、インスタンスにログインしているのかを確認するだけでもいいでしょう

これは、次のコードを使用して実現できます。

exec xp_logininfo 'dom\acc', 'all';

または、そのログインになりすまして、次のようにsys.login_tokenを使用することもできます。

exec as login = 'dom\acc';
select distinct name
from sys.login_token
where principal_id > 0
      and type = 'WINDOWS GROUP';
revert;
1
sepupic

現時点でこれを行う唯一の方法は、Active Directoryへのリンクサーバーを作成することです。その後、Openqueryを介してADにクエリを実行するストアドプロシージャを作成できます。

Example: 
Create your proc with parameters for specific groups 
CREATE PROC usp_FindADMemembers 
(
@GroupName varchar(50), 
@OrgUnit varchar(50) 
)

AS
Declare @sqlcmd varchar(4000)

SET @sqlcmd = 'SELECT LastName, FirstName, DomainName --whatever fields you want
                 FROM OPENQUERY((YOURSERVERNAME,'
        + '''SELECT GivenName,sAMAccountName  --whatever fields you require
FROM ''''LDAP://DC=YOURDOMAIN,DC=YOURDOMAIN''''
WHERE objectCategory = ''''Person'''' AND objectClass = ''''user''''
AND memberOf=''''CN=' + @groupName + ',OU=Groups,OU=' + @OrganizationalUnit
        + ',DC=YOURDOMAIN,DC=YOURDOMAIN'''' ''' + ')'

EXEC(@sqlcmd)

お役に立てれば

0
JustADBA

はい、それを行うことは完全に可能です。あなたはmustでユーザーを偽装します EXECUTE AS そして HAS_PERMS_BY_NAME または sys.fn_my_permissions

ADをトラバースしたり、許可をリバースエンジニアリングしたりしないでください sys.dataabse_permissions

0
Remus Rusanu