diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/System/SystemSettings.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/System/SystemSettings.cs
index 90b12d96..542a611c 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/System/SystemSettings.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/System/SystemSettings.cs
@@ -44,6 +44,7 @@ namespace WebsitePanel.EnterpriseServer
public const string WPI_SETTINGS = "WpiSettings";
public const string FILEMANAGER_SETTINGS = "FileManagerSettings";
public const string PACKAGE_DISPLAY_SETTINGS = "PackageDisplaySettings";
+ public const string RDS_SETTINGS = "RdsSettings";
// key to access to wpi main & custom feed in wpi settings
public const string WPI_MAIN_FEED_KEY = "WpiMainFeedUrl";
diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs
index 1bcb1bff..057bbe31 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs
@@ -18,9 +18,9 @@ namespace WebsitePanel.EnterpriseServer {
using System.Web.Services.Protocols;
using System;
using System.Diagnostics;
+ using WebsitePanel.Providers.HostedSolution;
using WebsitePanel.Providers.RemoteDesktopServices;
using WebsitePanel.Providers.Common;
- using WebsitePanel.Providers.HostedSolution;
///
@@ -126,6 +126,8 @@ namespace WebsitePanel.EnterpriseServer {
private System.Threading.SendOrPostCallback AddRdsCertificateOperationCompleted;
+ private System.Threading.SendOrPostCallback GetRdsServicesOperationCompleted;
+
///
public esRemoteDesktopServices() {
this.Url = "http://localhost:9002/esRemoteDesktopServices.asmx";
@@ -275,6 +277,9 @@ namespace WebsitePanel.EnterpriseServer {
///
public event AddRdsCertificateCompletedEventHandler AddRdsCertificateCompleted;
+ ///
+ public event GetRdsServicesCompletedEventHandler GetRdsServicesCompleted;
+
///
[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) {
@@ -1999,7 +2004,7 @@ namespace WebsitePanel.EnterpriseServer {
///
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetRdsServerInfo", 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 RdsServerInfo GetRdsServerInfo(int itemId, string fqdnName) {
+ public RdsServerInfo GetRdsServerInfo([System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] System.Nullable itemId, string fqdnName) {
object[] results = this.Invoke("GetRdsServerInfo", new object[] {
itemId,
fqdnName});
@@ -2007,7 +2012,7 @@ namespace WebsitePanel.EnterpriseServer {
}
///
- public System.IAsyncResult BeginGetRdsServerInfo(int itemId, string fqdnName, System.AsyncCallback callback, object asyncState) {
+ public System.IAsyncResult BeginGetRdsServerInfo(System.Nullable itemId, string fqdnName, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetRdsServerInfo", new object[] {
itemId,
fqdnName}, callback, asyncState);
@@ -2020,12 +2025,12 @@ namespace WebsitePanel.EnterpriseServer {
}
///
- public void GetRdsServerInfoAsync(int itemId, string fqdnName) {
+ public void GetRdsServerInfoAsync(System.Nullable itemId, string fqdnName) {
this.GetRdsServerInfoAsync(itemId, fqdnName, null);
}
///
- public void GetRdsServerInfoAsync(int itemId, string fqdnName, object userState) {
+ public void GetRdsServerInfoAsync(System.Nullable itemId, string fqdnName, object userState) {
if ((this.GetRdsServerInfoOperationCompleted == null)) {
this.GetRdsServerInfoOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetRdsServerInfoOperationCompleted);
}
@@ -2043,7 +2048,7 @@ namespace WebsitePanel.EnterpriseServer {
///
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetRdsServerStatus", 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 string GetRdsServerStatus(int itemId, string fqdnName) {
+ public string GetRdsServerStatus([System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] System.Nullable itemId, string fqdnName) {
object[] results = this.Invoke("GetRdsServerStatus", new object[] {
itemId,
fqdnName});
@@ -2051,7 +2056,7 @@ namespace WebsitePanel.EnterpriseServer {
}
///
- public System.IAsyncResult BeginGetRdsServerStatus(int itemId, string fqdnName, System.AsyncCallback callback, object asyncState) {
+ public System.IAsyncResult BeginGetRdsServerStatus(System.Nullable itemId, string fqdnName, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetRdsServerStatus", new object[] {
itemId,
fqdnName}, callback, asyncState);
@@ -2064,12 +2069,12 @@ namespace WebsitePanel.EnterpriseServer {
}
///
- public void GetRdsServerStatusAsync(int itemId, string fqdnName) {
+ public void GetRdsServerStatusAsync(System.Nullable itemId, string fqdnName) {
this.GetRdsServerStatusAsync(itemId, fqdnName, null);
}
///
- public void GetRdsServerStatusAsync(int itemId, string fqdnName, object userState) {
+ public void GetRdsServerStatusAsync(System.Nullable itemId, string fqdnName, object userState) {
if ((this.GetRdsServerStatusOperationCompleted == null)) {
this.GetRdsServerStatusOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetRdsServerStatusOperationCompleted);
}
@@ -2087,7 +2092,7 @@ namespace WebsitePanel.EnterpriseServer {
///
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/ShutDownRdsServer", 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 ShutDownRdsServer(int itemId, string fqdnName) {
+ public ResultObject ShutDownRdsServer([System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] System.Nullable itemId, string fqdnName) {
object[] results = this.Invoke("ShutDownRdsServer", new object[] {
itemId,
fqdnName});
@@ -2095,7 +2100,7 @@ namespace WebsitePanel.EnterpriseServer {
}
///
- public System.IAsyncResult BeginShutDownRdsServer(int itemId, string fqdnName, System.AsyncCallback callback, object asyncState) {
+ public System.IAsyncResult BeginShutDownRdsServer(System.Nullable itemId, string fqdnName, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("ShutDownRdsServer", new object[] {
itemId,
fqdnName}, callback, asyncState);
@@ -2108,12 +2113,12 @@ namespace WebsitePanel.EnterpriseServer {
}
///
- public void ShutDownRdsServerAsync(int itemId, string fqdnName) {
+ public void ShutDownRdsServerAsync(System.Nullable itemId, string fqdnName) {
this.ShutDownRdsServerAsync(itemId, fqdnName, null);
}
///
- public void ShutDownRdsServerAsync(int itemId, string fqdnName, object userState) {
+ public void ShutDownRdsServerAsync(System.Nullable itemId, string fqdnName, object userState) {
if ((this.ShutDownRdsServerOperationCompleted == null)) {
this.ShutDownRdsServerOperationCompleted = new System.Threading.SendOrPostCallback(this.OnShutDownRdsServerOperationCompleted);
}
@@ -2131,7 +2136,7 @@ namespace WebsitePanel.EnterpriseServer {
///
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/RestartRdsServer", 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 RestartRdsServer(int itemId, string fqdnName) {
+ public ResultObject RestartRdsServer([System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] System.Nullable itemId, string fqdnName) {
object[] results = this.Invoke("RestartRdsServer", new object[] {
itemId,
fqdnName});
@@ -2139,7 +2144,7 @@ namespace WebsitePanel.EnterpriseServer {
}
///
- public System.IAsyncResult BeginRestartRdsServer(int itemId, string fqdnName, System.AsyncCallback callback, object asyncState) {
+ public System.IAsyncResult BeginRestartRdsServer(System.Nullable itemId, string fqdnName, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("RestartRdsServer", new object[] {
itemId,
fqdnName}, callback, asyncState);
@@ -2152,12 +2157,12 @@ namespace WebsitePanel.EnterpriseServer {
}
///
- public void RestartRdsServerAsync(int itemId, string fqdnName) {
+ public void RestartRdsServerAsync(System.Nullable itemId, string fqdnName) {
this.RestartRdsServerAsync(itemId, fqdnName, null);
}
///
- public void RestartRdsServerAsync(int itemId, string fqdnName, object userState) {
+ public void RestartRdsServerAsync(System.Nullable itemId, string fqdnName, object userState) {
if ((this.RestartRdsServerOperationCompleted == null)) {
this.RestartRdsServerOperationCompleted = new System.Threading.SendOrPostCallback(this.OnRestartRdsServerOperationCompleted);
}
@@ -2342,14 +2347,14 @@ namespace WebsitePanel.EnterpriseServer {
///
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetRdsCertificateByItemId", 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 RdsCertificate GetRdsCertificateByItemId(int itemId) {
+ public RdsCertificate GetRdsCertificateByItemId([System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] System.Nullable itemId) {
object[] results = this.Invoke("GetRdsCertificateByItemId", new object[] {
itemId});
return ((RdsCertificate)(results[0]));
}
///
- public System.IAsyncResult BeginGetRdsCertificateByItemId(int itemId, System.AsyncCallback callback, object asyncState) {
+ public System.IAsyncResult BeginGetRdsCertificateByItemId(System.Nullable itemId, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetRdsCertificateByItemId", new object[] {
itemId}, callback, asyncState);
}
@@ -2361,12 +2366,12 @@ namespace WebsitePanel.EnterpriseServer {
}
///
- public void GetRdsCertificateByItemIdAsync(int itemId) {
+ public void GetRdsCertificateByItemIdAsync(System.Nullable itemId) {
this.GetRdsCertificateByItemIdAsync(itemId, null);
}
///
- public void GetRdsCertificateByItemIdAsync(int itemId, object userState) {
+ public void GetRdsCertificateByItemIdAsync(System.Nullable itemId, object userState) {
if ((this.GetRdsCertificateByItemIdOperationCompleted == null)) {
this.GetRdsCertificateByItemIdOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetRdsCertificateByItemIdOperationCompleted);
}
@@ -2422,6 +2427,44 @@ namespace WebsitePanel.EnterpriseServer {
}
}
+ ///
+ [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetRdsServices", 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 ServiceInfo[] GetRdsServices() {
+ object[] results = this.Invoke("GetRdsServices", new object[0]);
+ return ((ServiceInfo[])(results[0]));
+ }
+
+ ///
+ public System.IAsyncResult BeginGetRdsServices(System.AsyncCallback callback, object asyncState) {
+ return this.BeginInvoke("GetRdsServices", new object[0], callback, asyncState);
+ }
+
+ ///
+ public ServiceInfo[] EndGetRdsServices(System.IAsyncResult asyncResult) {
+ object[] results = this.EndInvoke(asyncResult);
+ return ((ServiceInfo[])(results[0]));
+ }
+
+ ///
+ public void GetRdsServicesAsync() {
+ this.GetRdsServicesAsync(null);
+ }
+
+ ///
+ public void GetRdsServicesAsync(object userState) {
+ if ((this.GetRdsServicesOperationCompleted == null)) {
+ this.GetRdsServicesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetRdsServicesOperationCompleted);
+ }
+ this.InvokeAsync("GetRdsServices", new object[0], this.GetRdsServicesOperationCompleted, userState);
+ }
+
+ private void OnGetRdsServicesOperationCompleted(object arg) {
+ if ((this.GetRdsServicesCompleted != null)) {
+ System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
+ this.GetRdsServicesCompleted(this, new GetRdsServicesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
+ }
+ }
+
///
public new void CancelAsync(object userState) {
base.CancelAsync(userState);
@@ -3675,4 +3718,30 @@ namespace WebsitePanel.EnterpriseServer {
}
}
}
+
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
+ public delegate void GetRdsServicesCompletedEventHandler(object sender, GetRdsServicesCompletedEventArgs e);
+
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class GetRdsServicesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+
+ private object[] results;
+
+ internal GetRdsServicesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
+ base(exception, cancelled, userState) {
+ this.results = results;
+ }
+
+ ///
+ public ServiceInfo[] Result {
+ get {
+ this.RaiseExceptionIfNecessary();
+ return ((ServiceInfo[])(this.results[0]));
+ }
+ }
+ }
}
diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs
index 2b0e1ab3..e9da405c 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs
@@ -248,22 +248,22 @@ namespace WebsitePanel.EnterpriseServer
return GetRdsCollectionSessionHostsInternal(collectionId);
}
- public static RdsServerInfo GetRdsServerInfo(int itemId, string fqdnName)
+ public static RdsServerInfo GetRdsServerInfo(int? itemId, string fqdnName)
{
return GetRdsServerInfoInternal(itemId, fqdnName);
}
- public static string GetRdsServerStatus(int itemId, string fqdnName)
+ public static string GetRdsServerStatus(int? itemId, string fqdnName)
{
return GetRdsServerStatusInternal(itemId, fqdnName);
}
- public static ResultObject ShutDownRdsServer(int itemId, string fqdnName)
+ public static ResultObject ShutDownRdsServer(int? itemId, string fqdnName)
{
return ShutDownRdsServerInternal(itemId, fqdnName);
}
- public static ResultObject RestartRdsServer(int itemId, string fqdnName)
+ public static ResultObject RestartRdsServer(int? itemId, string fqdnName)
{
return RestartRdsServerInternal(itemId, fqdnName);
}
@@ -288,7 +288,7 @@ namespace WebsitePanel.EnterpriseServer
return GetRdsCertificateByServiceIdInternal(serviceId);
}
- public static RdsCertificate GetRdsCertificateByItemId(int itemId)
+ public static RdsCertificate GetRdsCertificateByItemId(int? itemId)
{
return GetRdsCertificateByItemIdInternal(itemId);
}
@@ -298,22 +298,23 @@ namespace WebsitePanel.EnterpriseServer
return AddRdsCertificateInternal(certificate);
}
+ public static List GetRdsServices()
+ {
+ return GetRdsServicesInternal();
+ }
+
+ private static List GetRdsServicesInternal()
+ {
+ return ObjectUtils.CreateListFromDataSet(DataProvider.GetServicesByGroupName(SecurityContext.User.UserId, ResourceGroups.RDS));
+ }
+
private static ResultObject InstallSessionHostsCertificateInternal(RdsServer rdsServer)
{
var result = TaskManager.StartResultTask("REMOTE_DESKTOP_SERVICES", "INSTALL_CERTIFICATE");
try
- {
- Organization org = OrganizationController.GetOrganization(rdsServer.ItemId.Value);
-
- if (org == null)
- {
- result.IsSuccess = false;
- result.AddError("", new NullReferenceException("Organization not found"));
- return result;
- }
-
- int serviceId = GetRemoteDesktopServiceID(org.PackageId);
+ {
+ int serviceId = GetRdsServiceId(rdsServer.ItemId);
var rds = GetRemoteDesktopServices(serviceId);
var certificate = GetRdsCertificateByServiceIdInternal(serviceId);
@@ -351,16 +352,9 @@ namespace WebsitePanel.EnterpriseServer
return result;
}
- private static RdsCertificate GetRdsCertificateByItemIdInternal(int itemId)
- {
- Organization org = OrganizationController.GetOrganization(itemId);
-
- if (org == null)
- {
- return null;
- }
-
- int serviceId = GetRemoteDesktopServiceID(org.PackageId);
+ private static RdsCertificate GetRdsCertificateByItemIdInternal(int? itemId)
+ {
+ int serviceId = GetRdsServiceId(itemId);
var result = ObjectUtils.FillObjectFromDataReader(DataProvider.GetRdsCertificateByServiceId(serviceId));
return result;
@@ -539,6 +533,14 @@ namespace WebsitePanel.EnterpriseServer
try
{
+ Organization org = OrganizationController.GetOrganization(itemId);
+ if (org == null)
+ {
+ return -1;
+ }
+
+ var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId));
+
foreach(var server in collection.Servers)
{
if (!server.FqdName.EndsWith(domainName, StringComparison.CurrentCultureIgnoreCase))
@@ -546,20 +548,12 @@ namespace WebsitePanel.EnterpriseServer
throw TaskManager.WriteError(new Exception("Fully Qualified Domain Name not valid."));
}
- if (!CheckRDSServerAvaliable(server.FqdName))
+ if (!rds.CheckRDSServerAvaliable(server.FqdName))
{
throw TaskManager.WriteError(new Exception(string.Format("Unable to connect to {0} server.", server.FqdName)));
}
}
-
- // load organization
- Organization org = OrganizationController.GetOrganization(itemId);
- if (org == null)
- {
- return -1;
- }
-
- var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId));
+
collection.Name = GetFormattedCollectionName(collection.DisplayName, org.OrganizationId);
collection.Settings = new RdsCollectionSettings
@@ -1031,12 +1025,17 @@ namespace WebsitePanel.EnterpriseServer
try
{
- if (CheckRDSServerAvaliable(rdsServer.FqdName))
+ int serviceId = GetRdsMainServiceId();
+ var rds = GetRemoteDesktopServices(serviceId);
+
+ if (rds.CheckRDSServerAvaliable(rdsServer.FqdName))
{
var domainName = IPGlobalProperties.GetIPGlobalProperties().DomainName;
if (rdsServer.FqdName.EndsWith(domainName, StringComparison.CurrentCultureIgnoreCase))
- {
+ {
+ rds.AddSessionHostFeatureToServer(rdsServer.FqdName);
+ rds.MoveSessionHostToRdsOU(rdsServer.Name);
rdsServer.Id = DataProvider.AddRDSServer(rdsServer.Name, rdsServer.FqdName, rdsServer.Description);
}
else
@@ -1194,12 +1193,6 @@ namespace WebsitePanel.EnterpriseServer
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId));
RdsServer rdsServer = GetRdsServer(serverId);
-
- //if (!rds.CheckSessionHostFeatureInstallation(rdsServer.FqdName))
- {
- rds.AddSessionHostFeatureToServer(rdsServer.FqdName);
- }
-
rds.MoveRdsServerToTenantOU(rdsServer.FqdName, org.OrganizationId);
DataProvider.AddRDSServerToOrganization(itemId, serverId);
}
@@ -1508,36 +1501,32 @@ namespace WebsitePanel.EnterpriseServer
return result;
}
- private static RdsServerInfo GetRdsServerInfoInternal(int itemId, string fqdnName)
+ private static RdsServerInfo GetRdsServerInfoInternal(int? itemId, string fqdnName)
{
- Organization org = OrganizationController.GetOrganization(itemId);
+ int serviceId = GetRdsServiceId(itemId);
+ var result = new RdsServerInfo();
- if (org == null)
+ if (serviceId != -1)
{
- return new RdsServerInfo();
+ var rds = GetRemoteDesktopServices(serviceId);
+ result = rds.GetRdsServerInfo(fqdnName);
}
- var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId));
- var result = rds.GetRdsServerInfo(fqdnName);
-
return result;
}
- private static string GetRdsServerStatusInternal(int itemId, string fqdnName)
- {
- Organization org = OrganizationController.GetOrganization(itemId);
+ private static string GetRdsServerStatusInternal(int? itemId, string fqdnName)
+ {
var result = "Unavailable";
-
- if (org == null)
- {
- return result;
- }
-
- var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId));
+ var serviceId = GetRdsServiceId(itemId);
try
{
- result = rds.GetRdsServerStatus(fqdnName);
+ if (serviceId != -1)
+ {
+ var rds = GetRemoteDesktopServices(serviceId);
+ result = rds.GetRdsServerStatus(fqdnName);
+ }
}
catch
{
@@ -1546,23 +1535,19 @@ namespace WebsitePanel.EnterpriseServer
return result;
}
- private static ResultObject ShutDownRdsServerInternal(int itemId, string fqdnName)
+ private static ResultObject ShutDownRdsServerInternal(int? itemId, string fqdnName)
{
var result = TaskManager.StartResultTask("REMOTE_DESKTOP_SERVICES", "SHUTDOWN_RDS_SERVER");
try
- {
- Organization org = OrganizationController.GetOrganization(itemId);
+ {
+ int serviceId = GetRdsServiceId(itemId);
- if (org == null)
+ if (serviceId != -1)
{
- result.IsSuccess = false;
- result.AddError("", new NullReferenceException("Organization not found"));
- return result;
+ var rds = GetRemoteDesktopServices(serviceId);
+ rds.ShutDownRdsServer(fqdnName);
}
-
- var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId));
- rds.ShutDownRdsServer(fqdnName);
}
catch (Exception ex)
{
@@ -1583,23 +1568,19 @@ namespace WebsitePanel.EnterpriseServer
return result;
}
- private static ResultObject RestartRdsServerInternal(int itemId, string fqdnName)
+ private static ResultObject RestartRdsServerInternal(int? itemId, string fqdnName)
{
- var result = TaskManager.StartResultTask("REMOTE_DESKTOP_SERVICES", "RESTART_RDS_SERVER");
+ var result = TaskManager.StartResultTask("REMOTE_DESKTOP_SERVICES", "RESTART_RDS_SERVER");
try
{
- Organization org = OrganizationController.GetOrganization(itemId);
+ int serviceId = GetRdsServiceId(itemId);
- if (org == null)
+ if (serviceId != -1)
{
- result.IsSuccess = false;
- result.AddError("", new NullReferenceException("Organization not found"));
- return result;
+ var rds = GetRemoteDesktopServices(serviceId);
+ rds.RestartRdsServer(fqdnName);
}
-
- var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId));
- rds.RestartRdsServer(fqdnName);
}
catch (Exception ex)
{
@@ -1761,20 +1742,6 @@ namespace WebsitePanel.EnterpriseServer
var address = Dns.GetHostAddresses(hostname);
return address;
- }
-
- private static bool CheckRDSServerAvaliable(string hostname)
- {
- bool result = false;
- var ping = new Ping();
- var reply = ping.Send(hostname, 1000);
-
- if (reply.Status == IPStatus.Success)
- {
- result = true;
- }
-
- return result;
}
private static ResultObject DeleteRemoteDesktopServiceInternal(int itemId)
@@ -1819,6 +1786,29 @@ namespace WebsitePanel.EnterpriseServer
private static int GetRemoteDesktopServiceID(int packageId)
{
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;
}
private static RemoteDesktopServices GetRemoteDesktopServices(int serviceId)
@@ -1829,6 +1819,25 @@ namespace WebsitePanel.EnterpriseServer
return rds;
}
+ private static int GetRdsMainServiceId()
+ {
+ var settings = SystemController.GetSystemSettings(WebsitePanel.EnterpriseServer.SystemSettings.RDS_SETTINGS);
+
+ if (!string.IsNullOrEmpty(settings["RdsMainController"]))
+ {
+ return Convert.ToInt32(settings["RdsMainController"]);
+ }
+
+ var rdsServices = GetRdsServicesInternal();
+
+ if (rdsServices.Any())
+ {
+ return rdsServices.First().ServiceId;
+ }
+
+ return -1;
+ }
+
private static string GetFormattedCollectionName(string displayName, string organizationId)
{
return string.Format("{0}-{1}", organizationId, displayName.Replace(" ", "_"));
diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs
index cd1567ff..4b5a69ef 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs
@@ -291,25 +291,25 @@ namespace WebsitePanel.EnterpriseServer
}
[WebMethod]
- public RdsServerInfo GetRdsServerInfo(int itemId, string fqdnName)
+ public RdsServerInfo GetRdsServerInfo(int? itemId, string fqdnName)
{
return RemoteDesktopServicesController.GetRdsServerInfo(itemId, fqdnName);
}
[WebMethod]
- public string GetRdsServerStatus(int itemId, string fqdnName)
+ public string GetRdsServerStatus(int? itemId, string fqdnName)
{
return RemoteDesktopServicesController.GetRdsServerStatus(itemId, fqdnName);
}
[WebMethod]
- public ResultObject ShutDownRdsServer(int itemId, string fqdnName)
+ public ResultObject ShutDownRdsServer(int? itemId, string fqdnName)
{
return RemoteDesktopServicesController.ShutDownRdsServer(itemId, fqdnName);
}
[WebMethod]
- public ResultObject RestartRdsServer(int itemId, string fqdnName)
+ public ResultObject RestartRdsServer(int? itemId, string fqdnName)
{
return RemoteDesktopServicesController.RestartRdsServer(itemId, fqdnName);
}
@@ -339,7 +339,7 @@ namespace WebsitePanel.EnterpriseServer
}
[WebMethod]
- public RdsCertificate GetRdsCertificateByItemId(int itemId)
+ public RdsCertificate GetRdsCertificateByItemId(int? itemId)
{
return RemoteDesktopServicesController.GetRdsCertificateByItemId(itemId);
}
@@ -349,5 +349,11 @@ namespace WebsitePanel.EnterpriseServer
{
return RemoteDesktopServicesController.AddRdsCertificate(certificate);
}
+
+ [WebMethod]
+ public List GetRdsServices()
+ {
+ return RemoteDesktopServicesController.GetRdsServices();
+ }
}
}
diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs
index 695f2576..01038055 100644
--- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs
+++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs
@@ -79,5 +79,6 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
void MoveRdsServerToTenantOU(string hostName, string organizationId);
void RemoveRdsServerFromTenantOU(string hostName, string organizationId);
void InstallCertificate(byte[] certificate, string password, List hostNames);
+ void MoveSessionHostToRdsOU(string hostName);
}
}
diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs b/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs
index 41c6e520..013e0cdb 100644
--- a/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs
+++ b/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs
@@ -1102,8 +1102,7 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
try
{
var guid = Guid.NewGuid();
- var x509Cert = new X509Certificate2(certificate, password, X509KeyStorageFlags.Exportable);
- //var content = x509Cert.Export(X509ContentType.Pfx);
+ var x509Cert = new X509Certificate2(certificate, password, X509KeyStorageFlags.Exportable);
var filePath = SaveCertificate(certificate, guid);
runspace = OpenRunspace();
@@ -1114,6 +1113,7 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
if (!errors.Any())
{
+ RemoveCertificate(runspace, hostName, x509Cert.Thumbprint);
errors = ImportCertificate(runspace, hostName, password, string.Format("c:\\{0}.pfx", guid), x509Cert.Thumbprint);
}
@@ -1135,12 +1135,23 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
{
CloseRunspace(runspace);
}
- }
+ }
+
+ private void RemoveCertificate(Runspace runspace, string hostName, string thumbprint)
+ {
+ var scripts = new List
+ {
+ string.Format("Remove-Item -Path cert:\\LocalMachine\\My\\{0}", thumbprint)
+ };
+
+ object[] errors = null;
+ ExecuteRemoteShellCommand(runspace, hostName, scripts, out errors);
+ }
private object[] ImportCertificate(Runspace runspace, string hostName, string password, string certificatePath, string thumbprint)
{
var scripts = new List
- {
+ {
string.Format("$mypwd = ConvertTo-SecureString -String {0} -Force –AsPlainText", password),
string.Format("Import-PfxCertificate –FilePath \"{0}\" cert:\\localMachine\\my -Password $mypwd", certificatePath),
string.Format("$cert = Get-Item cert:\\LocalMachine\\My\\{0}", thumbprint),
@@ -1366,6 +1377,27 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
}
}
+ public void MoveSessionHostToRdsOU(string hostName)
+ {
+ if (!string.IsNullOrEmpty(ComputersRootOU))
+ {
+ CheckOrCreateComputersRoot(GetComputersRootPath());
+ }
+
+ var computerObject = GetComputerObject(hostName);
+
+ if (computerObject != null)
+ {
+ var samName = (string)ActiveDirectoryUtils.GetADObjectProperty(computerObject, "sAMAccountName");
+
+ if (!ActiveDirectoryUtils.IsComputerInGroup(samName, RdsServersRootOU))
+ {
+ DirectoryEntry group = new DirectoryEntry(GetRdsServersGroupPath());
+ computerObject.MoveTo(group);
+ }
+ }
+ }
+
public void MoveRdsServerToTenantOU(string hostName, string organizationId)
{
var tenantComputerGroupPath = GetTenantComputerGroupPath(organizationId);
diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/RemoteDesktopServicesProxy.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/RemoteDesktopServicesProxy.cs
index e9681bb1..40b2e4a8 100644
--- a/WebsitePanel/Sources/WebsitePanel.Server.Client/RemoteDesktopServicesProxy.cs
+++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/RemoteDesktopServicesProxy.cs
@@ -99,6 +99,8 @@ namespace WebsitePanel.Providers.RemoteDesktopServices {
private System.Threading.SendOrPostCallback InstallCertificateOperationCompleted;
+ private System.Threading.SendOrPostCallback MoveSessionHostToRdsOUOperationCompleted;
+
///
public RemoteDesktopServices() {
this.Url = "http://localhost:9003/RemoteDesktopServices.asmx";
@@ -209,6 +211,9 @@ namespace WebsitePanel.Providers.RemoteDesktopServices {
///
public event InstallCertificateCompletedEventHandler InstallCertificateCompleted;
+ ///
+ public event MoveSessionHostToRdsOUCompletedEventHandler MoveSessionHostToRdsOUCompleted;
+
///
[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)]
@@ -1737,6 +1742,46 @@ namespace WebsitePanel.Providers.RemoteDesktopServices {
}
}
+ ///
+ [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")]
+ [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/MoveSessionHostToRdsOU", 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 MoveSessionHostToRdsOU(string hostName) {
+ this.Invoke("MoveSessionHostToRdsOU", new object[] {
+ hostName});
+ }
+
+ ///
+ public System.IAsyncResult BeginMoveSessionHostToRdsOU(string hostName, System.AsyncCallback callback, object asyncState) {
+ return this.BeginInvoke("MoveSessionHostToRdsOU", new object[] {
+ hostName}, callback, asyncState);
+ }
+
+ ///
+ public void EndMoveSessionHostToRdsOU(System.IAsyncResult asyncResult) {
+ this.EndInvoke(asyncResult);
+ }
+
+ ///
+ public void MoveSessionHostToRdsOUAsync(string hostName) {
+ this.MoveSessionHostToRdsOUAsync(hostName, null);
+ }
+
+ ///
+ public void MoveSessionHostToRdsOUAsync(string hostName, object userState) {
+ if ((this.MoveSessionHostToRdsOUOperationCompleted == null)) {
+ this.MoveSessionHostToRdsOUOperationCompleted = new System.Threading.SendOrPostCallback(this.OnMoveSessionHostToRdsOUOperationCompleted);
+ }
+ this.InvokeAsync("MoveSessionHostToRdsOU", new object[] {
+ hostName}, this.MoveSessionHostToRdsOUOperationCompleted, userState);
+ }
+
+ private void OnMoveSessionHostToRdsOUOperationCompleted(object arg) {
+ if ((this.MoveSessionHostToRdsOUCompleted != null)) {
+ System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
+ this.MoveSessionHostToRdsOUCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
+ }
+ }
+
///
public new void CancelAsync(object userState) {
base.CancelAsync(userState);
@@ -2366,4 +2411,8 @@ namespace WebsitePanel.Providers.RemoteDesktopServices {
///
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void InstallCertificateCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);
+
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
+ public delegate void MoveSessionHostToRdsOUCompletedEventHandler(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 9e49fb21..7a47e54b 100644
--- a/WebsitePanel/Sources/WebsitePanel.Server/RemoteDesktopServices.asmx.cs
+++ b/WebsitePanel/Sources/WebsitePanel.Server/RemoteDesktopServices.asmx.cs
@@ -646,5 +646,21 @@ namespace WebsitePanel.Server
throw;
}
}
+
+ [WebMethod, SoapHeader("settings")]
+ public void MoveSessionHostToRdsOU(string hostName)
+ {
+ try
+ {
+ Log.WriteStart("'{0}' MoveSessionHostToRdsOU", ProviderSettings.ProviderName);
+ RDSProvider.MoveSessionHostToRdsOU(hostName);
+ Log.WriteEnd("'{0}' MoveSessionHostToRdsOU", ProviderSettings.ProviderName);
+ }
+ catch (Exception ex)
+ {
+ Log.WriteError(String.Format("'{0}' MoveSessionHostToRdsOU", ProviderSettings.ProviderName), ex);
+ throw;
+ }
+ }
}
}
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SystemSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SystemSettings.ascx.resx
index d0dd8013..fb855fc2 100644
--- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SystemSettings.ascx.resx
+++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/SystemSettings.ascx.resx
@@ -162,4 +162,10 @@
(One (1) extension per line)
+
+ Main RDS Controller:
+
+
+ RDS
+
\ No newline at end of file
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Helpers/RDSHelper.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Helpers/RDSHelper.cs
index 625145e4..0b5c8e67 100644
--- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Helpers/RDSHelper.cs
+++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Code/Helpers/RDSHelper.cs
@@ -54,11 +54,8 @@ namespace WebsitePanel.Portal
foreach (var rdsServer in rdsServers.Servers)
{
- if (rdsServer.ItemId.HasValue)
- {
- rdsServer.Status = ES.Services.RDS.GetRdsServerStatus(rdsServer.ItemId.Value, rdsServer.FqdName);
- rdsServer.SslAvailable = ES.Services.RDS.GetRdsCertificateByItemId(rdsServer.ItemId.Value) != null;
- }
+ rdsServer.Status = ES.Services.RDS.GetRdsServerStatus(null, rdsServer.FqdName);
+ rdsServer.SslAvailable = ES.Services.RDS.GetRdsCertificateByItemId(rdsServer.ItemId) != null;
}
return rdsServers.Servers;
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSEditCollectionSettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSEditCollectionSettings.ascx
index 56646324..b4c681b9 100644
--- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSEditCollectionSettings.ascx
+++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDS/RDSEditCollectionSettings.ascx
@@ -205,7 +205,7 @@
-
+
|
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDSServers.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDSServers.ascx
index 61130777..45518cce 100644
--- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDSServers.ascx
+++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDSServers.ascx
@@ -91,7 +91,7 @@
-
@@ -100,7 +100,7 @@
+ meta:resourcekey="cmdDelete" OnClientClick="if(confirm('Are you sure you want to delete selected rds server??')) ShowProgressDialog('Removeing RDS Server...'); else return false;">
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDSServers.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDSServers.ascx.cs
index eb5d9697..1b73054e 100644
--- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDSServers.ascx.cs
+++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/RDSServers.ascx.cs
@@ -88,6 +88,8 @@ namespace WebsitePanel.Portal
result = ES.Services.RDS.RemoveRdsServer(rdsServerId);
}
+ ((ModalPopupExtender)asyncTasks.FindControl("ModalPopupProperties")).Hide();
+
if (!result.IsSuccess)
{
messageBox.ShowMessage(result, "REMOTE_DESKTOP_SERVICES_REMOVE_RDSSERVER", "RDS");
@@ -136,7 +138,7 @@ namespace WebsitePanel.Portal
{
ViewInfoModal.Show();
var rdsServer = ES.Services.RDS.GetRdsServer(Convert.ToInt32(serverId));
- var serverInfo = ES.Services.RDS.GetRdsServerInfo(rdsServer.ItemId.Value, rdsServer.FqdName);
+ var serverInfo = ES.Services.RDS.GetRdsServerInfo(null, rdsServer.FqdName);
litProcessor.Text = string.Format("{0}x{1} MHz", serverInfo.NumberOfCores, serverInfo.MaxClockSpeed);
litLoadPercentage.Text = string.Format("{0}%", serverInfo.LoadPercentage);
litMemoryAllocated.Text = string.Format("{0} MB", serverInfo.MemoryAllocatedMb);
@@ -149,14 +151,14 @@ namespace WebsitePanel.Portal
private void Restart(string serverId)
{
var rdsServer = ES.Services.RDS.GetRdsServer(Convert.ToInt32(serverId));
- ES.Services.RDS.RestartRdsServer(rdsServer.ItemId.Value, rdsServer.FqdName);
+ ES.Services.RDS.RestartRdsServer(null, rdsServer.FqdName);
Response.Redirect(Request.Url.ToString(), true);
}
private void ShutDown(string serverId)
{
var rdsServer = ES.Services.RDS.GetRdsServer(Convert.ToInt32(serverId));
- ES.Services.RDS.ShutDownRdsServer(rdsServer.ItemId.Value, rdsServer.FqdName);
+ ES.Services.RDS.ShutDownRdsServer(null, rdsServer.FqdName);
Response.Redirect(Request.Url.ToString(), true);
}
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx
index 24542dbe..5fef4935 100644
--- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx
+++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/SystemSettings.ascx
@@ -70,6 +70,18 @@
+
+
+
+
+