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_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.