diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs index f15a1b1c..a273af30 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs @@ -20,8 +20,8 @@ namespace WebsitePanel.EnterpriseServer { using System.Diagnostics; using WebsitePanel.Providers.RemoteDesktopServices; using WebsitePanel.Providers.Common; - using WebsitePanel.EnterpriseServer.Base.RDS; using WebsitePanel.Providers.HostedSolution; + using WebsitePanel.EnterpriseServer.Base.RDS; /// @@ -139,6 +139,8 @@ namespace WebsitePanel.EnterpriseServer { private System.Threading.SendOrPostCallback ShadowSessionOperationCompleted; + private System.Threading.SendOrPostCallback ImportCollectionOperationCompleted; + /// public esRemoteDesktopServices() { this.Url = "http://localhost:9002/esRemoteDesktopServices.asmx"; @@ -306,6 +308,9 @@ namespace WebsitePanel.EnterpriseServer { /// public event ShadowSessionCompletedEventHandler ShadowSessionCompleted; + /// + public event ImportCollectionCompletedEventHandler ImportCollectionCompleted; + /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetRdsCollection", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] public RdsCollection GetRdsCollection(int collectionId) { @@ -2723,6 +2728,50 @@ namespace WebsitePanel.EnterpriseServer { } } + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/ImportCollection", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ResultObject ImportCollection(int itemId, string collectionName) { + object[] results = this.Invoke("ImportCollection", new object[] { + itemId, + collectionName}); + return ((ResultObject)(results[0])); + } + + /// + public System.IAsyncResult BeginImportCollection(int itemId, string collectionName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("ImportCollection", new object[] { + itemId, + collectionName}, callback, asyncState); + } + + /// + public ResultObject EndImportCollection(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ResultObject)(results[0])); + } + + /// + public void ImportCollectionAsync(int itemId, string collectionName) { + this.ImportCollectionAsync(itemId, collectionName, null); + } + + /// + public void ImportCollectionAsync(int itemId, string collectionName, object userState) { + if ((this.ImportCollectionOperationCompleted == null)) { + this.ImportCollectionOperationCompleted = new System.Threading.SendOrPostCallback(this.OnImportCollectionOperationCompleted); + } + this.InvokeAsync("ImportCollection", new object[] { + itemId, + collectionName}, this.ImportCollectionOperationCompleted, userState); + } + + private void OnImportCollectionOperationCompleted(object arg) { + if ((this.ImportCollectionCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.ImportCollectionCompleted(this, new ImportCollectionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// public new void CancelAsync(object userState) { base.CancelAsync(userState); @@ -4132,4 +4181,30 @@ namespace WebsitePanel.EnterpriseServer { } } } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void ImportCollectionCompletedEventHandler(object sender, ImportCollectionCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class ImportCollectionCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal ImportCollectionCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ResultObject Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ResultObject)(this.results[0])); + } + } + } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs index b2388d93..88bb4567 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs @@ -137,7 +137,7 @@ namespace WebsitePanel.EnterpriseServer } public static List GetCollectionRdsServers(int collectionId) - { + { return GetCollectionRdsServersInternal(collectionId); } @@ -304,12 +304,7 @@ namespace WebsitePanel.EnterpriseServer public static List GetRdsServices() { return GetRdsServicesInternal(); - } - - private static List GetRdsServicesInternal() - { - return ObjectUtils.CreateListFromDataSet(DataProvider.GetServicesByGroupName(SecurityContext.User.UserId, ResourceGroups.RDS)); - } + } public static string GetRdsSetupLetter(int itemId, int? accountId) { @@ -336,6 +331,80 @@ namespace WebsitePanel.EnterpriseServer return ShadowSessionInternal(itemId, sessionId, control); } + public static ResultObject ImportCollection(int itemId, string collectionName) + { + return ImportCollectionInternal(itemId, collectionName); + } + + private static ResultObject ImportCollectionInternal(int itemId, string collectionName) + { + var result = TaskManager.StartResultTask("REMOTE_DESKTOP_SERVICES", "SHADOW_RDS_SESSION"); + + try + { + Organization org = OrganizationController.GetOrganization(itemId); + + if (org == null) + { + result.IsSuccess = false; + result.AddError("IMPORT_RDS_COLLECTION", new NullReferenceException("Organization not found")); + + return result; + } + + var existingCollections = GetRdsCollectionsPaged(itemId, "", "", "", 0, Int32.MaxValue).Collections; + + if (existingCollections.Select(e => e.Name.ToLower()).Contains(collectionName.ToLower())) + { + result.IsSuccess = false; + throw new InvalidOperationException(string.Format("Collection {0} already exists in database", collectionName)); + } + + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); + var collection = rds.GetExistingCollection(collectionName); + var newCollection = new RdsCollection + { + Name = collection.CollectionName, + Description = collection.Description, + DisplayName = collection.CollectionName + }; + + newCollection.Id = DataProvider.AddRDSCollection(itemId, newCollection.Name, newCollection.Description, newCollection.DisplayName); + newCollection.Settings = RemoteDesktopServicesHelpers.ParseCollectionSettings(collection.CollectionSettings); + newCollection.Settings.RdsCollectionId = newCollection.Id; + newCollection.Settings.Id = DataProvider.AddRdsCollectionSettings(newCollection.Settings); + var existingSessionHosts = GetRdsServersPagedInternal("", "", "", 1, 1000).Servers; + RemoteDesktopServicesHelpers.FillSessionHosts(collection.SessionHosts, existingSessionHosts, newCollection.Id, itemId); + newCollection.Servers = ObjectUtils.CreateListFromDataReader(DataProvider.GetRDSServersByCollectionId(newCollection.Id)).ToList(); + UserInfo user = PackageController.GetPackageOwner(org.PackageId); + var organizationUsers = OrganizationController.GetOrganizationUsersPaged(itemId, null, null, null, 0, Int32.MaxValue).PageUsers.Select(u => u.SamAccountName.Split('\\').Last().ToLower()); + var newUsers = organizationUsers.Where(x => collection.UserGroups.Select(a => a.PropertyValue.ToString().Split('\\').Last().ToLower()).Contains(x)); + + rds.ImportCollection(org.OrganizationId, newCollection, newUsers.ToArray()); + + var emptySettings = RemoteDesktopServicesHelpers.GetEmptyGpoSettings(); + string xml = RemoteDesktopServicesHelpers.GetSettingsXml(emptySettings); + DataProvider.UpdateRdsServerSettings(newCollection.Id, string.Format("Collection-{0}-Settings", newCollection.Id), xml); + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + if (!result.IsSuccess) + { + TaskManager.CompleteResultTask(result); + } + else + { + TaskManager.CompleteResultTask(); + } + } + + return result; + } + private static ResultObject ShadowSessionInternal(int itemId, string sessionId, bool control) { var result = TaskManager.StartResultTask("REMOTE_DESKTOP_SERVICES", "SHADOW_RDS_SESSION"); @@ -352,7 +421,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); rds.ShadowSession(sessionId, control); } catch (Exception ex) @@ -405,10 +474,10 @@ namespace WebsitePanel.EnterpriseServer try { var collection = ObjectUtils.FillObjectFromDataReader(DataProvider.GetRDSCollectionById(serverId)); - var rds = GetRemoteDesktopServices(GetRdsServiceId(collection.ItemId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(GetRdsServiceId(collection.ItemId)); Organization org = OrganizationController.GetOrganization(collection.ItemId); rds.ApplyGPO(org.OrganizationId, collection.Name, settings); - string xml = GetSettingsXml(settings); + string xml = RemoteDesktopServicesHelpers.GetSettingsXml(settings); DataProvider.UpdateRdsServerSettings(serverId, settingsName, xml); @@ -442,8 +511,8 @@ namespace WebsitePanel.EnterpriseServer { return null; } - - string result = EvaluateMailboxTemplate(body, org, accountId, itemId); + + string result = RemoteDesktopServicesHelpers.EvaluateMailboxTemplate(body, org, accountId, itemId); return user.HtmlMail ? result : result.Replace("\n", "
"); } @@ -492,9 +561,9 @@ namespace WebsitePanel.EnterpriseServer { to = user.Email; } - - subject = EvaluateMailboxTemplate(subject, org, accountId, itemId); - body = EvaluateMailboxTemplate(body, org, accountId, itemId); + + subject = RemoteDesktopServicesHelpers.EvaluateMailboxTemplate(subject, org, accountId, itemId); + body = RemoteDesktopServicesHelpers.EvaluateMailboxTemplate(body, org, accountId, itemId); return MailHelper.SendMessage(from, to, cc, subject, body, priority, isHtml); } @@ -506,7 +575,7 @@ namespace WebsitePanel.EnterpriseServer try { int serviceId = GetRdsServiceId(rdsServer.ItemId); - var rds = GetRemoteDesktopServices(serviceId); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(serviceId); var certificate = GetRdsCertificateByServiceIdInternal(serviceId); var array = Convert.FromBase64String(certificate.Hash); @@ -605,7 +674,7 @@ namespace WebsitePanel.EnterpriseServer result.AddError("", new NullReferenceException("Organization not found")); } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); rds.GetCollection(collection.Name); } @@ -630,8 +699,8 @@ namespace WebsitePanel.EnterpriseServer { return result; } - - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); var organizationUsers = OrganizationController.GetOrganizationUsersPaged(collection.ItemId, null, null, null, 0, Int32.MaxValue).PageUsers; var organizationAdmins = rds.GetRdsCollectionLocalAdmins(org.OrganizationId, collection.Name); @@ -655,7 +724,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); var servers = ObjectUtils.CreateListFromDataReader(DataProvider.GetRDSServersByCollectionId(collection.Id)).ToList(); rds.SaveRdsCollectionLocalAdmins(users.Select(u => u.AccountName).ToArray(), servers.Select(s => s.FqdName).ToArray(), org.OrganizationId, collection.Name); @@ -730,7 +799,7 @@ namespace WebsitePanel.EnterpriseServer return -1; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); foreach(var server in collection.Servers) { @@ -744,41 +813,15 @@ namespace WebsitePanel.EnterpriseServer throw TaskManager.WriteError(new Exception(string.Format("Unable to connect to {0} server.", server.FqdName))); } } - - collection.Name = GetFormattedCollectionName(collection.DisplayName, org.OrganizationId); - collection.Settings = new RdsCollectionSettings - { - DisconnectedSessionLimitMin = 0, - ActiveSessionLimitMin = 0, - IdleSessionLimitMin = 0, - BrokenConnectionAction = BrokenConnectionActionValues.Disconnect.ToString(), - AutomaticReconnectionEnabled = true, - TemporaryFoldersDeletedOnExit = true, - TemporaryFoldersPerSession = true, - ClientDeviceRedirectionOptions = string.Join(",", new List - { - ClientDeviceRedirectionOptionValues.AudioVideoPlayBack.ToString(), - ClientDeviceRedirectionOptionValues.AudioRecording.ToString(), - ClientDeviceRedirectionOptionValues.SmartCard.ToString(), - ClientDeviceRedirectionOptionValues.Clipboard.ToString(), - ClientDeviceRedirectionOptionValues.Drive.ToString(), - ClientDeviceRedirectionOptionValues.PlugAndPlayDevice.ToString() - }.ToArray()), - ClientPrinterRedirected = true, - ClientPrinterAsDefault = true, - RDEasyPrintDriverEnabled = true, - MaxRedirectedMonitors = 16, - EncryptionLevel = EncryptionLevel.ClientCompatible.ToString(), - SecurityLayer = SecurityLayerValues.Negotiate.ToString(), - AuthenticateUsingNLA = true - }; + collection.Name = RemoteDesktopServicesHelpers.GetFormattedCollectionName(collection.DisplayName, org.OrganizationId); + collection.Settings = RemoteDesktopServicesHelpers.GetDefaultCollectionSettings(); rds.CreateCollection(org.OrganizationId, collection); - var defaultGpoSettings = GetDefaultGpoSettings(); + var defaultGpoSettings = RemoteDesktopServicesHelpers.GetDefaultGpoSettings(); rds.ApplyGPO(org.OrganizationId, collection.Name, defaultGpoSettings); collection.Id = DataProvider.AddRDSCollection(itemId, collection.Name, collection.Description, collection.DisplayName); - string xml = GetSettingsXml(defaultGpoSettings); + string xml = RemoteDesktopServicesHelpers.GetSettingsXml(defaultGpoSettings); DataProvider.UpdateRdsServerSettings(collection.Id, string.Format("Collection-{0}-Settings", collection.Id), xml); collection.Settings.RdsCollectionId = collection.Id; @@ -824,7 +867,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); var existingServers = ObjectUtils.CreateListFromDataReader(DataProvider.GetRDSServersByCollectionId(collection.Id)).ToList(); var removedServers = existingServers.Where(x => !collection.Servers.Select(y => y.Id).Contains(x.Id)); @@ -876,8 +919,8 @@ namespace WebsitePanel.EnterpriseServer result.AddError("", new NullReferenceException("Organization not found")); return result; } - - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); rds.EditRdsCollectionSettings(collection); var collectionSettings = ObjectUtils.FillObjectFromDataReader(DataProvider.GetRdsCollectionSettingsByCollectionId(collection.Id)); @@ -948,7 +991,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); var servers = ObjectUtils.CreateListFromDataReader(DataProvider.GetRDSServersByCollectionId(collection.Id)).ToArray(); rds.RemoveCollection(org.OrganizationId, collection.Name, servers); @@ -991,7 +1034,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); result.AddRange(rds.GetAvailableRemoteApplications(collectionName)); } @@ -1027,7 +1070,7 @@ namespace WebsitePanel.EnterpriseServer foreach (var tmpServer in tmpServers) { - FillRdsServerData(tmpServer); + RemoteDesktopServicesHelpers.FillRdsServerData(tmpServer); } result.Servers = tmpServers.ToArray(); @@ -1046,7 +1089,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(organization.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(organization.PackageId)); var userSessions = rds.GetRdsUserSessions(collection.Name).ToList(); var organizationUsers = OrganizationController.GetOrganizationUsersPaged(collection.ItemId, null, null, null, 0, Int32.MaxValue).PageUsers; @@ -1074,7 +1117,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); var existingServers = rds.GetServersExistingInCollections(); DataSet ds = DataProvider.GetRDSServersPaged(null, null, filterColumn, filterValue, sortColumn, startRow, maximumRows); @@ -1100,7 +1143,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); result = rds.GetRdsCollectionSessionHosts(collection.Name).ToList(); return result; @@ -1157,7 +1200,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); var rdsServer = GetRdsServer(rdsSeverId); @@ -1189,32 +1232,7 @@ namespace WebsitePanel.EnterpriseServer } return result; - } - - private static int GetOrganizationRdsUsersCountInternal(int itemId) - { - return DataProvider.GetOrganizationRdsUsersCount(itemId); - } - - private static int GetOrganizationRdsServersCountInternal(int itemId) - { - return DataProvider.GetOrganizationRdsServersCount(itemId); - } - - private static int GetOrganizationRdsCollectionsCountInternal(int itemId) - { - return DataProvider.GetOrganizationRdsCollectionsCount(itemId); - } - - private static List GetCollectionRdsServersInternal(int collectionId) - { - return ObjectUtils.CreateListFromDataReader(DataProvider.GetRDSServersByCollectionId(collectionId)).ToList(); - } - - private static List GetOrganizationRdsServersInternal(int itemId) - { - return ObjectUtils.CreateListFromDataReader(DataProvider.GetRDSServersByItemId(itemId)).ToList(); - } + } private static ResultObject AddRdsServerInternal(RdsServer rdsServer) { @@ -1223,7 +1241,7 @@ namespace WebsitePanel.EnterpriseServer try { int serviceId = GetRdsMainServiceId(); - var rds = GetRemoteDesktopServices(serviceId); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(serviceId); if (rds.CheckRDSServerAvaliable(rdsServer.FqdName)) { @@ -1275,7 +1293,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); if (!rds.CheckSessionHostFeatureInstallation(rdsServer.FqdName)) { @@ -1320,7 +1338,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); rds.RemoveSessionHostServerFromCollection(org.OrganizationId, rdsCollection.Name, rdsServer); @@ -1387,7 +1405,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); RdsServer rdsServer = GetRdsServer(serverId); rds.MoveRdsServerToTenantOU(rdsServer.FqdName, org.OrganizationId); @@ -1428,7 +1446,7 @@ namespace WebsitePanel.EnterpriseServer } var rdsServer = ObjectUtils.FillObjectFromDataReader(DataProvider.GetRDSServerById(rdsServerId)); - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); rds.RemoveRdsServerFromTenantOU(rdsServer.FqdName, org.OrganizationId); DataProvider.RemoveRDSServerFromOrganization(rdsServerId); } @@ -1498,7 +1516,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); var collection = GetRdsCollection(collectionId); @@ -1571,7 +1589,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); var collection = ObjectUtils.FillObjectFromDataReader(DataProvider.GetRDSCollectionById(collectionId)); var users = rds.GetApplicationUsers(collection.Name, remoteApp.Alias); result.AddRange(users); @@ -1594,7 +1612,7 @@ namespace WebsitePanel.EnterpriseServer } var collection = ObjectUtils.FillObjectFromDataReader(DataProvider.GetRDSCollectionById(collectionId)); - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); rds.SetApplicationUsers(collection.Name, remoteApp, users.ToArray()); } catch (Exception ex) @@ -1631,8 +1649,8 @@ namespace WebsitePanel.EnterpriseServer return result; } - - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); rds.LogOffRdsUser(unifiedSessionId, hostServer); } catch (Exception ex) @@ -1669,7 +1687,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); if (!string.IsNullOrEmpty(remoteApp.Alias)) { @@ -1696,41 +1714,7 @@ namespace WebsitePanel.EnterpriseServer } return result; - } - - private static RdsServerInfo GetRdsServerInfoInternal(int? itemId, string fqdnName) - { - int serviceId = GetRdsServiceId(itemId); - var result = new RdsServerInfo(); - - if (serviceId != -1) - { - var rds = GetRemoteDesktopServices(serviceId); - result = rds.GetRdsServerInfo(fqdnName); - } - - return result; - } - - private static string GetRdsServerStatusInternal(int? itemId, string fqdnName) - { - var result = "Unavailable"; - var serviceId = GetRdsServiceId(itemId); - - try - { - if (serviceId != -1) - { - var rds = GetRemoteDesktopServices(serviceId); - result = rds.GetRdsServerStatus(fqdnName); - } - } - catch - { - } - - return result; - } + } private static ResultObject ShutDownRdsServerInternal(int? itemId, string fqdnName) { @@ -1742,7 +1726,7 @@ namespace WebsitePanel.EnterpriseServer if (serviceId != -1) { - var rds = GetRemoteDesktopServices(serviceId); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(serviceId); rds.ShutDownRdsServer(fqdnName); } } @@ -1775,7 +1759,7 @@ namespace WebsitePanel.EnterpriseServer if (serviceId != -1) { - var rds = GetRemoteDesktopServices(serviceId); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(serviceId); rds.RestartRdsServer(fqdnName); } } @@ -1810,7 +1794,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); result.AddRange(rds.GetCollectionRemoteApplications(collectionName)); @@ -1832,7 +1816,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); rds.RemoveRemoteApplication(collection.Name, application); } @@ -1869,7 +1853,7 @@ namespace WebsitePanel.EnterpriseServer return result; } - var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId)); var collection = GetRdsCollection(collectionId); @@ -1911,35 +1895,7 @@ namespace WebsitePanel.EnterpriseServer } return result; - } - - private static RdsCollection FillRdsCollection(RdsCollection collection) - { - collection.Servers = GetCollectionRdsServers(collection.Id) ?? new List(); - - return collection; - } - - private static RdsServer FillRdsServerData(RdsServer server) - { - server.Address = GetServerIp(server.FqdName).ToString(); - - return server; - } - - private static System.Net.IPAddress GetServerIp(string hostname, AddressFamily addressFamily = AddressFamily.InterNetwork) - { - var address = GetServerIps(hostname); - - return address.FirstOrDefault(x => x.AddressFamily == addressFamily); - } - - private static IEnumerable GetServerIps(string hostname) - { - var address = Dns.GetHostAddresses(hostname); - - return address; - } + } private static ResultObject DeleteRemoteDesktopServiceInternal(int itemId) { @@ -1980,49 +1936,43 @@ namespace WebsitePanel.EnterpriseServer return result; } - private static int GetRemoteDesktopServiceID(int packageId) + private static int GetOrganizationRdsUsersCountInternal(int itemId) { - return PackageController.GetPackageServiceId(packageId, ResourceGroups.RDS); - } - - private static int GetRdsServiceId(int? itemId) - { - int serviceId = -1; - - if (itemId.HasValue) - { - Organization org = OrganizationController.GetOrganization(itemId.Value); - - if (org == null) - { - return serviceId; - } - - serviceId = GetRemoteDesktopServiceID(org.PackageId); - } - else - { - serviceId = GetRdsMainServiceId(); - } - - return serviceId; + return DataProvider.GetOrganizationRdsUsersCount(itemId); } - private static RemoteDesktopServices GetRemoteDesktopServices(int serviceId) + private static int GetOrganizationRdsServersCountInternal(int itemId) { - var rds = new RemoteDesktopServices(); - ServiceProviderProxy.Init(rds, serviceId); - - return rds; + return DataProvider.GetOrganizationRdsServersCount(itemId); } - private static int GetRdsMainServiceId() + private static int GetOrganizationRdsCollectionsCountInternal(int itemId) { - var settings = SystemController.GetSystemSettings(WebsitePanel.EnterpriseServer.SystemSettings.RDS_SETTINGS); + return DataProvider.GetOrganizationRdsCollectionsCount(itemId); + } + + private static List GetCollectionRdsServersInternal(int collectionId) + { + return ObjectUtils.CreateListFromDataReader(DataProvider.GetRDSServersByCollectionId(collectionId)).ToList(); + } + + private static List GetOrganizationRdsServersInternal(int itemId) + { + return ObjectUtils.CreateListFromDataReader(DataProvider.GetRDSServersByItemId(itemId)).ToList(); + } + + private static List GetRdsServicesInternal() + { + return ObjectUtils.CreateListFromDataSet(DataProvider.GetServicesByGroupName(SecurityContext.User.UserId, ResourceGroups.RDS)); + } + + protected static int GetRdsMainServiceId() + { + var settings = SystemController.GetSystemSettings(WebsitePanel.EnterpriseServer.SystemSettings.RDS_SETTINGS); if (!string.IsNullOrEmpty(settings["RdsMainController"])) { - return Convert.ToInt32(settings["RdsMainController"]); + return Convert.ToInt32(settings["RdsMainController"]); } var rdsServices = GetRdsServicesInternal(); @@ -2035,146 +1985,68 @@ namespace WebsitePanel.EnterpriseServer return -1; } - private static string GetFormattedCollectionName(string displayName, string organizationId) + protected static RdsCollection FillRdsCollection(RdsCollection collection) { - return string.Format("{0}-{1}", organizationId, displayName.Replace(" ", "_")); + collection.Servers = GetCollectionRdsServersInternal(collection.Id) ?? new List(); + + return collection; } - private static string EvaluateMailboxTemplate(string template, Organization org, int? accountId, int itemId) + protected static int GetRdsServiceId(int? itemId) { - OrganizationUser user = null; + int serviceId = -1; - if (accountId.HasValue) + if (itemId.HasValue) { - user = OrganizationController.GetAccount(itemId, accountId.Value); - } + Organization org = OrganizationController.GetOrganization(itemId.Value); - Hashtable items = new Hashtable(); - items["Organization"] = org; - - if (user != null) - { - items["account"] = user; - } - - return PackageController.EvaluateTemplate(template, items); - } - - private static RdsServerSettings GetDefaultGpoSettings() - { - var defaultSettings = UserController.GetUserSettings(SecurityContext.User.UserId, UserSettings.RDS_POLICY); - var settings = new RdsServerSettings(); - - settings.Settings.Add(new RdsServerSetting - { - PropertyName = RdsServerSettings.LOCK_SCREEN_TIMEOUT, - PropertyValue = defaultSettings[RdsServerSettings.LOCK_SCREEN_TIMEOUT_VALUE], - ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.LOCK_SCREEN_TIMEOUT_ADMINISTRATORS]), - ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.LOCK_SCREEN_TIMEOUT_USERS]) - }); - - settings.Settings.Add(new RdsServerSetting - { - PropertyName = RdsServerSettings.REMOVE_RUN_COMMAND, - PropertyValue = "", - ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.REMOVE_RUN_COMMAND_ADMINISTRATORS]), - ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.REMOVE_RUN_COMMAND_USERS]) - }); - - settings.Settings.Add(new RdsServerSetting - { - PropertyName = RdsServerSettings.REMOVE_POWERSHELL_COMMAND, - PropertyValue = "", - ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.REMOVE_POWERSHELL_COMMAND_ADMINISTRATORS]), - ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.REMOVE_POWERSHELL_COMMAND_USERS]) - }); - - settings.Settings.Add(new RdsServerSetting - { - PropertyName = RdsServerSettings.HIDE_C_DRIVE, - PropertyValue = "", - ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.HIDE_C_DRIVE_ADMINISTRATORS]), - ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.HIDE_C_DRIVE_USERS]) - }); - - settings.Settings.Add(new RdsServerSetting - { - PropertyName = RdsServerSettings.REMOVE_SHUTDOWN_RESTART, - PropertyValue = "", - ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.REMOVE_SHUTDOWN_RESTART_ADMINISTRATORS]), - ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.REMOVE_SHUTDOWN_RESTART_USERS]) - }); - - settings.Settings.Add(new RdsServerSetting - { - PropertyName = RdsServerSettings.DISABLE_TASK_MANAGER, - PropertyValue = "", - ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.DISABLE_TASK_MANAGER_ADMINISTRATORS]), - ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.DISABLE_TASK_MANAGER_USERS]) - }); - - settings.Settings.Add(new RdsServerSetting - { - PropertyName = RdsServerSettings.CHANGE_DESKTOP_DISABLED, - PropertyValue = "", - ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.CHANGE_DESKTOP_DISABLED_ADMINISTRATORS]), - ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.CHANGE_DESKTOP_DISABLED_USERS]) - }); - - settings.Settings.Add(new RdsServerSetting - { - PropertyName = RdsServerSettings.SCREEN_SAVER_DISABLED, - PropertyValue = "", - ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.SCREEN_SAVER_DISABLED_ADMINISTRATORS]), - ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.SCREEN_SAVER_DISABLED_USERS]) - }); - - settings.Settings.Add(new RdsServerSetting - { - PropertyName = RdsServerSettings.RDS_VIEW_WITHOUT_PERMISSION, - PropertyValue = "", - ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.RDS_VIEW_WITHOUT_PERMISSION_ADMINISTRATORS]), - ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.RDS_VIEW_WITHOUT_PERMISSION_Users]) - }); - - settings.Settings.Add(new RdsServerSetting - { - PropertyName = RdsServerSettings.RDS_CONTROL_WITHOUT_PERMISSION, - PropertyValue = "", - ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.RDS_CONTROL_WITHOUT_PERMISSION_ADMINISTRATORS]), - ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.RDS_CONTROL_WITHOUT_PERMISSION_Users]) - }); - - settings.Settings.Add(new RdsServerSetting - { - PropertyName = RdsServerSettings.DISABLE_CMD, - PropertyValue = "", - ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.DISABLE_CMD_ADMINISTRATORS]), - ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.DISABLE_CMD_USERS]) - }); - - return settings; - } - - private static string GetSettingsXml(RdsServerSettings settings) - { - XmlDocument doc = new XmlDocument(); - XmlElement nodeProps = doc.CreateElement("properties"); - - if (settings != null) - { - foreach (var setting in settings.Settings) + if (org == null) { - XmlElement nodeProp = doc.CreateElement("property"); - nodeProp.SetAttribute("name", setting.PropertyName); - nodeProp.SetAttribute("value", setting.PropertyValue); - nodeProp.SetAttribute("applyUsers", setting.ApplyUsers ? "1" : "0"); - nodeProp.SetAttribute("applyAdministrators", setting.ApplyAdministrators ? "1" : "0"); - nodeProps.AppendChild(nodeProp); + return serviceId; + } + + serviceId = RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId); + } + else + { + serviceId = GetRdsMainServiceId(); + } + + return serviceId; + } + + private static RdsServerInfo GetRdsServerInfoInternal(int? itemId, string fqdnName) + { + int serviceId = GetRdsServiceId(itemId); + var result = new RdsServerInfo(); + + if (serviceId != -1) + { + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(serviceId); + result = rds.GetRdsServerInfo(fqdnName); + } + + return result; + } + + private static string GetRdsServerStatusInternal(int? itemId, string fqdnName) + { + var result = "Unavailable"; + var serviceId = GetRdsServiceId(itemId); + + try + { + if (serviceId != -1) + { + var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(serviceId); + result = rds.GetRdsServerStatus(fqdnName); } } + catch + { + } - return nodeProps.OuterXml; - } + return result; + } } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesHelpers.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesHelpers.cs new file mode 100644 index 00000000..e18e9a73 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesHelpers.cs @@ -0,0 +1,357 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Text; +using System.Xml; +using WebsitePanel.EnterpriseServer.Base.RDS; +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.RemoteDesktopServices; + +namespace WebsitePanel.EnterpriseServer +{ + public class RemoteDesktopServicesHelpers + { + public static string GetFormattedCollectionName(string displayName, string organizationId) + { + return string.Format("{0}-{1}", organizationId, displayName.Replace(" ", "_")); + } + + public static string EvaluateMailboxTemplate(string template, Organization org, int? accountId, int itemId) + { + OrganizationUser user = null; + + if (accountId.HasValue) + { + user = OrganizationController.GetAccount(itemId, accountId.Value); + } + + Hashtable items = new Hashtable(); + items["Organization"] = org; + + if (user != null) + { + items["account"] = user; + } + + return PackageController.EvaluateTemplate(template, items); + } + + public static RdsCollectionSettings GetDefaultCollectionSettings() + { + return new RdsCollectionSettings + { + DisconnectedSessionLimitMin = 0, + ActiveSessionLimitMin = 0, + IdleSessionLimitMin = 0, + BrokenConnectionAction = BrokenConnectionActionValues.Disconnect.ToString(), + AutomaticReconnectionEnabled = true, + TemporaryFoldersDeletedOnExit = true, + TemporaryFoldersPerSession = true, + ClientDeviceRedirectionOptions = string.Join(",", new List + { + ClientDeviceRedirectionOptionValues.AudioVideoPlayBack.ToString(), + ClientDeviceRedirectionOptionValues.AudioRecording.ToString(), + ClientDeviceRedirectionOptionValues.SmartCard.ToString(), + ClientDeviceRedirectionOptionValues.Clipboard.ToString(), + ClientDeviceRedirectionOptionValues.Drive.ToString(), + ClientDeviceRedirectionOptionValues.PlugAndPlayDevice.ToString() + }.ToArray()), + ClientPrinterRedirected = true, + ClientPrinterAsDefault = true, + RDEasyPrintDriverEnabled = true, + MaxRedirectedMonitors = 16, + EncryptionLevel = EncryptionLevel.ClientCompatible.ToString(), + SecurityLayer = SecurityLayerValues.Negotiate.ToString(), + AuthenticateUsingNLA = true + }; + } + + public static RdsServerSettings GetDefaultGpoSettings() + { + var defaultSettings = UserController.GetUserSettings(SecurityContext.User.UserId, UserSettings.RDS_POLICY); + var settings = new RdsServerSettings(); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.LOCK_SCREEN_TIMEOUT, + PropertyValue = defaultSettings[RdsServerSettings.LOCK_SCREEN_TIMEOUT_VALUE], + ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.LOCK_SCREEN_TIMEOUT_ADMINISTRATORS]), + ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.LOCK_SCREEN_TIMEOUT_USERS]) + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.REMOVE_RUN_COMMAND, + PropertyValue = "", + ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.REMOVE_RUN_COMMAND_ADMINISTRATORS]), + ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.REMOVE_RUN_COMMAND_USERS]) + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.REMOVE_POWERSHELL_COMMAND, + PropertyValue = "", + ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.REMOVE_POWERSHELL_COMMAND_ADMINISTRATORS]), + ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.REMOVE_POWERSHELL_COMMAND_USERS]) + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.HIDE_C_DRIVE, + PropertyValue = "", + ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.HIDE_C_DRIVE_ADMINISTRATORS]), + ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.HIDE_C_DRIVE_USERS]) + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.REMOVE_SHUTDOWN_RESTART, + PropertyValue = "", + ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.REMOVE_SHUTDOWN_RESTART_ADMINISTRATORS]), + ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.REMOVE_SHUTDOWN_RESTART_USERS]) + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.DISABLE_TASK_MANAGER, + PropertyValue = "", + ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.DISABLE_TASK_MANAGER_ADMINISTRATORS]), + ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.DISABLE_TASK_MANAGER_USERS]) + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.CHANGE_DESKTOP_DISABLED, + PropertyValue = "", + ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.CHANGE_DESKTOP_DISABLED_ADMINISTRATORS]), + ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.CHANGE_DESKTOP_DISABLED_USERS]) + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.SCREEN_SAVER_DISABLED, + PropertyValue = "", + ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.SCREEN_SAVER_DISABLED_ADMINISTRATORS]), + ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.SCREEN_SAVER_DISABLED_USERS]) + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.RDS_VIEW_WITHOUT_PERMISSION, + PropertyValue = "", + ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.RDS_VIEW_WITHOUT_PERMISSION_ADMINISTRATORS]), + ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.RDS_VIEW_WITHOUT_PERMISSION_Users]) + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.RDS_CONTROL_WITHOUT_PERMISSION, + PropertyValue = "", + ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.RDS_CONTROL_WITHOUT_PERMISSION_ADMINISTRATORS]), + ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.RDS_CONTROL_WITHOUT_PERMISSION_Users]) + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.DISABLE_CMD, + PropertyValue = "", + ApplyAdministrators = Convert.ToBoolean(defaultSettings[RdsServerSettings.DISABLE_CMD_ADMINISTRATORS]), + ApplyUsers = Convert.ToBoolean(defaultSettings[RdsServerSettings.DISABLE_CMD_USERS]) + }); + + return settings; + } + + public static RdsServerSettings GetEmptyGpoSettings() + { + var defaultSettings = UserController.GetUserSettings(SecurityContext.User.UserId, UserSettings.RDS_POLICY); + var settings = new RdsServerSettings(); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.LOCK_SCREEN_TIMEOUT, + PropertyValue = defaultSettings[RdsServerSettings.LOCK_SCREEN_TIMEOUT_VALUE] + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.REMOVE_RUN_COMMAND, + PropertyValue = "" + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.REMOVE_POWERSHELL_COMMAND, + PropertyValue = "" + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.HIDE_C_DRIVE, + PropertyValue = "" + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.REMOVE_SHUTDOWN_RESTART, + PropertyValue = "" + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.DISABLE_TASK_MANAGER, + PropertyValue = "" + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.CHANGE_DESKTOP_DISABLED, + PropertyValue = "" + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.SCREEN_SAVER_DISABLED, + PropertyValue = "" + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.RDS_VIEW_WITHOUT_PERMISSION, + PropertyValue = "" + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.RDS_CONTROL_WITHOUT_PERMISSION, + PropertyValue = "" + }); + + settings.Settings.Add(new RdsServerSetting + { + PropertyName = RdsServerSettings.DISABLE_CMD, + PropertyValue = "" + }); + + return settings; + } + + public static string GetSettingsXml(RdsServerSettings settings) + { + XmlDocument doc = new XmlDocument(); + XmlElement nodeProps = doc.CreateElement("properties"); + + if (settings != null) + { + foreach (var setting in settings.Settings) + { + XmlElement nodeProp = doc.CreateElement("property"); + nodeProp.SetAttribute("name", setting.PropertyName); + nodeProp.SetAttribute("value", setting.PropertyValue); + nodeProp.SetAttribute("applyUsers", setting.ApplyUsers ? "1" : "0"); + nodeProp.SetAttribute("applyAdministrators", setting.ApplyAdministrators ? "1" : "0"); + nodeProps.AppendChild(nodeProp); + } + } + + return nodeProps.OuterXml; + } + + public static int GetRemoteDesktopServiceID(int packageId) + { + return PackageController.GetPackageServiceId(packageId, ResourceGroups.RDS); + } + + public static RemoteDesktopServices GetRemoteDesktopServices(int serviceId) + { + var rds = new RemoteDesktopServices(); + ServiceProviderProxy.Init(rds, serviceId); + + return rds; + } + + public static RdsServer FillRdsServerData(RdsServer server) + { + server.Address = GetServerIp(server.FqdName).ToString(); + + return server; + } + + public static System.Net.IPAddress GetServerIp(string hostname, AddressFamily addressFamily = AddressFamily.InterNetwork) + { + var address = GetServerIps(hostname); + + return address.FirstOrDefault(x => x.AddressFamily == addressFamily); + } + + public static RdsCollectionSettings ParseCollectionSettings(List settings) + { + var collectionSettings = new RdsCollectionSettings(); + var properties = typeof(RdsCollectionSettings).GetProperties().Where(p => p.Name.ToLower() != "id" && p.Name.ToLower() != "rdscollectionid"); + + foreach (var prop in properties) + { + var values = settings.Where(s => s.PropertyName.Equals(prop.Name, StringComparison.InvariantCultureIgnoreCase)); + + if (values.Count() == 1) + { + switch(prop.Name.ToLower()) + { + case "brokenconnectionaction": + prop.SetValue(collectionSettings, ((BrokenConnectionActionValues)values.First().PropertyValue).ToString(), null); + break; + case "clientdeviceredirectionoptions": + prop.SetValue(collectionSettings, ((ClientDeviceRedirectionOptionValues)values.First().PropertyValue).ToString(), null); + break; + case "encryptionlevel": + prop.SetValue(collectionSettings, ((EncryptionLevel)values.First().PropertyValue).ToString(), null); + break; + case "securitylayer": + prop.SetValue(collectionSettings, ((SecurityLayerValues)values.First().PropertyValue).ToString(), null); + break; + default: + prop.SetValue(collectionSettings, Convert.ChangeType(values.First().PropertyValue, prop.PropertyType), null); + break; + } + } + } + + return collectionSettings; + } + + public static void FillSessionHosts(IEnumerable sessionHosts, IEnumerable existingSessionHosts, int collectionId, int itemId) + { + var domainName = string.Format(".{0}", IPGlobalProperties.GetIPGlobalProperties().DomainName); + + foreach (var sessionHost in sessionHosts) + { + var existingSessionHost = existingSessionHosts.FirstOrDefault(e => e.FqdName.Equals(sessionHost, StringComparison.InvariantCultureIgnoreCase)); + int serverId = -1; + + if (existingSessionHost == null) + { + var serverName = sessionHost.Replace(domainName, ""); + serverId = DataProvider.AddRDSServer(serverName, sessionHost, ""); + } + else + { + serverId = existingSessionHost.Id; + } + + DataProvider.AddRDSServerToOrganization(itemId, serverId); + DataProvider.AddRDSServerToCollection(serverId, collectionId); + } + } + + private static IEnumerable GetServerIps(string hostname) + { + var address = Dns.GetHostAddresses(hostname); + + return address; + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj index 1532ee8a..21b45545 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj @@ -146,6 +146,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs index b99ea321..e509dd99 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs @@ -386,5 +386,11 @@ namespace WebsitePanel.EnterpriseServer { return RemoteDesktopServicesController.ShadowSession(itemId, sessionId, control); } + + [WebMethod] + public ResultObject ImportCollection(int itemId, string collectionName) + { + return RemoteDesktopServicesController.ImportCollection(itemId, collectionName); + } } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs index 2cfe5b06..67dbde9c 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs @@ -84,5 +84,7 @@ namespace WebsitePanel.Providers.RemoteDesktopServices void ApplyGPO(string organizationId, string collectionName, RdsServerSettings serverSettings); void ShadowSession(string sessionId, bool control); void MoveSessionHostsToCollectionOU(List servers, string collectionName, string organizationId); + ImportedRdsCollection GetExistingCollection(string collectionName); + void ImportCollection(string organizationId, RdsCollection collection, List users); } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/ImportedRdsCollection.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/ImportedRdsCollection.cs new file mode 100644 index 00000000..a1c4b64a --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/ImportedRdsCollection.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using WebsitePanel.EnterpriseServer.Base.RDS; + +namespace WebsitePanel.Providers.RemoteDesktopServices +{ + public class ImportedRdsCollection + { + public string CollectionName { get; set; } + public string Description { get; set; } + public List CollectionSettings { get; set; } + public List UserGroups { get; set; } + public List SessionHosts { get; set; } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsCollectionSetting.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsCollectionSetting.cs new file mode 100644 index 00000000..c0930b40 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsCollectionSetting.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace WebsitePanel.Providers.RemoteDesktopServices +{ + public class RdsCollectionSetting + { + public string PropertyName { get; set; } + + public object PropertyValue { get; set; } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServerSettings.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServerSettings.cs index ad175a46..c132a79f 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServerSettings.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/RdsServerSettings.cs @@ -48,6 +48,7 @@ namespace WebsitePanel.EnterpriseServer.Base.RDS public const string DISABLE_CMD = "DisableCMD"; public const string DISABLE_CMD_ADMINISTRATORS = "DisableCMDAdministrators"; public const string DISABLE_CMD_USERS = "DisableCMDUsers"; + public const string ALLOWCONNECTIONSIMPORT = "AllowConnectionsImport"; public string SettingsName { get; set; } public int ServerId { get; set; } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj index 80c567d5..71bd8ac8 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj @@ -134,10 +134,12 @@ + + diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/RdsRunspaceExtensions.cs b/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/RdsRunspaceExtensions.cs new file mode 100644 index 00000000..78498d3c --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/RdsRunspaceExtensions.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Management.Automation; +using System.Management.Automation.Runspaces; +using System.Text; +using WebsitePanel.Server.Utils; + +namespace WebsitePanel.Providers.RemoteDesktopServices +{ + public static class RdsRunspaceExtensions + { + public static RdsCollection GetCollection(this Runspace runspace, string collectionName, string connectionBroker, string primaryDomainController) + { + RdsCollection collection = null; + Command cmd = new Command("Get-RDSessionCollection"); + cmd.Parameters.Add("CollectionName", collectionName); + cmd.Parameters.Add("ConnectionBroker", connectionBroker); + + var collectionPs = ExecuteShellCommand(runspace, cmd, false, primaryDomainController).FirstOrDefault(); + + if (collectionPs != null) + { + collection = new RdsCollection(); + collection.Name = Convert.ToString(GetPSObjectProperty(collectionPs, "CollectionName")); + collection.Description = Convert.ToString(GetPSObjectProperty(collectionPs, "CollectionDescription")); + } + + return collection; + } + + public static List GetCollectionSettings(this Runspace runspace, string collectionName, string connectionBroker, string primaryDomainController, out object[] errors) + { + var result = new List(); + var errorsList = new List(); + + result.AddRange(GetCollectionSettings(runspace, collectionName, connectionBroker, primaryDomainController, "Connection", out errors)); + errorsList.AddRange(errors); + result.AddRange(GetCollectionSettings(runspace, collectionName, connectionBroker, primaryDomainController, "UserProfileDisk", out errors)); + errorsList.AddRange(errors); + result.AddRange(GetCollectionSettings(runspace, collectionName, connectionBroker, primaryDomainController, "Security", out errors)); + errorsList.AddRange(errors); + result.AddRange(GetCollectionSettings(runspace, collectionName, connectionBroker, primaryDomainController, "LoadBalancing", out errors)); + errorsList.AddRange(errors); + result.AddRange(GetCollectionSettings(runspace, collectionName, connectionBroker, primaryDomainController, "Client", out errors)); + errorsList.AddRange(errors); + errors = errorsList.ToArray(); + + return result; + } + + public static List GetCollectionUserGroups(this Runspace runspace, string collectionName, string connectionBroker, string primaryDomainController, out object[] errors) + { + return GetCollectionSettings(runspace, collectionName, connectionBroker, primaryDomainController, "UserGroup", out errors); + } + + public static List GetSessionHosts(this Runspace runspace, string collectionName, string connectionBroker, string primaryDomainController, out object[] errors) + { + Command cmd = new Command("Get-RDSessionHost"); + cmd.Parameters.Add("CollectionName", collectionName); + cmd.Parameters.Add("ConnectionBroker", connectionBroker); + + var psObjects = ExecuteShellCommand(runspace, cmd, false, primaryDomainController, out errors); + var rdsServers = new List(); + + if (psObjects != null) + { + foreach(var psObject in psObjects) + { + rdsServers.Add(GetPSObjectProperty(psObject, "SessionHost").ToString()); + } + } + + return rdsServers; + } + + private static List GetCollectionSettings(this Runspace runspace, string collectionName, string connectionBroker, string primaryDomainController, string param, out object[] errors) + { + Command cmd = new Command("Get-RDSessionCollectionConfiguration"); + cmd.Parameters.Add("CollectionName", collectionName); + cmd.Parameters.Add("ConnectionBroker", connectionBroker); + + if (!string.IsNullOrEmpty(param)) + { + cmd.Parameters.Add(param, true); + } + + var psObject = ExecuteShellCommand(runspace, cmd, false, primaryDomainController, out errors).FirstOrDefault(); + + var properties = typeof(RdsCollectionSettings).GetProperties().Select(p => p.Name.ToLower()); + var collectionSettings = new RdsCollectionSettings(); + var result = new List(); + + if (psObject != null) + { + foreach (var prop in psObject.Properties) + { + if (prop.Name.ToLower() != "id" && prop.Name.ToLower() != "rdscollectionid") + { + result.Add(new RdsCollectionSetting + { + PropertyName = prop.Name, + PropertyValue = prop.Value + }); + } + } + } + + return result; + } + + private static Collection ExecuteShellCommand(Runspace runSpace, Command cmd, bool useDomainController, string primaryDomainController) + { + object[] errors; + return ExecuteShellCommand(runSpace, cmd, useDomainController, primaryDomainController, out errors); + } + + private static Collection ExecuteShellCommand(Runspace runSpace, Command cmd, bool useDomainController, string primaryDomainController, + out object[] errors) + { + Log.WriteStart("ExecuteShellCommand"); + List errorList = new List(); + + if (useDomainController) + { + CommandParameter dc = new CommandParameter("DomainController", primaryDomainController); + if (!cmd.Parameters.Contains(dc)) + { + cmd.Parameters.Add(dc); + } + } + + Collection results = null; + // Create a pipeline + Pipeline pipeLine = runSpace.CreatePipeline(); + using (pipeLine) + { + // Add the command + pipeLine.Commands.Add(cmd); + // Execute the pipeline and save the objects returned. + results = pipeLine.Invoke(); + + // Log out any errors in the pipeline execution + // NOTE: These errors are NOT thrown as exceptions! + // Be sure to check this to ensure that no errors + // happened while executing the command. + if (pipeLine.Error != null && pipeLine.Error.Count > 0) + { + foreach (object item in pipeLine.Error.ReadToEnd()) + { + errorList.Add(item); + string errorMessage = string.Format("Invoke error: {0}", item); + Log.WriteWarning(errorMessage); + } + } + } + pipeLine = null; + errors = errorList.ToArray(); + Log.WriteEnd("ExecuteShellCommand"); + return results; + } + + private static object GetPSObjectProperty(PSObject obj, string name) + { + return obj.Members[name].Value; + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/WebsitePanel.Providers.RemoteDesktopServices.Windows2012.csproj b/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/WebsitePanel.Providers.RemoteDesktopServices.Windows2012.csproj index 66dd13d8..4b112526 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/WebsitePanel.Providers.RemoteDesktopServices.Windows2012.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/WebsitePanel.Providers.RemoteDesktopServices.Windows2012.csproj @@ -46,6 +46,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs b/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs index 233fe6a2..dd287158 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs @@ -486,19 +486,7 @@ namespace WebsitePanel.Providers.RemoteDesktopServices try { runSpace = OpenRunspace(); - - Command cmd = new Command("Get-RDSessionCollection"); - cmd.Parameters.Add("CollectionName", collectionName); - cmd.Parameters.Add("ConnectionBroker", ConnectionBroker); - - var collectionPs = ExecuteShellCommand(runSpace, cmd, false).FirstOrDefault(); - - if (collectionPs != null) - { - collection = new RdsCollection(); - collection.Name = Convert.ToString(GetPSObjectProperty(collectionPs, "CollectionName")); - collection.Description = Convert.ToString(GetPSObjectProperty(collectionPs, "CollectionDescription")); - } + collection = runSpace.GetCollection(collectionName, ConnectionBroker, PrimaryDomainController); } finally { @@ -1656,6 +1644,124 @@ namespace WebsitePanel.Providers.RemoteDesktopServices #endregion + #region Import Collection + + public ImportedRdsCollection GetExistingCollection(string collectionName) + { + Runspace runspace = null; + ImportedRdsCollection result; + + try + { + runspace = OpenRunspace(); + var collection = runspace.GetCollection(collectionName, ConnectionBroker, PrimaryDomainController); + result = new ImportedRdsCollection + { + CollectionName = collection.Name, + Description = collection.Description + }; + + if (collection == null) + { + throw new NullReferenceException(string.Format("Collection \"{0}\" not found", collectionName)); + } + + object[] errors; + result.CollectionSettings = runspace.GetCollectionSettings(collectionName, ConnectionBroker, PrimaryDomainController, out errors).ToList(); + + if (errors.Any()) + { + throw new Exception(string.Format("Collection not imported:\r\n{0}", string.Join("r\\n\\", errors.Select(e => e.ToString()).ToArray()))); + } + + result.SessionHosts = runspace.GetSessionHosts(collectionName, ConnectionBroker, PrimaryDomainController, out errors); + + if (errors.Any()) + { + throw new Exception(string.Format("Collection not imported:\r\n{0}", string.Join("r\\n\\", errors.Select(e => e.ToString()).ToArray()))); + } + + result.UserGroups = runspace.GetCollectionUserGroups(collectionName, ConnectionBroker, PrimaryDomainController, out errors).ToList(); + + if (errors.Any()) + { + throw new Exception(string.Format("Collection not imported:\r\n{0}", string.Join("r\\n\\", errors.Select(e => e.ToString()).ToArray()))); + } + } + finally + { + CloseRunspace(runspace); + } + + return result; + } + + public void ImportCollection(string organizationId, RdsCollection collection, List users) + { + Runspace runSpace = null; + + try + { + runSpace = OpenRunspace(); + var orgPath = GetOrganizationPath(organizationId); + CheckOrCreateAdGroup(GetComputerGroupPath(organizationId, collection.Name), orgPath, GetComputersGroupName(collection.Name), RdsCollectionComputersGroupDescription); + CheckOrCreateHelpDeskComputerGroup(); + string helpDeskGroupSamAccountName = CheckOrCreateAdGroup(GetHelpDeskGroupPath(RDSHelpDeskGroup), GetRootOUPath(), RDSHelpDeskGroup, RDSHelpDeskGroupDescription); + string groupName = GetLocalAdminsGroupName(collection.Name); + string groupPath = GetGroupPath(organizationId, collection.Name, groupName); + string localAdminsGroupSamAccountName = CheckOrCreateAdGroup(groupPath, GetOrganizationPath(organizationId), groupName, WspAdministratorsGroupDescription); + CheckOrCreateAdGroup(GetUsersGroupPath(organizationId, collection.Name), orgPath, GetUsersGroupName(collection.Name), RdsCollectionUsersGroupDescription); + + var capPolicyName = GetPolicyName(organizationId, collection.Name, RdsPolicyTypes.RdCap); + var rapPolicyName = GetPolicyName(organizationId, collection.Name, RdsPolicyTypes.RdRap); + + foreach (var gateway in Gateways) + { + CreateHelpDeskRdCapForce(runSpace, gateway); + CreateHelpDeskRdRapForce(runSpace, gateway); + + if (!CentralNps) + { + CreateRdCapForce(runSpace, gateway, capPolicyName, collection.Name, new List { GetUsersGroupName(collection.Name) }); + } + + CreateRdRapForce(runSpace, gateway, rapPolicyName, collection.Name, new List { GetUsersGroupName(collection.Name) }); + } + + if (CentralNps) + { + CreateCentralNpsPolicy(runSpace, CentralNpsHost, capPolicyName, collection.Name, organizationId); + } + + //add user group to collection + AddUserGroupsToCollection(runSpace, collection.Name, new List { GetUsersGroupName(collection.Name) }); + + //add session servers to group + foreach (var rdsServer in collection.Servers) + { + MoveSessionHostToCollectionOU(rdsServer.Name, collection.Name, organizationId); + AddAdGroupToLocalAdmins(runSpace, rdsServer.FqdName, helpDeskGroupSamAccountName); + AddAdGroupToLocalAdmins(runSpace, rdsServer.FqdName, localAdminsGroupSamAccountName); + AddComputerToCollectionAdComputerGroup(organizationId, collection.Name, rdsServer); + } + + string collectionComputersPath = GetComputerGroupPath(organizationId, collection.Name); + CreatePolicy(runSpace, organizationId, string.Format("{0}-administrators", collection.Name), + new DirectoryEntry(GetGroupPath(organizationId, collection.Name, GetLocalAdminsGroupName(collection.Name))), new DirectoryEntry(collectionComputersPath), collection.Name); + CreatePolicy(runSpace, organizationId, string.Format("{0}-users", collection.Name), new DirectoryEntry(GetUsersGroupPath(organizationId, collection.Name)) + , new DirectoryEntry(collectionComputersPath), collection.Name); + CreateHelpDeskPolicy(runSpace, new DirectoryEntry(GetHelpDeskGroupPath(RDSHelpDeskGroup)), new DirectoryEntry(collectionComputersPath), organizationId, collection.Name); + + SetUsersInCollection(organizationId, collection.Name, users); + } + finally + { + CloseRunspace(runSpace); + } + } + + #endregion + private void AddRdsServerToDeployment(Runspace runSpace, RdsServer server) { Command cmd = new Command("Add-RDserver"); @@ -2723,6 +2829,11 @@ namespace WebsitePanel.Providers.RemoteDesktopServices cmd.Parameters.Add("CollectionName", collection.Name); cmd.Parameters.Add("ConnectionBroker", ConnectionBroker); + if (string.IsNullOrEmpty(collection.Settings.ClientDeviceRedirectionOptions)) + { + collection.Settings.ClientDeviceRedirectionOptions = "None"; + } + var properties = collection.Settings.GetType().GetProperties(); foreach(var prop in properties) @@ -2733,7 +2844,7 @@ namespace WebsitePanel.Providers.RemoteDesktopServices if (value != null) { - cmd.Parameters.Add(prop.Name, value); + cmd.Parameters.Add(prop.Name, value); } } } diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/RemoteDesktopServicesProxy.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/RemoteDesktopServicesProxy.cs index bbd90595..d07b437c 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Client/RemoteDesktopServicesProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/RemoteDesktopServicesProxy.cs @@ -108,6 +108,10 @@ namespace WebsitePanel.Providers.RemoteDesktopServices { private System.Threading.SendOrPostCallback MoveSessionHostsToCollectionOUOperationCompleted; + private System.Threading.SendOrPostCallback GetExistingCollectionOperationCompleted; + + private System.Threading.SendOrPostCallback ImportCollectionOperationCompleted; + /// public RemoteDesktopServices() { this.Url = "http://localhost:9003/RemoteDesktopServices.asmx"; @@ -230,6 +234,12 @@ namespace WebsitePanel.Providers.RemoteDesktopServices { /// public event MoveSessionHostsToCollectionOUCompletedEventHandler MoveSessionHostsToCollectionOUCompleted; + /// + public event GetExistingCollectionCompletedEventHandler GetExistingCollectionCompleted; + + /// + public event ImportCollectionCompletedEventHandler ImportCollectionCompleted; + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CreateCollection", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] @@ -1933,6 +1943,94 @@ namespace WebsitePanel.Providers.RemoteDesktopServices { } } + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/GetExistingCollection", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public ImportedRdsCollection GetExistingCollection(string collectionName) { + object[] results = this.Invoke("GetExistingCollection", new object[] { + collectionName}); + return ((ImportedRdsCollection)(results[0])); + } + + /// + public System.IAsyncResult BeginGetExistingCollection(string collectionName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetExistingCollection", new object[] { + collectionName}, callback, asyncState); + } + + /// + public ImportedRdsCollection EndGetExistingCollection(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((ImportedRdsCollection)(results[0])); + } + + /// + public void GetExistingCollectionAsync(string collectionName) { + this.GetExistingCollectionAsync(collectionName, null); + } + + /// + public void GetExistingCollectionAsync(string collectionName, object userState) { + if ((this.GetExistingCollectionOperationCompleted == null)) { + this.GetExistingCollectionOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetExistingCollectionOperationCompleted); + } + this.InvokeAsync("GetExistingCollection", new object[] { + collectionName}, this.GetExistingCollectionOperationCompleted, userState); + } + + private void OnGetExistingCollectionOperationCompleted(object arg) { + if ((this.GetExistingCollectionCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetExistingCollectionCompleted(this, new GetExistingCollectionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/ImportCollection", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void ImportCollection(string organizationId, RdsCollection collection, string[] users) { + this.Invoke("ImportCollection", new object[] { + organizationId, + collection, + users}); + } + + /// + public System.IAsyncResult BeginImportCollection(string organizationId, RdsCollection collection, string[] users, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("ImportCollection", new object[] { + organizationId, + collection, + users}, callback, asyncState); + } + + /// + public void EndImportCollection(System.IAsyncResult asyncResult) { + this.EndInvoke(asyncResult); + } + + /// + public void ImportCollectionAsync(string organizationId, RdsCollection collection, string[] users) { + this.ImportCollectionAsync(organizationId, collection, users, null); + } + + /// + public void ImportCollectionAsync(string organizationId, RdsCollection collection, string[] users, object userState) { + if ((this.ImportCollectionOperationCompleted == null)) { + this.ImportCollectionOperationCompleted = new System.Threading.SendOrPostCallback(this.OnImportCollectionOperationCompleted); + } + this.InvokeAsync("ImportCollection", new object[] { + organizationId, + collection, + users}, this.ImportCollectionOperationCompleted, userState); + } + + private void OnImportCollectionOperationCompleted(object arg) { + if ((this.ImportCollectionCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.ImportCollectionCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// public new void CancelAsync(object userState) { base.CancelAsync(userState); @@ -2578,4 +2676,34 @@ namespace WebsitePanel.Providers.RemoteDesktopServices { /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void MoveSessionHostsToCollectionOUCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void GetExistingCollectionCompletedEventHandler(object sender, GetExistingCollectionCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetExistingCollectionCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetExistingCollectionCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public ImportedRdsCollection Result { + get { + this.RaiseExceptionIfNecessary(); + return ((ImportedRdsCollection)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void ImportCollectionCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); } diff --git a/WebsitePanel/Sources/WebsitePanel.Server/RemoteDesktopServices.asmx.cs b/WebsitePanel/Sources/WebsitePanel.Server/RemoteDesktopServices.asmx.cs index e28846eb..d7449faa 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server/RemoteDesktopServices.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server/RemoteDesktopServices.asmx.cs @@ -711,5 +711,37 @@ namespace WebsitePanel.Server throw; } } + + [WebMethod, SoapHeader("settings")] + public ImportedRdsCollection GetExistingCollection(string collectionName) + { + try + { + Log.WriteStart("'{0}' GetExistingCollection", ProviderSettings.ProviderName); + return RDSProvider.GetExistingCollection(collectionName); + Log.WriteEnd("'{0}' GetExistingCollection", ProviderSettings.ProviderName); + } + catch (Exception ex) + { + Log.WriteError(String.Format("'{0}' GetExistingCollection", ProviderSettings.ProviderName), ex); + throw; + } + } + + [WebMethod, SoapHeader("settings")] + public void ImportCollection(string organizationId, RdsCollection collection, List users) + { + try + { + Log.WriteStart("'{0}' ImportCollection", ProviderSettings.ProviderName); + RDSProvider.ImportCollection(organizationId, collection, users); + Log.WriteEnd("'{0}' ImportCollection", ProviderSettings.ProviderName); + } + catch (Exception ex) + { + Log.WriteError(String.Format("'{0}' ImportCollection", ProviderSettings.ProviderName), ex); + throw; + } + } } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/ESModule_ControlsHierarchy.config b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/ESModule_ControlsHierarchy.config index 7933d0cc..8a21c2f2 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/ESModule_ControlsHierarchy.config +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/ESModule_ControlsHierarchy.config @@ -158,6 +158,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config index 70e8407b..63c4235e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config @@ -606,6 +606,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx index 3c67a53e..d83c52e3 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx @@ -5784,6 +5784,9 @@ Error creating rds collection. You need to add at least 1 rds server to collection + + Error importing rds collection. Collection not found + Resource Mailboxes per Organization @@ -5820,6 +5823,9 @@ Collection not created + + Collection not imported + Session host certificate not installed diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SettingsRdsPolicy.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SettingsRdsPolicy.ascx.resx index 4e783a67..2f01e647 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SettingsRdsPolicy.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SettingsRdsPolicy.ascx.resx @@ -120,9 +120,15 @@ Administrators + + Allow + Users + + Connections Import + Changing Desktop Disabled diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/App_LocalResources/RDSCollections.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/App_LocalResources/RDSCollections.ascx.resx index 3a2deaac..fe45f728 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/App_LocalResources/RDSCollections.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/App_LocalResources/RDSCollections.ascx.resx @@ -150,4 +150,7 @@ Total Remote Desktop Collections Created: + + Import RDS Collection + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/App_LocalResources/RDSImportCollection.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/App_LocalResources/RDSImportCollection.ascx.resx new file mode 100644 index 00000000..46f650df --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/App_LocalResources/RDSImportCollection.ascx.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Import + + + Import RDSCollection + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCollections.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCollections.ascx index a5369d97..37e1deae 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCollections.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCollections.ascx @@ -22,6 +22,8 @@
+
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCollections.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCollections.ascx.cs index 3ca6445f..7fc90d67 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCollections.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCollections.ascx.cs @@ -30,6 +30,7 @@ using System; using System.Linq; using System.Web.UI.WebControls; using WebsitePanel.EnterpriseServer; +using WebsitePanel.EnterpriseServer.Base.RDS; using WebsitePanel.Providers.Common; using WebsitePanel.Providers.HostedSolution; using WebsitePanel.Providers.OS; @@ -53,6 +54,14 @@ namespace WebsitePanel.Portal.RDS { btnAddCollection.Enabled = (!(cntx.Quotas[Quotas.RDS_COLLECTIONS].QuotaAllocatedValue <= gvRDSCollections.Rows.Count) || (cntx.Quotas[Quotas.RDS_COLLECTIONS].QuotaAllocatedValue == -1)); } + + var defaultSettings = ES.Services.Users.GetUserSettings(PanelSecurity.EffectiveUserId, UserSettings.RDS_POLICY); + var allowImport = Convert.ToBoolean(defaultSettings[RdsServerSettings.ALLOWCONNECTIONSIMPORT]); + + if (!allowImport) + { + btnImportCollection.Visible = false; + } } private void BindQuota(PackageContext cntx) @@ -83,6 +92,12 @@ namespace WebsitePanel.Portal.RDS "SpaceID=" + PanelSecurity.PackageId)); } + protected void btnImportCollection_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "rds_import_collection", + "SpaceID=" + PanelSecurity.PackageId)); + } + protected void gvRDSCollections_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "DeleteItem") diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCollections.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCollections.ascx.designer.cs index 44424f9b..92aaed71 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCollections.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCollections.ascx.designer.cs @@ -57,6 +57,15 @@ namespace WebsitePanel.Portal.RDS { /// protected global::System.Web.UI.WebControls.Button btnAddCollection; + /// + /// btnImportCollection control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnImportCollection; + /// /// SearchPanel control. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCreateCollection.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCreateCollection.ascx index 9549a550..afaa344b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCreateCollection.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSCreateCollection.ascx @@ -15,7 +15,7 @@
- +
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSImportCollection.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSImportCollection.ascx new file mode 100644 index 00000000..b6a58e70 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSImportCollection.ascx @@ -0,0 +1,38 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="RDSImportCollection.ascx.cs" Inherits="WebsitePanel.Portal.RDS.RDSImportCollection" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../UserControls/CollapsiblePanel.ascx" %> + +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + +
+
+
+
+
+
+
+ + +
+
+ + + + + + + +
+ + +
+ +
+ +
+
+
+
+
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSImportCollection.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSImportCollection.ascx.cs new file mode 100644 index 00000000..8a5ff1b7 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSImportCollection.ascx.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace WebsitePanel.Portal.RDS +{ + public partial class RDSImportCollection : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + } + + protected void btnSave_Click(object sender, EventArgs e) + { + if (!Page.IsValid) + { + return; + } + + try + { + ES.Services.RDS.ImportCollection(PanelRequest.ItemID, txtCollectionName.Text); + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "rds_collections", "SpaceID=" + PanelSecurity.PackageId)); + } + catch (Exception ex) + { + ShowErrorMessage("RDSCOLLECTION_NOT_IMPORTED", ex); + } + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSImportCollection.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSImportCollection.ascx.designer.cs new file mode 100644 index 00000000..0a5d18e3 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSImportCollection.ascx.designer.cs @@ -0,0 +1,78 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.RDS { + + + public partial class RDSImportCollection { + + /// + /// imgAddRDSServer control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image imgAddRDSServer; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// locCollectionName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locCollectionName; + + /// + /// txtCollectionName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtCollectionName; + + /// + /// valCollectionName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator valCollectionName; + + /// + /// btnSave control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnSave; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsRdsPolicy.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsRdsPolicy.ascx index 1f3300e5..a197dc73 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsRdsPolicy.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsRdsPolicy.ascx @@ -180,4 +180,15 @@
- \ No newline at end of file + + + + + + + +
+ +
+
+
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsRdsPolicy.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsRdsPolicy.ascx.cs index 3e28ef23..e4cb2829 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsRdsPolicy.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsRdsPolicy.ascx.cs @@ -53,6 +53,7 @@ namespace WebsitePanel.Portal cbDisableCmdUsers.Checked = Convert.ToBoolean(settings[RdsServerSettings.DISABLE_CMD_USERS]); ddTreshold.SelectedValue = settings[RdsServerSettings.DRIVE_SPACE_THRESHOLD_VALUE]; + cbAllowImport.Checked = Convert.ToBoolean(settings[RdsServerSettings.ALLOWCONNECTIONSIMPORT]); } public void SaveSettings(UserSettings settings) @@ -81,6 +82,7 @@ namespace WebsitePanel.Portal settings[RdsServerSettings.RDS_CONTROL_WITHOUT_PERMISSION_Users] = cbControlSessionUsers.Checked.ToString(); settings[RdsServerSettings.DISABLE_CMD_ADMINISTRATORS] = cbDisableCmdAdministrators.Checked.ToString(); settings[RdsServerSettings.DISABLE_CMD_USERS] = cbDisableCmdUsers.Checked.ToString(); + settings[RdsServerSettings.ALLOWCONNECTIONSIMPORT] = cbAllowImport.Checked.ToString(); } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsRdsPolicy.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsRdsPolicy.ascx.designer.cs index 9ecc5ff4..d1eea2a7 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsRdsPolicy.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SettingsRdsPolicy.ascx.designer.cs @@ -443,5 +443,32 @@ namespace WebsitePanel.Portal { /// To modify move field declaration from designer file to code-behind file. /// protected global::System.Web.UI.WebControls.CheckBox cbDisableCmdAdministrators; + + /// + /// secAllowImport control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.CollapsiblePanel secAllowImport; + + /// + /// allowImportPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel allowImportPanel; + + /// + /// cbAllowImport control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox cbAllowImport; } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj index 3d5054ea..1389e428 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj @@ -332,6 +332,13 @@ HostedSharePointEnterpriseStorageUsage.ascx + + RDSImportCollection.ascx + ASPXCodeBehind + + + RDSImportCollection.ascx + VpsMenu.ascx ASPXCodeBehind @@ -4901,6 +4908,7 @@ + @@ -5066,6 +5074,7 @@ + ResXFileCodeGenerator DomainLookupView.ascx.Designer.cs