사용자가 속한 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 : 서비스 팩 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.


케네스, 당신은 전설입니다. 스크립트 작성 및 저장!
Oreo

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.