Beschreibung der Funktion (insgesamt)
Das Skript dient der Inventarisierung und Analyse von Server-Logins in einer SQL Server-Instanz. Es liefert vier verschiedene Listen:
| Abfrage | Beschreibung |
|---|---|
| 1 | Gesamtliste aller benutzerdefinierten Logins (SQL, Windows-Benutzer, Windows-Gruppen) ohne System- und Dienstkonten. Zeigt auch den Aktivierungsstatus. |
| 2 | Nur SQL Server-Authentifizierungs-Logins (z. B. myAppUser). |
| 3 | Nur Windows-Benutzer-Logins (z. B. DOMAIN\john.doe). Ausgeschlossen sind Systemkonten wie NT AUTHORITY\SYSTEM. |
| 4 | Nur Windows-Gruppen-Logins (z. B. DOMAIN\SQLAdmins). |
Typische Anwendungsfälle:
-
Dokumentation der Datenbankzugriffe für Audits.
-
Vorbereitung von Migrationsprojekten (welche Logins existieren?).
-
Sicherheitsüberprüfung (deaktivierte Logins, unerwünschte Systemkonten).
-
Bereinigung verwaister Logins.
Voraussetzung: Mitgliedschaft in der public-Rolle oder VIEW SERVER STATE (für is_disabled reicht public). Die Abfragen arbeiten ausschließlich mit Katalogsichten und sind ab SQL Server 2005 verfügbar.
-- =====================================================================
-- 1. Alle Login-Accounts (SQL, Windows User, Windows Groups)
-- ohne interne System-Logins (##) und ohne Systemkonten (NT AUTHORITY\...)
-- =====================================================================
SELECT
name AS Login_Name,
type_desc AS Account_Type,
CASE WHEN is_disabled = 0 THEN 'Enabled' ELSE 'Disabled' END AS Status
FROM sys.server_principals
WHERE TYPE IN ('U', 'S', 'G')
AND name NOT LIKE '%##%' -- interne SQL-Logins
AND name NOT LIKE 'NT AUTHORITY\%' -- Windows Systemkonten
AND name NOT LIKE 'NT SERVICE\%' -- Windows Dienstkonten
AND principal_id > 4 -- echte Benutzer-Logins (sa hat ID=1, etc.)
ORDER BY type_desc, name;
-- =====================================================================
-- 2. Nur SQL Logins (ohne ##, ohne sa, falls gewünscht)
-- =====================================================================
SELECT
name AS Login_Name,
CASE WHEN is_disabled = 0 THEN 'Enabled' ELSE 'Disabled' END AS Status
FROM sys.server_principals
WHERE TYPE = 'S'
AND name NOT LIKE '%##%'
AND name NOT IN ('sa') -- optional: sa ausschließen
ORDER BY name;
-- =====================================================================
-- 3. Nur Windows-Benutzer-Logins (ohne Gruppen und Systemkonten)
-- =====================================================================
SELECT
name AS Login_Name,
CASE WHEN is_disabled = 0 THEN 'Enabled' ELSE 'Disabled' END AS Status
FROM sys.server_principals
WHERE TYPE = 'U'
AND name NOT LIKE 'NT AUTHORITY\%'
AND name NOT LIKE 'NT SERVICE\%'
ORDER BY name;
-- =====================================================================
-- 4. Nur Windows-Gruppen-Logins
-- =====================================================================
SELECT
name AS Login_Name,
CASE WHEN is_disabled = 0 THEN 'Enabled' ELSE 'Disabled' END AS Status
FROM sys.server_principals
WHERE TYPE = 'G'
AND name NOT LIKE 'NT AUTHORITY\%' -- i.d.R. keine Gruppen, aber sicherheitshalber
ORDER BY name;