Je ne sais pas si j'ai choisi le bon titre pour cette question. ce que je recherche vraiment, c'est que, étant donné un utilisateur Windows AD individuel, j'aimerais connaître la liste des groupes Windows AD (connexions) qui ont accès à une base de données spécifique sur ce serveur.
quand j'exécute la requête suivante
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
sur mon serveur
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 17 juin 2011 00:54:03 Copyright (c) Microsoft Corporation Standard Edition (64 bits) sur Windows NT 6.1 (Build 7601: Service Pack 1)
J'obtiens les résultats suivants (liste partielle):
J'ai besoin de connaître toutes les autorisations d'une connexion particulière. cette connexion a accès à mon serveur/bases de données via des groupes AD.
1) À quels groupes AD, dans la liste ci-dessus, ma connexion appartient-elle?
Je l'ai fait ci-dessous, mais j'aimerais vraiment connaître la liste des groupes AD (qui ont accès à ce serveur selon l'image ci-dessus) auxquels cet utilisateur appartient.
J'exécute d'abord en tant qu'utilisateur en question
EXECUTE AS LOGIN='mycompany\HThorne'
DECLARE @User VARCHAR(20)
SELECT @USER = SUBSTRING(SUSER_SNAME(),
CHARINDEX('\', SUSER_SNAME()) + 1, LEN(SUSER_SNAME()))
je m'assure que j'ai les bonnes informations d'identification
SELECT @USER
, SUSER_SNAME()
,SYSTEM_USER
, USER_NAME()
, CURRENT_USER
, ORIGINAL_LOGIN()
, USER
,SESSION_USER
Je vais à la base de données spécifique et utilise les fn_my_permissions - exécuter en tant qu'utilisateur en question
use WebDataImportStage
go
SELECT * FROM fn_my_permissions (NULL, 'DATABASE');
GO
REVERT
et cela me donne le résultat ci-dessous:
à quels groupes AD, dans la liste ci-dessus, ma connexion appartient-elle?
Il vous suffit d'exécuter la commande suivante:
EXEC xp_logininfo 'domain\useraccount','all';
GO
Si le compte n'a accès via aucun groupe sur ce serveur, ET est un compte légitime dans le domaine, vous ne recevrez aucun enregistrement. Si l'utilisateur possède des autorisations, vous pouvez identifier le groupe auquel il a accès en vérifiant le permission path
. Cela renverra le groupe domain\groupname
qui donne accès à l'utilisateur du domaine.
Pour répondre à votre question spécifique, le moyen le plus simple que j'ai trouvé pour obtenir une liste des groupes AD auxquels un utilisateur appartient (à partir de SQL Server) consiste à utiliser sys.login_token ou sys.user_token .
Vous devrez utiliser le EXECUTE AS LOGIN =
comme vous l'avez fait ci-dessus, mais une fois que vous vous faites passer pour la connexion, vous pouvez interroger sys.login_token
pour obtenir une liste des groupes auxquels la connexion appartient. Cela inclut tous les rôles au niveau du serveur et tous les groupes AD. Il existe une colonne principal_id qui renvoie à sys.server_principals
vue système. Il sera rempli pour tous les rôles de serveur et pour les groupes AD qui ont une entrée dans sys.server_principals
.
Pour obtenir plus d'informations spécifiques à la base de données, vous pouvez accéder à la base de données qui vous intéresse et utiliser sys.user_token
pour obtenir une liste des rôles/groupes AD associés à cette base de données. Dans ce cas, principal_id est associé à sys.database_principals
.
Si j'ai bien compris, vous pouvez le faire à l'aide de xp_logininfo qui renvoie des informations sur les utilisateurs et les groupes Windows.
Dites en exécutant simplement
EXEC xp_logininfo 'mycompany\HThorne'
Sinon, vous pouvez utiliser la requête ci-dessous que j'utilise depuis mon référentiel, je ne sais pas d'où je l'ai obtenu, :), mais peut toujours être utile:
;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