Grup AD apa yang masuk dengan login milik saya?

13

Saya tidak yakin apakah saya telah memilih judul yang tepat untuk pertanyaan ini. apa yang saya benar-benar setelah adalah, diberikan pengguna windows AD individu, saya ingin mengetahui daftar kelompok windows AD (login) yang memiliki akses ke database tertentu di server ini

ketika saya menjalankan query berikut

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

di server saya

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 17 Juni 2011 00:54:03 Hak Cipta (c) Microsoft Corporation Edisi Standar (64-bit) pada Windows NT 6.1 (Build 7601: Paket Layanan 1)

Saya mendapatkan hasil berikut (daftar parsial):

masukkan deskripsi gambar di sini

Saya perlu tahu semua izin yang dimiliki login tertentu. login ini memiliki akses ke server / database saya melalui grup AD.

1) Grup AD apa, dari daftar di atas, milik login saya?

masukkan deskripsi gambar di sini

Saya telah melakukan ini, di bawah, tetapi saya benar-benar ingin mengetahui daftar grup AD (yang memiliki akses ke server ini sesuai dengan gambar di atas) yang menjadi milik pengguna ini.

Pertama saya jalankan sebagai pengguna yang dimaksud

    EXECUTE AS LOGIN='mycompany\HThorne'

    DECLARE @User VARCHAR(20)
    SELECT @USER = SUBSTRING(SUSER_SNAME(), 
CHARINDEX('\', SUSER_SNAME()) + 1, LEN(SUSER_SNAME()))

saya memastikan bahwa saya memiliki kredensial yang tepat

    SELECT   @USER 
            , SUSER_SNAME()
            ,SYSTEM_USER
            , USER_NAME()
            , CURRENT_USER
            , ORIGINAL_LOGIN()
            , USER
            ,SESSION_USER

Saya pergi ke database spesifik dan menggunakan fn_my_permissions - jalankan sebagai pengguna yang dimaksud

    use WebDataImportStage
    go
    SELECT * FROM fn_my_permissions (NULL, 'DATABASE');
    GO

    REVERT

dan itu memberi saya hasil di bawah ini:

masukkan deskripsi gambar di sini

Marcello Miorelli
sumber

Jawaban:

17

grup AD apa, dari daftar di atas, milik login saya?

Yang perlu Anda lakukan adalah menjalankan perintah berikut:

EXEC xp_logininfo 'domain\useraccount','all';
GO

Jika akun tidak memiliki akses melalui grup apa pun di server itu, DAN adalah akun yang sah dalam domain, Anda tidak akan mendapatkan catatan yang dikembalikan. Jika pengguna ditemukan memiliki izin, Anda dapat mengidentifikasi grup tempat mereka memiliki akses dengan memeriksa permission path. Ini akan mengembalikan grup domain\groupnameyang memberikan akses pengguna domain.


sumber
4

Untuk menjawab pertanyaan spesifik Anda, cara termudah yang saya temukan untuk mendapatkan daftar grup AD milik pengguna (dari SQL Server) adalah dengan menggunakan sys.login_token atau sys.user_token .

Anda harus menggunakan EXECUTE AS LOGIN =seperti yang Anda lakukan di atas, tetapi begitu Anda menyamar sebagai login, Anda dapat meminta sys.login_tokenuntuk mendapatkan daftar grup milik login. Ini termasuk peran level server dan semua grup AD. Ada kolom principal_id yang menautkan ke tampilan sys.server_principalssistem. Ini akan diisi untuk semua peran server dan untuk grup AD yang memiliki entri sys.server_principals.

Untuk mendapatkan lebih banyak informasi spesifik basis data, Anda dapat mengunjungi basis data yang Anda minati dan gunakan sys.user_tokenuntuk mendapatkan daftar peran / grup AD yang terkait dengan basis data itu. Dalam hal ini principal_id dikaitkan dengan sys.database_principals.

Kenneth Fisher
sumber
Kenneth, kamu adalah legenda. Script ditulis dan disimpan!
Oreo
2

Jika saya mengerti dengan benar, Anda bisa menyelesaikannya dengan bantuan xp_logininfo yang mengembalikan informasi tentang pengguna Windows dan grup Windows.

Katakan dengan hanya menjalankan

EXEC xp_logininfo 'mycompany\HThorne'

Selain itu, Anda dapat menggunakan kueri di bawah ini yang telah saya gunakan dari repositori saya, tidak yakin dari mana saya mendapatkan ini, :), tetapi masih bisa membantu:

;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
KASQLDBA
sumber