Skip to main content

The following script lists all server-level logins, filters out built-in server roles (like sysadmin), and returns the exact status of the login.

-- --------------------------------------------------------------------------------------------------
-- 1. Show login names and their respective types on SQL Server
--
-- The following script lists all server-level logins, filters out built-in
-- server roles (like sysadmin), and returns the exact status of the login:
-- --------------------------------------------------------------------------------------------------

select name as [Login Name],
    type_desc as [Login Type],
    case
        when is_disabled = 1
             then 'Disabled'
        else 'Enabled'
    end as [Status],
    create_date as [Created Date],
    modify_date as [Last Modified]
from sys.server_principals
where type in ('S', 'U', 'G') -- S = SQL Login, U = Windows Login, G = Windows Group
order by name;

-- --------------------------------------------------------------------------------------------------
-- 2. Logins with Database-Level Roles Across All Databases
--
-- Because database users are stored separately inside each individual database,
-- you must query across every database on the instance to map logins to their
-- database roles (like db_owner or db_datareader).
-- --------------------------------------------------------------------------------------------------

create table #DbPermissions (
    [Database Name] sysname not null,
    [Login Name] sysname not null,
    [Login Type] nvarchar(60) not null,
    [Database User] sysname not null,
    [Database Role] sysname not null
);

exec sp_MSforeachdb @command1 = '
USE [?];
INSERT INTO #DbPermissions
SELECT
    DB_NAME(),
    sp.name,
    sp.type_desc,
    dp.name,
    ISNULL(r.name, ''public'')
FROM
    sys.database_principals dp
JOIN
    sys.server_principals sp ON dp.sid = sp.sid
LEFT JOIN
    sys.database_role_members drm ON dp.principal_id = drm.member_principal_id
LEFT JOIN
    sys.database_principals r ON drm.role_principal_id = r.principal_id
WHERE
    sp.type IN (''S'', ''U'', ''G'');
';

select [Database Name],
    [Login Name],
    [Login Type],
    [Database User],
    [Database Role]
from #DbPermissions
order by [Login Name],
    [Database Name];

drop table #DbPermissions;

-- --------------------------------------------------------------------------------------------------
-- 3. Logins with Database-Level Roles Across All Databases including sysadmin Logins & Groups
--
-- To include sysadmin groups and logins in your database audit, you can
-- explicitly pull sysadmin members for every database and union them with the
-- explicit database role assignments:
-- --------------------------------------------------------------------------------------------------

create table #DbPermissions (
    [Database Name] sysname not null,
    [Login Name] sysname not null,
    [Login Type] nvarchar(60) not null,
    [Database User] sysname not null,
    [Database Role] sysname not null
);

exec sp_MSforeachdb @command1 = '
USE [?];

-- 1. Explicit Database Users & Roles
INSERT INTO #DbPermissions
SELECT
    DB_NAME(),
    sp.name,
    sp.type_desc,
    dp.name,
    ISNULL(r.name, ''public'')
FROM
    sys.database_principals dp
JOIN
    sys.server_principals sp ON dp.sid = sp.sid
LEFT JOIN
    sys.database_role_members drm ON dp.principal_id = drm.member_principal_id
LEFT JOIN
    sys.database_principals r ON drm.role_principal_id = r.principal_id
WHERE
    sp.type IN (''S'', ''U'', ''G'')
    AND IS_SRVROLEMEMBER(''sysadmin'', sp.name) = 0

UNION ALL

-- 2. Implicit sysadmin Access (Mapped as dbo)
SELECT
    DB_NAME(),
    sp.name,
    sp.type_desc,
    ''dbo (via sysadmin)'',
    ''sysadmin (Full Control)''
FROM
    sys.server_principals sp
WHERE
    sp.type IN (''S'', ''U'', ''G'')
    AND IS_SRVROLEMEMBER(''sysadmin'', sp.name) = 1;
';

select * from #DbPermissions order by [Login Name], [Database Name];

drop table #DbPermissions;