Aby sprawdzić, do jakich grup domenowych (AD) należy login z Active Directory w MS SQL Server, możesz to zrobić na kilka sposobów — w zależności od tego, czy masz dostęp z poziomu T-SQL
Poniżej przedstawiam najczęstsze metody.

1. Sprawdzenie grup AD z poziomu SQL Server (T-SQL)

Jeśli jesteś zalogowany do SQL Server przy użyciu konta domenowego (np. DOMAIN\UserName), możesz użyć funkcji systemowych:

-- Sprawdza wszystkie grupy, do których należy aktualny login

EXEC xp_logininfo NULL, 'all';

Ta komenda zwróci listę:

  • loginów Windows,
  • grup domenowych,
  • typ członkostwa (np. member, direct).

Filtr dla konkretnego użytkownika:

Jeśli chcesz sprawdzić konkretnego loginu (np. DOMAIN\FooUserName):

EXEC xp_logininfo 'DOMAIN\FooUserName', 'all';

Wynik zawiera kolumny:

  • account name – nazwa konta lub grupy,
  • type – typ obiektu (user / group),
  • privilege – np. admin, user,
  • mapped login name – login w SQL Server,
  • permission path – pokazuje, przez jaką grupę AD login uzyskuje dostęp.

2. Sprawdzenie bezpośrednich grup (tylko jedna warstwa)

Jeśli chcesz tylko sprawdzić, czy użytkownik należy do konkretnej grupy, możesz użyć:

EXEC xp_logininfo 'DOMAIN\SQLAdmins', 'members';

Wynik pokaże wszystkich użytkowników i konta należące do tej grupy (bez rozwijania zagnieżdżeń).

3. Sprawdzenie grup i ścieżki dostępu (na poziomie serwera)

Zaczynamy od sprawdzenia, przez które grupy AD użytkownik uzyskuje dostęp do SQL Servera:

EXEC xp_logininfo 'DOMENA\JanKowalski', 'all';

Przykładowy wynik:

account nametypeprivilegemapped login namepermission path
DOMENA\JanKowalskiuseruserDOMENA\JanKowalskiDOMENA\JanKowalski
DOMENA\DB_ReadOnlygroupuserDOMENA\JanKowalskiDOMENA\DB_ReadOnly
DOMENA\DB_DevelopersgroupuserDOMENA\JanKowalskiDOMENA\DB_Developers
DOMENA\SQL_AdminsgroupadminDOMENA\JanKowalskiDOMENA\SQL_Admins

4. Sprawdzenie, jakie role ma login na poziomie serwera

Dla loginu (czy to użytkownika, czy grupy AD) możesz sprawdzić role serwerowe:

SELECT l.name AS LoginName, r.name AS ServerRole
FROM sys.server_role_members rm
JOIN sys.server_principals r ON rm.role_principal_id = r.principal_id
JOIN sys.server_principals l ON rm.member_principal_id = l.principal_id
WHERE l.name LIKE 'DOMENA\JanKowalski%';

Wynik przykładowy:

LoginNameServerRole
DOMENA\SQL_Adminssysadmin
DOMENA\DB_Developerssecurityadmin

To pokazuje, że np. użytkownik DOMENA\JanKowalski poprzez grupę DOMENA\SQL_Admins ma uprawnienia sysadmin.


5. Sprawdzenie ról w konkretnej bazie danych

Po wejściu do danej bazy (np. USE MyDatabase), możesz sprawdzić role przypisane użytkownikowi lub grupie:

USE MyDatabase;
GO

SELECT dp1.name AS DatabaseRole, dp2.name AS MemberName
FROM sys.database_role_members drm
JOIN sys.database_principals dp1 ON drm.role_principal_id = dp1.principal_id
JOIN sys.database_principals dp2 ON drm.member_principal_id = dp2.principal_id
WHERE dp2.name LIKE 'DOMENA\JanKowalski%';

Przykładowy wynik:

DatabaseRoleMemberName
db_datareaderDOMENA\DB_ReadOnly
db_datawriterDOMENA\DB_Developers
db_ownerDOMENA\SQL_Admins

Dzięki temu widać, że DOMENA\JanKowalski:

  • przez DB_ReadOnly ma dostęp do odczytu,
  • przez DB_Developers może zapisywać,
  • a przez SQL_Admins ma pełne uprawnienia (db_owner).

6. Sprawdzenie, które role dotyczą konkretnego użytkownika (z uwzględnieniem grup AD)

Można to połączyć z xp_logininfo, by uzyskać pełny obraz:

-- Wyciągnięcie wszystkich grup, przez które użytkownik ma dostęp
drop table if exists #groups

--nazwy ze spacjami tak jak zwraca xp_loginfo
create table #Groups  (
   [account name] NVARCHAR(256) 
  ,[type] nvarchar(10)
  ,[privilege] nvarchar(50)
  ,[mapped login name] nvarchar(100)
  ,[permission path] nvarchar(100)
);

INSERT INTO #Groups
EXEC xp_logininfo 'DOMENA\JanKowalski', 'all';

SELECT dp1.name COLLATE Polish_CI_AS AS DatabaseRole
          , dp2.name COLLATE Polish_CI_AS AS MemberName
FROM sys.database_role_members drm
JOIN sys.database_principals dp1 ON drm.role_principal_id = dp1.principal_id
JOIN sys.database_principals dp2 ON drm.member_principal_id = dp2.principal_id
WHERE dp2.name COLLATE Polish_CI_AS IN (SELECT [Account Name]  COLLATE Polish_CI_AS 
                                                                        FROM #Groups);  -- już bez konfliktu

SELECT dp1.name COLLATE Polish_CI_AS AS DatabaseRole
          , dp2.name COLLATE Polish_CI_AS AS MemberName
FROM sys.database_role_members drm
JOIN sys.database_principals dp1 ON drm.role_principal_id = dp1.principal_id
JOIN sys.database_principals dp2 ON drm.member_principal_id = dp2.principal_id
WHERE dp2.name COLLATE Polish_CI_AS IN (SELECT [permission path]  COLLATE Polish_CI_AS 
                                                                       FROM #Groups);  -- już bez konfliktu

To automatycznie pokaże wszystkie role, które użytkownik/grupa ma bezpośrednio lub pośrednio przez grupy domenowe.

7. Dodatkowe wskazówki

  • xp_logininfo wymaga uprawnień sysadmin albo securityadmin.
  • W środowiskach z wieloma zagnieżdżeniami grup, T-SQL może nie pokazać wszystkich poziomów — PowerShell jest dokładniejszy.
  • Jeśli xp_logininfo zwróci błąd „Could not obtain information…”, może to oznaczać brak dostępu do kontrolera domeny.


Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl