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;