¿A qué grupos de AD inicia sesión mi usuario?

13

No estoy seguro de haber elegido el título correcto para esta pregunta. Lo que realmente busco es que, dado un usuario individual de Windows AD, me gustaría encontrar la lista de los grupos de Windows AD (inicios de sesión) que tienen acceso a una base de datos específica en este servidor

cuando ejecuto la siguiente consulta

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

en mi servidor

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 17 de junio de 2011 00:54:03 Copyright (c) Microsoft Corporation Standard Edition (64 bits) en Windows NT 6.1 (Build 7601: Service Pack 1)

Obtengo los siguientes resultados (lista parcial):

ingrese la descripción de la imagen aquí

Necesito saber todos los permisos que tiene un inicio de sesión particular. Este inicio de sesión tiene acceso a mi servidor / bases de datos a través de grupos de AD.

1) ¿a qué grupos de AD, de la lista anterior, pertenece mi inicio de sesión?

ingrese la descripción de la imagen aquí

He estado haciendo esto, a continuación, pero realmente me gustaría encontrar la lista de los grupos de AD (que tienen acceso a este servidor de acuerdo con la imagen de arriba) a la que pertenece este usuario.

Primero ejecuto como el usuario en cuestión

    EXECUTE AS LOGIN='mycompany\HThorne'

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

me aseguro de tener las credenciales correctas

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

Voy a la base de datos específica y utilizo los fn_my_permissions: se ejecuta como el usuario en cuestión

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

    REVERT

y eso me está dando el resultado a continuación:

ingrese la descripción de la imagen aquí

Marcello Miorelli
fuente

Respuestas:

17

¿A qué grupos de AD, de la lista anterior, pertenece mi inicio de sesión?

Todo lo que necesitas hacer es ejecutar el siguiente comando:

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

Si la cuenta no tiene acceso a través de ningún grupo en ese servidor, Y es una cuenta legítima en el dominio, no recibirá ningún registro devuelto. Si se encuentra que el usuario tiene permisos, puede identificar el grupo desde el que tiene acceso marcando el permission path. Esto devolverá el grupo domain\groupnameque le está dando acceso al usuario de dominio.


fuente
4

Para responder a su pregunta específica, la forma más fácil que he encontrado para obtener una lista de grupos de AD a los que pertenece un usuario (desde SQL Server) es usar sys.login_token o sys.user_token .

Tendrá que usar lo EXECUTE AS LOGIN =que hizo anteriormente, pero una vez que se haga pasar por el inicio de sesión, puede consultar sys.login_tokenpara obtener una lista de grupos a los que pertenece el inicio de sesión. Esto incluye cualquier rol de nivel de servidor y todos los grupos de AD. Hay una columna principal_id que enlaza con la sys.server_principalsvista del sistema. Se completará para todas las funciones del servidor y para los grupos de AD que tengan una entrada sys.server_principals.

Para obtener más información específica de la base de datos, puede ir a la base de datos que le interesa y utilizar sys.user_tokenpara obtener una lista de roles / grupos de AD asociados con esa base de datos. En este caso, principal_id está asociado con sys.database_principals.

Kenneth Fisher
fuente
Kenneth, eres una leyenda. Guión escrito y guardado!
Oreo
2

Si entendí correctamente, puede hacerlo con la ayuda de xp_logininfo, que devuelve información sobre los usuarios de Windows y los grupos de Windows.

Diga simplemente ejecutando

EXEC xp_logininfo 'mycompany\HThorne'

De lo contrario, puede usar la consulta a continuación que he estado usando desde mi repositorio, no estoy seguro de dónde obtuve esto, :), pero aún puede ser útil:

;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
fuente