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 name | type | privilege | mapped login name | permission path |
|---|---|---|---|---|
| DOMENA\JanKowalski | user | user | DOMENA\JanKowalski | DOMENA\JanKowalski |
| DOMENA\DB_ReadOnly | group | user | DOMENA\JanKowalski | DOMENA\DB_ReadOnly |
| DOMENA\DB_Developers | group | user | DOMENA\JanKowalski | DOMENA\DB_Developers |
| DOMENA\SQL_Admins | group | admin | DOMENA\JanKowalski | DOMENA\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:
| LoginName | ServerRole |
|---|---|
| DOMENA\SQL_Admins | sysadmin |
| DOMENA\DB_Developers | securityadmin |
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:
| DatabaseRole | MemberName |
|---|---|
| db_datareader | DOMENA\DB_ReadOnly |
| db_datawriter | DOMENA\DB_Developers |
| db_owner | DOMENA\SQL_Admins |
Dzięki temu widać, że DOMENA\JanKowalski:
- przez
DB_ReadOnlyma dostęp do odczytu, - przez
DB_Developersmoże zapisywać, - a przez
SQL_Adminsma 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_logininfowymaga 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_logininfozwróci błąd „Could not obtain information…”, może to oznaczać brak dostępu do kontrolera domeny.