From 5954bdc65c5137115f87d8076084c90b288f978f Mon Sep 17 00:00:00 2001 From: Karl Burtram Date: Tue, 2 May 2023 12:46:18 -0700 Subject: [PATCH] Query logins on system database for Azure connections (#2038) * Query logins on system database for Azure connections * Fix name of connection variable --- .../ObjectTypes/User/UserHandler.cs | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectTypes/User/UserHandler.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectTypes/User/UserHandler.cs index ddea4709..ee5a9d57 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectTypes/User/UserHandler.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectTypes/User/UserHandler.cs @@ -177,6 +177,30 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement } supportedUserTypes.Add(DatabaseUserType.NoLoginAccess); + string[] logins = DatabaseUtils.LoadSqlLogins(dataContainer.ServerConnection); + + // If we couldn't load logins on current connection and this is a SQL DB connection + // not to master then try to connect to master. The "sys.sql_logins" DMV is not visible to user databases. + if (logins.Length == 0 && isSqlAzure + && string.Compare(parameters.Database, "master", true) != 0) + { + ServerConnection masterServerConnection = null; + try + { + originalConnInfo.ConnectionDetails.DatabaseName = "master"; + masterServerConnection = ConnectionService.OpenServerConnection(originalConnInfo, "MasterDataContainer"); + logins = DatabaseUtils.LoadSqlLogins(masterServerConnection); + } + finally + { + originalConnInfo.ConnectionDetails.DatabaseName = originalDatabaseName; + if (masterServerConnection != null) + { + masterServerConnection.Disconnect(); + } + } + } + UserViewInfo userViewInfo = new UserViewInfo() { ObjectInfo = new UserInfo() @@ -193,7 +217,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement UserTypes = supportedUserTypes.ToArray(), Languages = languageOptionsList.ToArray(), Schemas = currentUserPrototype.SchemaNames.ToArray(), - Logins = DatabaseUtils.LoadSqlLogins(dataContainer.ServerConnection), + Logins = logins, DatabaseRoles = currentUserPrototype.DatabaseRoleNames.ToArray() }; var context = new UserViewContext(parameters, dataContainer.ServerConnection, currentUserPrototype.CurrentState);