Source/NuGetGallery.Operations/Tasks/Database/ListSqlUserTask.cs (53 lines of code) (raw):
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NuGetGallery.Operations.Tasks.Database
{
[Command("listsqluser", "Lists SQL Users and access", AltName = "lsu")]
public class ListSqlUserTask : DatabaseTask
{
public override void ExecuteCommand()
{
ISet<string> dbUsers = null;
ISet<string> sqlLogins = null;
WithMasterConnection((c, db) =>
{
sqlLogins = new HashSet<string>(db.Query<string>("SELECT name FROM sys.sql_logins"));
});
WithConnection((c, db) =>
{
dbUsers = new HashSet<string>(db.Query<string>("SELECT name FROM sys.database_principals WHERE type = 'S'"));
});
Debug.Assert(dbUsers != null && sqlLogins != null);
var sa = sqlLogins.SingleOrDefault(s => s.EndsWith("sa", StringComparison.Ordinal));
Log.Info("SA Login Name: {0}", sa);
var pairs = dbUsers.Where(s => sqlLogins.Contains(s));
Log.Info("SQL Logins with an associated DB User:");
foreach (var pair in pairs)
{
Log.Info("* {0}", pair);
}
var orphanedLogins = sqlLogins.Except(dbUsers).Except(new [] { sa });
if (orphanedLogins.Any())
{
Log.Info("'Orphaned' Logins that should be deleted:");
foreach (var login in orphanedLogins)
{
Log.Info("* {0}", login);
}
}
var orphanedUsers = dbUsers.Except(sqlLogins).Except(new[] { "dbo", "guest", "INFORMATION_SCHEMA", "sys" });
if (orphanedUsers.Any())
{
Log.Info("DB Users without an attached SQL Login that should be deleted:");
foreach (var user in orphanedUsers)
{
Log.Info("* {0}", user);
}
}
}
}
}