diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs
index 8b6f1e32..fee2d2d2 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/RemoteDesktopServicesProxy.cs
@@ -515,8 +515,9 @@ namespace WebsitePanel.EnterpriseServer {
///
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetFreeRdsServersPaged", 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 RdsServersPaged GetFreeRdsServersPaged(string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) {
+ public RdsServersPaged GetFreeRdsServersPaged(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) {
object[] results = this.Invoke("GetFreeRdsServersPaged", new object[] {
+ packageId,
filterColumn,
filterValue,
sortColumn,
@@ -526,8 +527,9 @@ namespace WebsitePanel.EnterpriseServer {
}
///
- public System.IAsyncResult BeginGetFreeRdsServersPaged(string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, System.AsyncCallback callback, object asyncState) {
+ public System.IAsyncResult BeginGetFreeRdsServersPaged(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetFreeRdsServersPaged", new object[] {
+ packageId,
filterColumn,
filterValue,
sortColumn,
@@ -542,16 +544,17 @@ namespace WebsitePanel.EnterpriseServer {
}
///
- public void GetFreeRdsServersPagedAsync(string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) {
- this.GetFreeRdsServersPagedAsync(filterColumn, filterValue, sortColumn, startRow, maximumRows, null);
+ public void GetFreeRdsServersPagedAsync(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) {
+ this.GetFreeRdsServersPagedAsync(packageId, filterColumn, filterValue, sortColumn, startRow, maximumRows, null);
}
///
- public void GetFreeRdsServersPagedAsync(string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, object userState) {
+ public void GetFreeRdsServersPagedAsync(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, object userState) {
if ((this.GetFreeRdsServersPagedOperationCompleted == null)) {
this.GetFreeRdsServersPagedOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetFreeRdsServersPagedOperationCompleted);
}
this.InvokeAsync("GetFreeRdsServersPaged", new object[] {
+ packageId,
filterColumn,
filterValue,
sortColumn,
diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs
index 3179899a..e0bbf5b9 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/RemoteDesktopServices/RemoteDesktopServicesController.cs
@@ -93,9 +93,9 @@ namespace WebsitePanel.EnterpriseServer
return GetRdsServersPagedInternal(filterColumn, filterValue, sortColumn, startRow, maximumRows);
}
- public static RdsServersPaged GetFreeRdsServersPaged(string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
+ public static RdsServersPaged GetFreeRdsServersPaged(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
{
- return GetFreeRdsServersPagedInternal(filterColumn, filterValue, sortColumn, startRow, maximumRows);
+ return GetFreeRdsServersPagedInternal(packageId, filterColumn, filterValue, sortColumn, startRow, maximumRows);
}
public static RdsServersPaged GetOrganizationRdsServersPaged(int itemId, int? collectionId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
@@ -477,17 +477,26 @@ namespace WebsitePanel.EnterpriseServer
return result;
}
- private static RdsServersPaged GetFreeRdsServersPagedInternal(string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
+ private static RdsServersPaged GetFreeRdsServersPagedInternal(int itemId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
{
- DataSet ds = DataProvider.GetRDSServersPaged(null, null, filterColumn, filterValue, sortColumn, startRow, maximumRows);
-
RdsServersPaged result = new RdsServersPaged();
+ Organization org = OrganizationController.GetOrganization(itemId);
+
+ if (org == null)
+ {
+ return result;
+ }
+
+ var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId));
+ var existingServers = rds.GetServersExistingInCollections();
+
+ DataSet ds = DataProvider.GetRDSServersPaged(null, null, filterColumn, filterValue, sortColumn, startRow, maximumRows);
result.RecordsCount = (int)ds.Tables[0].Rows[0][0];
List tmpServers = new List();
ObjectUtils.FillCollectionFromDataView(tmpServers, ds.Tables[1].DefaultView);
-
+ tmpServers = tmpServers.Where(x => !existingServers.Select(y => y.ToUpper()).Contains(x.FqdName.ToUpper())).ToList();
result.Servers = tmpServers.ToArray();
return result;
diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs
index f05d3ca3..4323237f 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esRemoteDesktopServices.asmx.cs
@@ -99,10 +99,10 @@ namespace WebsitePanel.EnterpriseServer
}
[WebMethod]
- public RdsServersPaged GetFreeRdsServersPaged(string filterColumn, string filterValue,
+ public RdsServersPaged GetFreeRdsServersPaged(int packageId, string filterColumn, string filterValue,
string sortColumn, int startRow, int maximumRows)
{
- return RemoteDesktopServicesController.GetFreeRdsServersPaged(filterColumn, filterValue,
+ return RemoteDesktopServicesController.GetFreeRdsServersPaged(packageId, filterColumn, filterValue,
sortColumn, startRow, maximumRows);
}
diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs
index acb3cc5d..2a9800fc 100644
--- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs
+++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/RemoteDesktopServices/IRemoteDesktopServices.cs
@@ -64,5 +64,6 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
string[] GetApplicationUsers(string collectionName, string applicationName);
bool SetApplicationUsers(string collectionName, RemoteApplication remoteApp, string[] users);
bool CheckRDSServerAvaliable(string hostname);
+ List GetServersExistingInCollections();
}
}
diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs b/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs
index 77fe591f..bfb230f0 100644
--- a/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs
+++ b/WebsitePanel/Sources/WebsitePanel.Providers.TerminalServices.Windows2012/Windows2012.cs
@@ -220,7 +220,15 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
try
{
- runSpace = OpenRunspace();
+ runSpace = OpenRunspace();
+
+ var existingServers = GetServersExistingInCollections(runSpace);
+ existingServers = existingServers.Select(x => x.ToUpper()).Intersect(collection.Servers.Select(x => x.FqdName.ToUpper())).ToList();
+
+ if (existingServers.Any())
+ {
+ throw new Exception(string.Format("Server{0} {1} already added to another collection", existingServers.Count == 1 ? "" : "s", string.Join(" ,", existingServers.ToArray())));
+ }
foreach (var server in collection.Servers)
{
@@ -302,6 +310,24 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
return result;
}
+ public List GetServersExistingInCollections()
+ {
+ Runspace runSpace = null;
+ List existingServers = new List();
+
+ try
+ {
+ runSpace = OpenRunspace();
+ existingServers = GetServersExistingInCollections(runSpace);
+ }
+ finally
+ {
+ CloseRunspace(runSpace);
+ }
+
+ return existingServers;
+ }
+
public RdsCollection GetCollection(string collectionName)
{
RdsCollection collection =null;
@@ -1380,6 +1406,23 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
return ExecuteShellCommand(runSpace, invokeCommand, false);
}
+ internal Collection ExecuteRemoteShellCommand(Runspace runSpace, string hostName, List scripts, params string[] moduleImports)
+ {
+ Command invokeCommand = new Command("Invoke-Command");
+ invokeCommand.Parameters.Add("ComputerName", hostName);
+
+ RunspaceInvoke invoke = new RunspaceInvoke();
+ string commandString = moduleImports.Any() ? string.Format("import-module {0};", string.Join(",", moduleImports)) : string.Empty;
+
+ commandString = string.Format("{0};{1}", commandString, string.Join(";", scripts.ToArray()));
+
+ ScriptBlock sb = invoke.Invoke(string.Format("{{{0}}}", commandString))[0].BaseObject as ScriptBlock;
+
+ invokeCommand.Parameters.Add("ScriptBlock", sb);
+
+ return ExecuteShellCommand(runSpace, invokeCommand, false);
+ }
+
internal Collection ExecuteShellCommand(Runspace runSpace, Command cmd)
{
return ExecuteShellCommand(runSpace, cmd, true);
@@ -1396,6 +1439,38 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
return ExecuteShellCommand(runSpace, cmd, true, out errors);
}
+ internal Collection ExecuteShellCommand(Runspace runspace, List scripts, out object[] errors)
+ {
+ Log.WriteStart("ExecuteShellCommand");
+ var errorList = new List