using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using System; using System.Collections.Generic; using System.Linq; using System.Web; using Tango.Core.DB; namespace Tango.Web.SMO { public class SmoManager : IDisposable { private ServerConnection _connection; private Server _server; private static Random random = new Random(); public SmoManager() { _connection = new ServerConnection(WebConfig.DB_ADDRESS, WebConfig.DB_USER_NAME, WebConfig.DB_PASSWORD); _server = new Server(_connection); } public DbCredentials CreateRandomLoginAndUser() { var database = _server.Databases.OfType().SingleOrDefault(x => x.Name == WebConfig.DB_CATALOG); String userName = GetRandomString(36); String password = System.Web.Security.Membership.GeneratePassword(16, 2); Login login = new Login(_server, userName); login.LoginType = LoginType.SqlLogin; login.DefaultDatabase = WebConfig.DB_CATALOG; login.PasswordPolicyEnforced = false; login.Create(password); User user = new User(database, userName); user.Login = userName; user.Create(); user.AddToRole("db_datareader"); // Have to add this permission so user can view column definitions (default values etc..) !!! DatabasePermissionSet dbPermSet = new DatabasePermissionSet(); dbPermSet.Add(DatabasePermission.ViewDefinition); database.Grant(dbPermSet, user.Name); return new DbCredentials() { UserName = userName, Password = password }; } public void DeleteLoginAndUser(String userName) { var database = _server.Databases.OfType().SingleOrDefault(x => x.Name == WebConfig.DB_CATALOG); var user = database.Users.OfType().SingleOrDefault(x => x.Name == userName); if (user != null) { user.Drop(); } Login login = _server.Logins.OfType().SingleOrDefault(x => x.Name == userName); if (login != null) { login.Drop(); } } public string GetRandomString(int length) { const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; return "TEMP_" + new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray()); } public void Dispose() { _connection.Disconnect(); } } }