RDS Collections import

This commit is contained in:
vfedosevich 2015-05-15 02:17:47 -07:00
parent fbec129fc1
commit dbfdb87088
32 changed files with 1504 additions and 347 deletions

View file

@ -20,8 +20,8 @@ namespace WebsitePanel.EnterpriseServer {
using System.Diagnostics; using System.Diagnostics;
using WebsitePanel.Providers.RemoteDesktopServices; using WebsitePanel.Providers.RemoteDesktopServices;
using WebsitePanel.Providers.Common; using WebsitePanel.Providers.Common;
using WebsitePanel.EnterpriseServer.Base.RDS;
using WebsitePanel.Providers.HostedSolution; using WebsitePanel.Providers.HostedSolution;
using WebsitePanel.EnterpriseServer.Base.RDS;
/// <remarks/> /// <remarks/>
@ -139,6 +139,8 @@ namespace WebsitePanel.EnterpriseServer {
private System.Threading.SendOrPostCallback ShadowSessionOperationCompleted; private System.Threading.SendOrPostCallback ShadowSessionOperationCompleted;
private System.Threading.SendOrPostCallback ImportCollectionOperationCompleted;
/// <remarks/> /// <remarks/>
public esRemoteDesktopServices() { public esRemoteDesktopServices() {
this.Url = "http://localhost:9002/esRemoteDesktopServices.asmx"; this.Url = "http://localhost:9002/esRemoteDesktopServices.asmx";
@ -306,6 +308,9 @@ namespace WebsitePanel.EnterpriseServer {
/// <remarks/> /// <remarks/>
public event ShadowSessionCompletedEventHandler ShadowSessionCompleted; public event ShadowSessionCompletedEventHandler ShadowSessionCompleted;
/// <remarks/>
public event ImportCollectionCompletedEventHandler ImportCollectionCompleted;
/// <remarks/> /// <remarks/>
[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)] [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) { public RdsCollection GetRdsCollection(int collectionId) {
@ -2723,6 +2728,50 @@ namespace WebsitePanel.EnterpriseServer {
} }
} }
/// <remarks/>
[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]));
}
/// <remarks/>
public System.IAsyncResult BeginImportCollection(int itemId, string collectionName, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("ImportCollection", new object[] {
itemId,
collectionName}, callback, asyncState);
}
/// <remarks/>
public ResultObject EndImportCollection(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((ResultObject)(results[0]));
}
/// <remarks/>
public void ImportCollectionAsync(int itemId, string collectionName) {
this.ImportCollectionAsync(itemId, collectionName, null);
}
/// <remarks/>
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));
}
}
/// <remarks/> /// <remarks/>
public new void CancelAsync(object userState) { public new void CancelAsync(object userState) {
base.CancelAsync(userState); base.CancelAsync(userState);
@ -4132,4 +4181,30 @@ namespace WebsitePanel.EnterpriseServer {
} }
} }
} }
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void ImportCollectionCompletedEventHandler(object sender, ImportCollectionCompletedEventArgs e);
/// <remarks/>
[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;
}
/// <remarks/>
public ResultObject Result {
get {
this.RaiseExceptionIfNecessary();
return ((ResultObject)(this.results[0]));
}
}
}
} }

View file

@ -137,7 +137,7 @@ namespace WebsitePanel.EnterpriseServer
} }
public static List<RdsServer> GetCollectionRdsServers(int collectionId) public static List<RdsServer> GetCollectionRdsServers(int collectionId)
{ {
return GetCollectionRdsServersInternal(collectionId); return GetCollectionRdsServersInternal(collectionId);
} }
@ -304,12 +304,7 @@ namespace WebsitePanel.EnterpriseServer
public static List<ServiceInfo> GetRdsServices() public static List<ServiceInfo> GetRdsServices()
{ {
return GetRdsServicesInternal(); return GetRdsServicesInternal();
} }
private static List<ServiceInfo> GetRdsServicesInternal()
{
return ObjectUtils.CreateListFromDataSet<ServiceInfo>(DataProvider.GetServicesByGroupName(SecurityContext.User.UserId, ResourceGroups.RDS));
}
public static string GetRdsSetupLetter(int itemId, int? accountId) public static string GetRdsSetupLetter(int itemId, int? accountId)
{ {
@ -336,6 +331,80 @@ namespace WebsitePanel.EnterpriseServer
return ShadowSessionInternal(itemId, sessionId, control); 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<ResultObject>("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<RdsServer>(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) private static ResultObject ShadowSessionInternal(int itemId, string sessionId, bool control)
{ {
var result = TaskManager.StartResultTask<ResultObject>("REMOTE_DESKTOP_SERVICES", "SHADOW_RDS_SESSION"); var result = TaskManager.StartResultTask<ResultObject>("REMOTE_DESKTOP_SERVICES", "SHADOW_RDS_SESSION");
@ -352,7 +421,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
rds.ShadowSession(sessionId, control); rds.ShadowSession(sessionId, control);
} }
catch (Exception ex) catch (Exception ex)
@ -405,10 +474,10 @@ namespace WebsitePanel.EnterpriseServer
try try
{ {
var collection = ObjectUtils.FillObjectFromDataReader<RdsCollection>(DataProvider.GetRDSCollectionById(serverId)); var collection = ObjectUtils.FillObjectFromDataReader<RdsCollection>(DataProvider.GetRDSCollectionById(serverId));
var rds = GetRemoteDesktopServices(GetRdsServiceId(collection.ItemId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(GetRdsServiceId(collection.ItemId));
Organization org = OrganizationController.GetOrganization(collection.ItemId); Organization org = OrganizationController.GetOrganization(collection.ItemId);
rds.ApplyGPO(org.OrganizationId, collection.Name, settings); rds.ApplyGPO(org.OrganizationId, collection.Name, settings);
string xml = GetSettingsXml(settings); string xml = RemoteDesktopServicesHelpers.GetSettingsXml(settings);
DataProvider.UpdateRdsServerSettings(serverId, settingsName, xml); DataProvider.UpdateRdsServerSettings(serverId, settingsName, xml);
@ -442,8 +511,8 @@ namespace WebsitePanel.EnterpriseServer
{ {
return null; return null;
} }
string result = EvaluateMailboxTemplate(body, org, accountId, itemId); string result = RemoteDesktopServicesHelpers.EvaluateMailboxTemplate(body, org, accountId, itemId);
return user.HtmlMail ? result : result.Replace("\n", "<br/>"); return user.HtmlMail ? result : result.Replace("\n", "<br/>");
} }
@ -492,9 +561,9 @@ namespace WebsitePanel.EnterpriseServer
{ {
to = user.Email; to = user.Email;
} }
subject = EvaluateMailboxTemplate(subject, org, accountId, itemId); subject = RemoteDesktopServicesHelpers.EvaluateMailboxTemplate(subject, org, accountId, itemId);
body = EvaluateMailboxTemplate(body, org, accountId, itemId); body = RemoteDesktopServicesHelpers.EvaluateMailboxTemplate(body, org, accountId, itemId);
return MailHelper.SendMessage(from, to, cc, subject, body, priority, isHtml); return MailHelper.SendMessage(from, to, cc, subject, body, priority, isHtml);
} }
@ -506,7 +575,7 @@ namespace WebsitePanel.EnterpriseServer
try try
{ {
int serviceId = GetRdsServiceId(rdsServer.ItemId); int serviceId = GetRdsServiceId(rdsServer.ItemId);
var rds = GetRemoteDesktopServices(serviceId); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(serviceId);
var certificate = GetRdsCertificateByServiceIdInternal(serviceId); var certificate = GetRdsCertificateByServiceIdInternal(serviceId);
var array = Convert.FromBase64String(certificate.Hash); var array = Convert.FromBase64String(certificate.Hash);
@ -605,7 +674,7 @@ namespace WebsitePanel.EnterpriseServer
result.AddError("", new NullReferenceException("Organization not found")); 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); rds.GetCollection(collection.Name);
} }
@ -630,8 +699,8 @@ namespace WebsitePanel.EnterpriseServer
{ {
return result; 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 organizationUsers = OrganizationController.GetOrganizationUsersPaged(collection.ItemId, null, null, null, 0, Int32.MaxValue).PageUsers;
var organizationAdmins = rds.GetRdsCollectionLocalAdmins(org.OrganizationId, collection.Name); var organizationAdmins = rds.GetRdsCollectionLocalAdmins(org.OrganizationId, collection.Name);
@ -655,7 +724,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
var servers = ObjectUtils.CreateListFromDataReader<RdsServer>(DataProvider.GetRDSServersByCollectionId(collection.Id)).ToList(); var servers = ObjectUtils.CreateListFromDataReader<RdsServer>(DataProvider.GetRDSServersByCollectionId(collection.Id)).ToList();
rds.SaveRdsCollectionLocalAdmins(users.Select(u => u.AccountName).ToArray(), servers.Select(s => s.FqdName).ToArray(), org.OrganizationId, collection.Name); 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; return -1;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
foreach(var server in collection.Servers) 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))); 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 collection.Name = RemoteDesktopServicesHelpers.GetFormattedCollectionName(collection.DisplayName, org.OrganizationId);
{ collection.Settings = RemoteDesktopServicesHelpers.GetDefaultCollectionSettings();
DisconnectedSessionLimitMin = 0,
ActiveSessionLimitMin = 0,
IdleSessionLimitMin = 0,
BrokenConnectionAction = BrokenConnectionActionValues.Disconnect.ToString(),
AutomaticReconnectionEnabled = true,
TemporaryFoldersDeletedOnExit = true,
TemporaryFoldersPerSession = true,
ClientDeviceRedirectionOptions = string.Join(",", new List<string>
{
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
};
rds.CreateCollection(org.OrganizationId, collection); rds.CreateCollection(org.OrganizationId, collection);
var defaultGpoSettings = GetDefaultGpoSettings(); var defaultGpoSettings = RemoteDesktopServicesHelpers.GetDefaultGpoSettings();
rds.ApplyGPO(org.OrganizationId, collection.Name, defaultGpoSettings); rds.ApplyGPO(org.OrganizationId, collection.Name, defaultGpoSettings);
collection.Id = DataProvider.AddRDSCollection(itemId, collection.Name, collection.Description, collection.DisplayName); 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); DataProvider.UpdateRdsServerSettings(collection.Id, string.Format("Collection-{0}-Settings", collection.Id), xml);
collection.Settings.RdsCollectionId = collection.Id; collection.Settings.RdsCollectionId = collection.Id;
@ -824,7 +867,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
var existingServers = var existingServers =
ObjectUtils.CreateListFromDataReader<RdsServer>(DataProvider.GetRDSServersByCollectionId(collection.Id)).ToList(); ObjectUtils.CreateListFromDataReader<RdsServer>(DataProvider.GetRDSServersByCollectionId(collection.Id)).ToList();
var removedServers = existingServers.Where(x => !collection.Servers.Select(y => y.Id).Contains(x.Id)); 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")); result.AddError("", new NullReferenceException("Organization not found"));
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
rds.EditRdsCollectionSettings(collection); rds.EditRdsCollectionSettings(collection);
var collectionSettings = ObjectUtils.FillObjectFromDataReader<RdsCollectionSettings>(DataProvider.GetRdsCollectionSettingsByCollectionId(collection.Id)); var collectionSettings = ObjectUtils.FillObjectFromDataReader<RdsCollectionSettings>(DataProvider.GetRdsCollectionSettingsByCollectionId(collection.Id));
@ -948,7 +991,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
var servers = ObjectUtils.CreateListFromDataReader<RdsServer>(DataProvider.GetRDSServersByCollectionId(collection.Id)).ToArray(); var servers = ObjectUtils.CreateListFromDataReader<RdsServer>(DataProvider.GetRDSServersByCollectionId(collection.Id)).ToArray();
rds.RemoveCollection(org.OrganizationId, collection.Name, servers); rds.RemoveCollection(org.OrganizationId, collection.Name, servers);
@ -991,7 +1034,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
result.AddRange(rds.GetAvailableRemoteApplications(collectionName)); result.AddRange(rds.GetAvailableRemoteApplications(collectionName));
} }
@ -1027,7 +1070,7 @@ namespace WebsitePanel.EnterpriseServer
foreach (var tmpServer in tmpServers) foreach (var tmpServer in tmpServers)
{ {
FillRdsServerData(tmpServer); RemoteDesktopServicesHelpers.FillRdsServerData(tmpServer);
} }
result.Servers = tmpServers.ToArray(); result.Servers = tmpServers.ToArray();
@ -1046,7 +1089,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(organization.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(organization.PackageId));
var userSessions = rds.GetRdsUserSessions(collection.Name).ToList(); var userSessions = rds.GetRdsUserSessions(collection.Name).ToList();
var organizationUsers = OrganizationController.GetOrganizationUsersPaged(collection.ItemId, null, null, null, 0, Int32.MaxValue).PageUsers; var organizationUsers = OrganizationController.GetOrganizationUsersPaged(collection.ItemId, null, null, null, 0, Int32.MaxValue).PageUsers;
@ -1074,7 +1117,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
var existingServers = rds.GetServersExistingInCollections(); var existingServers = rds.GetServersExistingInCollections();
DataSet ds = DataProvider.GetRDSServersPaged(null, null, filterColumn, filterValue, sortColumn, startRow, maximumRows); DataSet ds = DataProvider.GetRDSServersPaged(null, null, filterColumn, filterValue, sortColumn, startRow, maximumRows);
@ -1100,7 +1143,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
result = rds.GetRdsCollectionSessionHosts(collection.Name).ToList(); result = rds.GetRdsCollectionSessionHosts(collection.Name).ToList();
return result; return result;
@ -1157,7 +1200,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
var rdsServer = GetRdsServer(rdsSeverId); var rdsServer = GetRdsServer(rdsSeverId);
@ -1189,32 +1232,7 @@ namespace WebsitePanel.EnterpriseServer
} }
return result; 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<RdsServer> GetCollectionRdsServersInternal(int collectionId)
{
return ObjectUtils.CreateListFromDataReader<RdsServer>(DataProvider.GetRDSServersByCollectionId(collectionId)).ToList();
}
private static List<RdsServer> GetOrganizationRdsServersInternal(int itemId)
{
return ObjectUtils.CreateListFromDataReader<RdsServer>(DataProvider.GetRDSServersByItemId(itemId)).ToList();
}
private static ResultObject AddRdsServerInternal(RdsServer rdsServer) private static ResultObject AddRdsServerInternal(RdsServer rdsServer)
{ {
@ -1223,7 +1241,7 @@ namespace WebsitePanel.EnterpriseServer
try try
{ {
int serviceId = GetRdsMainServiceId(); int serviceId = GetRdsMainServiceId();
var rds = GetRemoteDesktopServices(serviceId); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(serviceId);
if (rds.CheckRDSServerAvaliable(rdsServer.FqdName)) if (rds.CheckRDSServerAvaliable(rdsServer.FqdName))
{ {
@ -1275,7 +1293,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
if (!rds.CheckSessionHostFeatureInstallation(rdsServer.FqdName)) if (!rds.CheckSessionHostFeatureInstallation(rdsServer.FqdName))
{ {
@ -1320,7 +1338,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
rds.RemoveSessionHostServerFromCollection(org.OrganizationId, rdsCollection.Name, rdsServer); rds.RemoveSessionHostServerFromCollection(org.OrganizationId, rdsCollection.Name, rdsServer);
@ -1387,7 +1405,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
RdsServer rdsServer = GetRdsServer(serverId); RdsServer rdsServer = GetRdsServer(serverId);
rds.MoveRdsServerToTenantOU(rdsServer.FqdName, org.OrganizationId); rds.MoveRdsServerToTenantOU(rdsServer.FqdName, org.OrganizationId);
@ -1428,7 +1446,7 @@ namespace WebsitePanel.EnterpriseServer
} }
var rdsServer = ObjectUtils.FillObjectFromDataReader<RdsServer>(DataProvider.GetRDSServerById(rdsServerId)); var rdsServer = ObjectUtils.FillObjectFromDataReader<RdsServer>(DataProvider.GetRDSServerById(rdsServerId));
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
rds.RemoveRdsServerFromTenantOU(rdsServer.FqdName, org.OrganizationId); rds.RemoveRdsServerFromTenantOU(rdsServer.FqdName, org.OrganizationId);
DataProvider.RemoveRDSServerFromOrganization(rdsServerId); DataProvider.RemoveRDSServerFromOrganization(rdsServerId);
} }
@ -1498,7 +1516,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
var collection = GetRdsCollection(collectionId); var collection = GetRdsCollection(collectionId);
@ -1571,7 +1589,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
var collection = ObjectUtils.FillObjectFromDataReader<RdsCollection>(DataProvider.GetRDSCollectionById(collectionId)); var collection = ObjectUtils.FillObjectFromDataReader<RdsCollection>(DataProvider.GetRDSCollectionById(collectionId));
var users = rds.GetApplicationUsers(collection.Name, remoteApp.Alias); var users = rds.GetApplicationUsers(collection.Name, remoteApp.Alias);
result.AddRange(users); result.AddRange(users);
@ -1594,7 +1612,7 @@ namespace WebsitePanel.EnterpriseServer
} }
var collection = ObjectUtils.FillObjectFromDataReader<RdsCollection>(DataProvider.GetRDSCollectionById(collectionId)); var collection = ObjectUtils.FillObjectFromDataReader<RdsCollection>(DataProvider.GetRDSCollectionById(collectionId));
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
rds.SetApplicationUsers(collection.Name, remoteApp, users.ToArray()); rds.SetApplicationUsers(collection.Name, remoteApp, users.ToArray());
} }
catch (Exception ex) catch (Exception ex)
@ -1631,8 +1649,8 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
rds.LogOffRdsUser(unifiedSessionId, hostServer); rds.LogOffRdsUser(unifiedSessionId, hostServer);
} }
catch (Exception ex) catch (Exception ex)
@ -1669,7 +1687,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
if (!string.IsNullOrEmpty(remoteApp.Alias)) if (!string.IsNullOrEmpty(remoteApp.Alias))
{ {
@ -1696,41 +1714,7 @@ namespace WebsitePanel.EnterpriseServer
} }
return result; 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) private static ResultObject ShutDownRdsServerInternal(int? itemId, string fqdnName)
{ {
@ -1742,7 +1726,7 @@ namespace WebsitePanel.EnterpriseServer
if (serviceId != -1) if (serviceId != -1)
{ {
var rds = GetRemoteDesktopServices(serviceId); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(serviceId);
rds.ShutDownRdsServer(fqdnName); rds.ShutDownRdsServer(fqdnName);
} }
} }
@ -1775,7 +1759,7 @@ namespace WebsitePanel.EnterpriseServer
if (serviceId != -1) if (serviceId != -1)
{ {
var rds = GetRemoteDesktopServices(serviceId); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(serviceId);
rds.RestartRdsServer(fqdnName); rds.RestartRdsServer(fqdnName);
} }
} }
@ -1810,7 +1794,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
result.AddRange(rds.GetCollectionRemoteApplications(collectionName)); result.AddRange(rds.GetCollectionRemoteApplications(collectionName));
@ -1832,7 +1816,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
rds.RemoveRemoteApplication(collection.Name, application); rds.RemoveRemoteApplication(collection.Name, application);
} }
@ -1869,7 +1853,7 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
var rds = GetRemoteDesktopServices(GetRemoteDesktopServiceID(org.PackageId)); var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId));
var collection = GetRdsCollection(collectionId); var collection = GetRdsCollection(collectionId);
@ -1911,35 +1895,7 @@ namespace WebsitePanel.EnterpriseServer
} }
return result; return result;
} }
private static RdsCollection FillRdsCollection(RdsCollection collection)
{
collection.Servers = GetCollectionRdsServers(collection.Id) ?? new List<RdsServer>();
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<System.Net.IPAddress> GetServerIps(string hostname)
{
var address = Dns.GetHostAddresses(hostname);
return address;
}
private static ResultObject DeleteRemoteDesktopServiceInternal(int itemId) private static ResultObject DeleteRemoteDesktopServiceInternal(int itemId)
{ {
@ -1980,49 +1936,43 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
private static int GetRemoteDesktopServiceID(int packageId) private static int GetOrganizationRdsUsersCountInternal(int itemId)
{ {
return PackageController.GetPackageServiceId(packageId, ResourceGroups.RDS); return DataProvider.GetOrganizationRdsUsersCount(itemId);
}
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) private static int GetOrganizationRdsServersCountInternal(int itemId)
{ {
var rds = new RemoteDesktopServices(); return DataProvider.GetOrganizationRdsServersCount(itemId);
ServiceProviderProxy.Init(rds, serviceId);
return rds;
} }
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<RdsServer> GetCollectionRdsServersInternal(int collectionId)
{
return ObjectUtils.CreateListFromDataReader<RdsServer>(DataProvider.GetRDSServersByCollectionId(collectionId)).ToList();
}
private static List<RdsServer> GetOrganizationRdsServersInternal(int itemId)
{
return ObjectUtils.CreateListFromDataReader<RdsServer>(DataProvider.GetRDSServersByItemId(itemId)).ToList();
}
private static List<ServiceInfo> GetRdsServicesInternal()
{
return ObjectUtils.CreateListFromDataSet<ServiceInfo>(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"])) if (!string.IsNullOrEmpty(settings["RdsMainController"]))
{ {
return Convert.ToInt32(settings["RdsMainController"]); return Convert.ToInt32(settings["RdsMainController"]);
} }
var rdsServices = GetRdsServicesInternal(); var rdsServices = GetRdsServicesInternal();
@ -2035,146 +1985,68 @@ namespace WebsitePanel.EnterpriseServer
return -1; 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<RdsServer>();
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(); if (org == null)
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)
{ {
XmlElement nodeProp = doc.CreateElement("property"); return serviceId;
nodeProp.SetAttribute("name", setting.PropertyName); }
nodeProp.SetAttribute("value", setting.PropertyValue);
nodeProp.SetAttribute("applyUsers", setting.ApplyUsers ? "1" : "0"); serviceId = RemoteDesktopServicesHelpers.GetRemoteDesktopServiceID(org.PackageId);
nodeProp.SetAttribute("applyAdministrators", setting.ApplyAdministrators ? "1" : "0"); }
nodeProps.AppendChild(nodeProp); 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;
} }
} }
} }

View file

@ -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<string>
{
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<RdsCollectionSetting> 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<string> sessionHosts, IEnumerable<RdsServer> 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<System.Net.IPAddress> GetServerIps(string hostname)
{
var address = Dns.GetHostAddresses(hostname);
return address;
}
}
}

View file

@ -146,6 +146,7 @@
<Compile Include="Provisioning\IImportController.cs" /> <Compile Include="Provisioning\IImportController.cs" />
<Compile Include="Provisioning\ImportAsyncWorker.cs" /> <Compile Include="Provisioning\ImportAsyncWorker.cs" />
<Compile Include="Provisioning\ImportController.cs" /> <Compile Include="Provisioning\ImportController.cs" />
<Compile Include="RemoteDesktopServices\RemoteDesktopServicesHelpers.cs" />
<Compile Include="RemoteDesktopServices\RemoteDesktopServicesController.cs" /> <Compile Include="RemoteDesktopServices\RemoteDesktopServicesController.cs" />
<Compile Include="SchedulerTasks\ActivatePaidInvoicesTask.cs" /> <Compile Include="SchedulerTasks\ActivatePaidInvoicesTask.cs" />
<Compile Include="SchedulerTasks\BackupDatabaseTask.cs" /> <Compile Include="SchedulerTasks\BackupDatabaseTask.cs" />

View file

@ -386,5 +386,11 @@ namespace WebsitePanel.EnterpriseServer
{ {
return RemoteDesktopServicesController.ShadowSession(itemId, sessionId, control); return RemoteDesktopServicesController.ShadowSession(itemId, sessionId, control);
} }
[WebMethod]
public ResultObject ImportCollection(int itemId, string collectionName)
{
return RemoteDesktopServicesController.ImportCollection(itemId, collectionName);
}
} }
} }

View file

@ -84,5 +84,7 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
void ApplyGPO(string organizationId, string collectionName, RdsServerSettings serverSettings); void ApplyGPO(string organizationId, string collectionName, RdsServerSettings serverSettings);
void ShadowSession(string sessionId, bool control); void ShadowSession(string sessionId, bool control);
void MoveSessionHostsToCollectionOU(List<RdsServer> servers, string collectionName, string organizationId); void MoveSessionHostsToCollectionOU(List<RdsServer> servers, string collectionName, string organizationId);
ImportedRdsCollection GetExistingCollection(string collectionName);
void ImportCollection(string organizationId, RdsCollection collection, List<string> users);
} }
} }

View file

@ -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<RdsCollectionSetting> CollectionSettings { get; set; }
public List<RdsCollectionSetting> UserGroups { get; set; }
public List<string> SessionHosts { get; set; }
}
}

View file

@ -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; }
}
}

View file

@ -48,6 +48,7 @@ namespace WebsitePanel.EnterpriseServer.Base.RDS
public const string DISABLE_CMD = "DisableCMD"; public const string DISABLE_CMD = "DisableCMD";
public const string DISABLE_CMD_ADMINISTRATORS = "DisableCMDAdministrators"; public const string DISABLE_CMD_ADMINISTRATORS = "DisableCMDAdministrators";
public const string DISABLE_CMD_USERS = "DisableCMDUsers"; public const string DISABLE_CMD_USERS = "DisableCMDUsers";
public const string ALLOWCONNECTIONSIMPORT = "AllowConnectionsImport";
public string SettingsName { get; set; } public string SettingsName { get; set; }
public int ServerId { get; set; } public int ServerId { get; set; }

View file

@ -134,10 +134,12 @@
<Compile Include="OS\Quota.cs" /> <Compile Include="OS\Quota.cs" />
<Compile Include="OS\QuotaType.cs" /> <Compile Include="OS\QuotaType.cs" />
<Compile Include="OS\SystemFilesPaged.cs" /> <Compile Include="OS\SystemFilesPaged.cs" />
<Compile Include="RemoteDesktopServices\ImportedRdsCollection.cs" />
<Compile Include="RemoteDesktopServices\IRemoteDesktopServices.cs" /> <Compile Include="RemoteDesktopServices\IRemoteDesktopServices.cs" />
<Compile Include="RemoteDesktopServices\RdsCertificate.cs" /> <Compile Include="RemoteDesktopServices\RdsCertificate.cs" />
<Compile Include="RemoteDesktopServices\RdsCollection.cs" /> <Compile Include="RemoteDesktopServices\RdsCollection.cs" />
<Compile Include="RemoteDesktopServices\RdsCollectionPaged.cs" /> <Compile Include="RemoteDesktopServices\RdsCollectionPaged.cs" />
<Compile Include="RemoteDesktopServices\RdsCollectionSetting.cs" />
<Compile Include="RemoteDesktopServices\RdsCollectionSettings.cs" /> <Compile Include="RemoteDesktopServices\RdsCollectionSettings.cs" />
<Compile Include="RemoteDesktopServices\RdsEnums.cs" /> <Compile Include="RemoteDesktopServices\RdsEnums.cs" />
<Compile Include="RemoteDesktopServices\RdsPolicyTypes.cs" /> <Compile Include="RemoteDesktopServices\RdsPolicyTypes.cs" />

View file

@ -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<RdsCollectionSetting> GetCollectionSettings(this Runspace runspace, string collectionName, string connectionBroker, string primaryDomainController, out object[] errors)
{
var result = new List<RdsCollectionSetting>();
var errorsList = new List<object>();
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<RdsCollectionSetting> 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<string> 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<string>();
if (psObjects != null)
{
foreach(var psObject in psObjects)
{
rdsServers.Add(GetPSObjectProperty(psObject, "SessionHost").ToString());
}
}
return rdsServers;
}
private static List<RdsCollectionSetting> 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<RdsCollectionSetting>();
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<PSObject> ExecuteShellCommand(Runspace runSpace, Command cmd, bool useDomainController, string primaryDomainController)
{
object[] errors;
return ExecuteShellCommand(runSpace, cmd, useDomainController, primaryDomainController, out errors);
}
private static Collection<PSObject> ExecuteShellCommand(Runspace runSpace, Command cmd, bool useDomainController, string primaryDomainController,
out object[] errors)
{
Log.WriteStart("ExecuteShellCommand");
List<object> errorList = new List<object>();
if (useDomainController)
{
CommandParameter dc = new CommandParameter("DomainController", primaryDomainController);
if (!cmd.Parameters.Contains(dc))
{
cmd.Parameters.Add(dc);
}
}
Collection<PSObject> 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;
}
}
}

View file

@ -46,6 +46,7 @@
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="RdsRunspaceExtensions.cs" />
<Compile Include="Windows2012.cs" /> <Compile Include="Windows2012.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="VersionInfo.cs" /> <Compile Include="VersionInfo.cs" />

View file

@ -486,19 +486,7 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
try try
{ {
runSpace = OpenRunspace(); runSpace = OpenRunspace();
collection = runSpace.GetCollection(collectionName, ConnectionBroker, PrimaryDomainController);
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"));
}
} }
finally finally
{ {
@ -1656,6 +1644,124 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
#endregion #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<string> 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<string> { GetUsersGroupName(collection.Name) });
}
CreateRdRapForce(runSpace, gateway, rapPolicyName, collection.Name, new List<string> { GetUsersGroupName(collection.Name) });
}
if (CentralNps)
{
CreateCentralNpsPolicy(runSpace, CentralNpsHost, capPolicyName, collection.Name, organizationId);
}
//add user group to collection
AddUserGroupsToCollection(runSpace, collection.Name, new List<string> { 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) private void AddRdsServerToDeployment(Runspace runSpace, RdsServer server)
{ {
Command cmd = new Command("Add-RDserver"); Command cmd = new Command("Add-RDserver");
@ -2723,6 +2829,11 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
cmd.Parameters.Add("CollectionName", collection.Name); cmd.Parameters.Add("CollectionName", collection.Name);
cmd.Parameters.Add("ConnectionBroker", ConnectionBroker); cmd.Parameters.Add("ConnectionBroker", ConnectionBroker);
if (string.IsNullOrEmpty(collection.Settings.ClientDeviceRedirectionOptions))
{
collection.Settings.ClientDeviceRedirectionOptions = "None";
}
var properties = collection.Settings.GetType().GetProperties(); var properties = collection.Settings.GetType().GetProperties();
foreach(var prop in properties) foreach(var prop in properties)
@ -2733,7 +2844,7 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
if (value != null) if (value != null)
{ {
cmd.Parameters.Add(prop.Name, value); cmd.Parameters.Add(prop.Name, value);
} }
} }
} }

View file

@ -108,6 +108,10 @@ namespace WebsitePanel.Providers.RemoteDesktopServices {
private System.Threading.SendOrPostCallback MoveSessionHostsToCollectionOUOperationCompleted; private System.Threading.SendOrPostCallback MoveSessionHostsToCollectionOUOperationCompleted;
private System.Threading.SendOrPostCallback GetExistingCollectionOperationCompleted;
private System.Threading.SendOrPostCallback ImportCollectionOperationCompleted;
/// <remarks/> /// <remarks/>
public RemoteDesktopServices() { public RemoteDesktopServices() {
this.Url = "http://localhost:9003/RemoteDesktopServices.asmx"; this.Url = "http://localhost:9003/RemoteDesktopServices.asmx";
@ -230,6 +234,12 @@ namespace WebsitePanel.Providers.RemoteDesktopServices {
/// <remarks/> /// <remarks/>
public event MoveSessionHostsToCollectionOUCompletedEventHandler MoveSessionHostsToCollectionOUCompleted; public event MoveSessionHostsToCollectionOUCompletedEventHandler MoveSessionHostsToCollectionOUCompleted;
/// <remarks/>
public event GetExistingCollectionCompletedEventHandler GetExistingCollectionCompleted;
/// <remarks/>
public event ImportCollectionCompletedEventHandler ImportCollectionCompleted;
/// <remarks/> /// <remarks/>
[System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [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)] [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 {
} }
} }
/// <remarks/>
[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]));
}
/// <remarks/>
public System.IAsyncResult BeginGetExistingCollection(string collectionName, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetExistingCollection", new object[] {
collectionName}, callback, asyncState);
}
/// <remarks/>
public ImportedRdsCollection EndGetExistingCollection(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((ImportedRdsCollection)(results[0]));
}
/// <remarks/>
public void GetExistingCollectionAsync(string collectionName) {
this.GetExistingCollectionAsync(collectionName, null);
}
/// <remarks/>
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));
}
}
/// <remarks/>
[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});
}
/// <remarks/>
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);
}
/// <remarks/>
public void EndImportCollection(System.IAsyncResult asyncResult) {
this.EndInvoke(asyncResult);
}
/// <remarks/>
public void ImportCollectionAsync(string organizationId, RdsCollection collection, string[] users) {
this.ImportCollectionAsync(organizationId, collection, users, null);
}
/// <remarks/>
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));
}
}
/// <remarks/> /// <remarks/>
public new void CancelAsync(object userState) { public new void CancelAsync(object userState) {
base.CancelAsync(userState); base.CancelAsync(userState);
@ -2578,4 +2676,34 @@ namespace WebsitePanel.Providers.RemoteDesktopServices {
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void MoveSessionHostsToCollectionOUCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); public delegate void MoveSessionHostsToCollectionOUCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void GetExistingCollectionCompletedEventHandler(object sender, GetExistingCollectionCompletedEventArgs e);
/// <remarks/>
[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;
}
/// <remarks/>
public ImportedRdsCollection Result {
get {
this.RaiseExceptionIfNecessary();
return ((ImportedRdsCollection)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void ImportCollectionCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);
} }

View file

@ -711,5 +711,37 @@ namespace WebsitePanel.Server
throw; 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<string> 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;
}
}
} }
} }

View file

@ -158,6 +158,7 @@
<Control key="rds_collections" /> <Control key="rds_collections" />
<Control key="rds_create_collection" general_key="rds_collections" /> <Control key="rds_create_collection" general_key="rds_collections" />
<Control key="rds_import_collection" general_key="rds_collections" />
<Control key="rds_collection_edit_apps" general_key="rds_collections" /> <Control key="rds_collection_edit_apps" general_key="rds_collections" />
<Control key="rds_collection_edit_users" general_key="rds_collections" /> <Control key="rds_collection_edit_users" general_key="rds_collections" />
<Control key="rds_application_edit_users" general_key="rds_collections" /> <Control key="rds_application_edit_users" general_key="rds_collections" />

View file

@ -606,6 +606,7 @@
<Control key="rds_add_server" src="WebsitePanel/RDS/AddRDSServer.ascx" title="AddRDSServer" type="View" /> <Control key="rds_add_server" src="WebsitePanel/RDS/AddRDSServer.ascx" title="AddRDSServer" type="View" />
<Control key="rds_collections" src="WebsitePanel/RDS/RDSCollections.ascx" title="RDSCollections" type="View" /> <Control key="rds_collections" src="WebsitePanel/RDS/RDSCollections.ascx" title="RDSCollections" type="View" />
<Control key="rds_create_collection" src="WebsitePanel/RDS/RDSCreateCollection.ascx" title="RDSCreateCollection" type="View" /> <Control key="rds_create_collection" src="WebsitePanel/RDS/RDSCreateCollection.ascx" title="RDSCreateCollection" type="View" />
<Control key="rds_import_collection" src="WebsitePanel/RDS/RDSImportCollection.ascx" title="RDSImportCollection" type="View" />
<Control key="rds_collection_edit_apps" src="WebsitePanel/RDS/RDSEditCollectionApps.ascx" title="RDSEditCollectionApps" type="View" /> <Control key="rds_collection_edit_apps" src="WebsitePanel/RDS/RDSEditCollectionApps.ascx" title="RDSEditCollectionApps" type="View" />
<Control key="rds_collection_edit_users" src="WebsitePanel/RDS/RDSEditCollectionUsers.ascx" title="RDSEditCollectionUsers" type="View" /> <Control key="rds_collection_edit_users" src="WebsitePanel/RDS/RDSEditCollectionUsers.ascx" title="RDSEditCollectionUsers" type="View" />
<Control key="deleted_users" src="WebsitePanel/ExchangeServer/OrganizationDeletedUsers.ascx" title="OrganizationDeletedUsers" type="View" /> <Control key="deleted_users" src="WebsitePanel/ExchangeServer/OrganizationDeletedUsers.ascx" title="OrganizationDeletedUsers" type="View" />

View file

@ -5784,6 +5784,9 @@
<data name="Error.RDS_CREATE_COLLECTION_RDSSERVER_REQUAIRED" xml:space="preserve"> <data name="Error.RDS_CREATE_COLLECTION_RDSSERVER_REQUAIRED" xml:space="preserve">
<value>Error creating rds collection. You need to add at least 1 rds server to collection</value> <value>Error creating rds collection. You need to add at least 1 rds server to collection</value>
</data> </data>
<data name="Error.RDS_IMPORT_COLLECTION_NOT_FOUND" xml:space="preserve">
<value>Error importing rds collection. Collection not found</value>
</data>
<data name="Quota.Exchange2013.ResourceMailboxes" xml:space="preserve"> <data name="Quota.Exchange2013.ResourceMailboxes" xml:space="preserve">
<value>Resource Mailboxes per Organization</value> <value>Resource Mailboxes per Organization</value>
</data> </data>
@ -5820,6 +5823,9 @@
<data name="ERROR.RDSCOLLECTION_NOT_CREATED" xml:space="preserve"> <data name="ERROR.RDSCOLLECTION_NOT_CREATED" xml:space="preserve">
<value>Collection not created</value> <value>Collection not created</value>
</data> </data>
<data name="ERROR.RDSCOLLECTION_NOT_IMPORTED" xml:space="preserve">
<value>Collection not imported</value>
</data>
<data name="ERROR.RDSSESSIONHOST_CERTIFICATE_NOT_INSTALLED" xml:space="preserve"> <data name="ERROR.RDSSESSIONHOST_CERTIFICATE_NOT_INSTALLED" xml:space="preserve">
<value>Session host certificate not installed</value> <value>Session host certificate not installed</value>
</data> </data>

View file

@ -120,9 +120,15 @@
<data name="cbAdministrators.Text" xml:space="preserve"> <data name="cbAdministrators.Text" xml:space="preserve">
<value>Administrators</value> <value>Administrators</value>
</data> </data>
<data name="cbAllowImport.Text" xml:space="preserve">
<value>Allow</value>
</data>
<data name="cbUsers.Text" xml:space="preserve"> <data name="cbUsers.Text" xml:space="preserve">
<value>Users</value> <value>Users</value>
</data> </data>
<data name="secAllowImport.Text" xml:space="preserve">
<value>Connections Import</value>
</data>
<data name="secChangeDesktop.Text" xml:space="preserve"> <data name="secChangeDesktop.Text" xml:space="preserve">
<value>Changing Desktop Disabled</value> <value>Changing Desktop Disabled</value>
</data> </data>

View file

@ -150,4 +150,7 @@
<data name="locQuota.Text" xml:space="preserve"> <data name="locQuota.Text" xml:space="preserve">
<value>Total Remote Desktop Collections Created:</value> <value>Total Remote Desktop Collections Created:</value>
</data> </data>
<data name="btnImportCollection.Text" xml:space="preserve">
<value>Import RDS Collection</value>
</data>
</root> </root>

View file

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="btnSave.Text" xml:space="preserve">
<value>Import</value>
</data>
<data name="locTitle.Text" xml:space="preserve">
<value>Import RDSCollection</value>
</data>
</root>

View file

@ -22,6 +22,8 @@
<div class="FormButtonsBarCleanLeft"> <div class="FormButtonsBarCleanLeft">
<asp:Button ID="btnAddCollection" runat="server" meta:resourcekey="btnAddCollection" <asp:Button ID="btnAddCollection" runat="server" meta:resourcekey="btnAddCollection"
Text="Create New RDS Collection" CssClass="Button1" OnClick="btnAddCollection_Click" /> Text="Create New RDS Collection" CssClass="Button1" OnClick="btnAddCollection_Click" />
<asp:Button ID="btnImportCollection" runat="server" meta:resourcekey="btnImportCollection"
Text="Import RDS Collection" CssClass="Button1" OnClick="btnImportCollection_Click" />
</div> </div>
<div class="FormButtonsBarCleanRight"> <div class="FormButtonsBarCleanRight">
<asp:Panel ID="SearchPanel" runat="server" DefaultButton="cmdSearch"> <asp:Panel ID="SearchPanel" runat="server" DefaultButton="cmdSearch">

View file

@ -30,6 +30,7 @@ using System;
using System.Linq; using System.Linq;
using System.Web.UI.WebControls; using System.Web.UI.WebControls;
using WebsitePanel.EnterpriseServer; using WebsitePanel.EnterpriseServer;
using WebsitePanel.EnterpriseServer.Base.RDS;
using WebsitePanel.Providers.Common; using WebsitePanel.Providers.Common;
using WebsitePanel.Providers.HostedSolution; using WebsitePanel.Providers.HostedSolution;
using WebsitePanel.Providers.OS; 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)); 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) private void BindQuota(PackageContext cntx)
@ -83,6 +92,12 @@ namespace WebsitePanel.Portal.RDS
"SpaceID=" + PanelSecurity.PackageId)); "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) protected void gvRDSCollections_RowCommand(object sender, GridViewCommandEventArgs e)
{ {
if (e.CommandName == "DeleteItem") if (e.CommandName == "DeleteItem")

View file

@ -57,6 +57,15 @@ namespace WebsitePanel.Portal.RDS {
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Button btnAddCollection; protected global::System.Web.UI.WebControls.Button btnAddCollection;
/// <summary>
/// btnImportCollection control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Button btnImportCollection;
/// <summary> /// <summary>
/// SearchPanel control. /// SearchPanel control.
/// </summary> /// </summary>

View file

@ -15,7 +15,7 @@
<div class="Center"> <div class="Center">
<div class="Title"> <div class="Title">
<asp:Image ID="imgAddRDSServer" SkinID="AddRDSServer48" runat="server" /> <asp:Image ID="imgAddRDSServer" SkinID="AddRDSServer48" runat="server" />
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Add Server To Organization"></asp:Localize> <asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Create New RDS Collection"></asp:Localize>
</div> </div>
<div class="FormContentRDS"> <div class="FormContentRDS">
<wsp:SimpleMessageBox id="messageBox" runat="server" /> <wsp:SimpleMessageBox id="messageBox" runat="server" />

View file

@ -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" %>
<script type="text/javascript" src="/JavaScript/jquery.min.js?v=1.4.4"></script>
<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %>
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
<div id="ExchangeContainer">
<div class="Module">
<div class="Left">
</div>
<div class="Content">
<div class="Center">
<div class="Title">
<asp:Image ID="imgAddRDSServer" SkinID="AddRDSServer48" runat="server" />
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Import RDS Collection"></asp:Localize>
</div>
<div class="FormContentRDS">
<wsp:SimpleMessageBox id="messageBox" runat="server" />
<table>
<tr>
<td class="FormLabel150" style="width: 100px;"><asp:Localize ID="locCollectionName" runat="server" meta:resourcekey="locCollectionName" Text="Collection Name"></asp:Localize></td>
<td>
<asp:TextBox ID="txtCollectionName" runat="server" CssClass="TextBox300" />
<asp:RequiredFieldValidator ID="valCollectionName" runat="server" ErrorMessage="*" ControlToValidate="txtCollectionName" ValidationGroup="SaveRDSCollection"></asp:RequiredFieldValidator>
</td>
</tr>
</table>
<div class="FormFooter">
<asp:Button id="btnSave" runat="server" Text="Import" CssClass="Button1" meta:resourcekey="btnSave" OnClick="btnSave_Click" OnClientClick="ShowProgressDialog('Importing collection...');" ValidationGroup="SaveRDSCollection"></asp:Button>
</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -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);
}
}
}
}

View file

@ -0,0 +1,78 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace WebsitePanel.Portal.RDS {
public partial class RDSImportCollection {
/// <summary>
/// imgAddRDSServer control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Image imgAddRDSServer;
/// <summary>
/// locTitle control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locTitle;
/// <summary>
/// messageBox control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox;
/// <summary>
/// locCollectionName control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locCollectionName;
/// <summary>
/// txtCollectionName control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtCollectionName;
/// <summary>
/// valCollectionName control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator valCollectionName;
/// <summary>
/// btnSave control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Button btnSave;
}
}

View file

@ -180,4 +180,15 @@
</tr> </tr>
</table> </table>
<br /> <br />
</asp:Panel> </asp:Panel>
<wsp:CollapsiblePanel id="secAllowImport" runat="server" TargetControlID="allowImportPanel" meta:resourcekey="secAllowImport" Text="Connections Import"/>
<asp:Panel ID="allowImportPanel" runat="server" Height="0" style="overflow:hidden;">
<table>
<tr>
<td>
<asp:CheckBox runat="server" Text="Users" ID="cbAllowImport" meta:resourcekey="cbAllowImport" Checked="false" />
</td>
</tr>
</table>
<br />
</asp:Panel>

View file

@ -53,6 +53,7 @@ namespace WebsitePanel.Portal
cbDisableCmdUsers.Checked = Convert.ToBoolean(settings[RdsServerSettings.DISABLE_CMD_USERS]); cbDisableCmdUsers.Checked = Convert.ToBoolean(settings[RdsServerSettings.DISABLE_CMD_USERS]);
ddTreshold.SelectedValue = settings[RdsServerSettings.DRIVE_SPACE_THRESHOLD_VALUE]; ddTreshold.SelectedValue = settings[RdsServerSettings.DRIVE_SPACE_THRESHOLD_VALUE];
cbAllowImport.Checked = Convert.ToBoolean(settings[RdsServerSettings.ALLOWCONNECTIONSIMPORT]);
} }
public void SaveSettings(UserSettings settings) public void SaveSettings(UserSettings settings)
@ -81,6 +82,7 @@ namespace WebsitePanel.Portal
settings[RdsServerSettings.RDS_CONTROL_WITHOUT_PERMISSION_Users] = cbControlSessionUsers.Checked.ToString(); settings[RdsServerSettings.RDS_CONTROL_WITHOUT_PERMISSION_Users] = cbControlSessionUsers.Checked.ToString();
settings[RdsServerSettings.DISABLE_CMD_ADMINISTRATORS] = cbDisableCmdAdministrators.Checked.ToString(); settings[RdsServerSettings.DISABLE_CMD_ADMINISTRATORS] = cbDisableCmdAdministrators.Checked.ToString();
settings[RdsServerSettings.DISABLE_CMD_USERS] = cbDisableCmdUsers.Checked.ToString(); settings[RdsServerSettings.DISABLE_CMD_USERS] = cbDisableCmdUsers.Checked.ToString();
settings[RdsServerSettings.ALLOWCONNECTIONSIMPORT] = cbAllowImport.Checked.ToString();
} }
} }
} }

View file

@ -443,5 +443,32 @@ namespace WebsitePanel.Portal {
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.CheckBox cbDisableCmdAdministrators; protected global::System.Web.UI.WebControls.CheckBox cbDisableCmdAdministrators;
/// <summary>
/// secAllowImport control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.CollapsiblePanel secAllowImport;
/// <summary>
/// allowImportPanel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Panel allowImportPanel;
/// <summary>
/// cbAllowImport control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.CheckBox cbAllowImport;
} }
} }

View file

@ -332,6 +332,13 @@
<Compile Include="HostedSharePoint\HostedSharePointEnterpriseStorageUsage.ascx.designer.cs"> <Compile Include="HostedSharePoint\HostedSharePointEnterpriseStorageUsage.ascx.designer.cs">
<DependentUpon>HostedSharePointEnterpriseStorageUsage.ascx</DependentUpon> <DependentUpon>HostedSharePointEnterpriseStorageUsage.ascx</DependentUpon>
</Compile> </Compile>
<Compile Include="RDS\RDSImportCollection.ascx.cs">
<DependentUpon>RDSImportCollection.ascx</DependentUpon>
<SubType>ASPXCodeBehind</SubType>
</Compile>
<Compile Include="RDS\RDSImportCollection.ascx.designer.cs">
<DependentUpon>RDSImportCollection.ascx</DependentUpon>
</Compile>
<Compile Include="VpsMenu.ascx.cs"> <Compile Include="VpsMenu.ascx.cs">
<DependentUpon>VpsMenu.ascx</DependentUpon> <DependentUpon>VpsMenu.ascx</DependentUpon>
<SubType>ASPXCodeBehind</SubType> <SubType>ASPXCodeBehind</SubType>
@ -4901,6 +4908,7 @@
<Content Include="HostedSharePoint\HostedSharePointEnterpriseRestoreSiteCollection.ascx" /> <Content Include="HostedSharePoint\HostedSharePointEnterpriseRestoreSiteCollection.ascx" />
<Content Include="HostedSharePoint\HostedSharePointEnterpriseStorageSettings.ascx" /> <Content Include="HostedSharePoint\HostedSharePointEnterpriseStorageSettings.ascx" />
<Content Include="HostedSharePoint\HostedSharePointEnterpriseStorageUsage.ascx" /> <Content Include="HostedSharePoint\HostedSharePointEnterpriseStorageUsage.ascx" />
<Content Include="RDS\RDSImportCollection.ascx" />
<Content Include="VpsMenu.ascx" /> <Content Include="VpsMenu.ascx" />
<Content Include="ProviderControls\HyperV2012R2_Settings.ascx" /> <Content Include="ProviderControls\HyperV2012R2_Settings.ascx" />
<Content Include="SearchObject.ascx" /> <Content Include="SearchObject.ascx" />
@ -5066,6 +5074,7 @@
<Content Include="RDS\App_LocalResources\RDSLocalAdmins.ascx.resx" /> <Content Include="RDS\App_LocalResources\RDSLocalAdmins.ascx.resx" />
<Content Include="RDS\App_LocalResources\RDSSetupLetter.ascx.resx" /> <Content Include="RDS\App_LocalResources\RDSSetupLetter.ascx.resx" />
<Content Include="RDS\App_LocalResources\RDSEditUserExperience.ascx.resx" /> <Content Include="RDS\App_LocalResources\RDSEditUserExperience.ascx.resx" />
<Content Include="RDS\App_LocalResources\RDSImportCollection.ascx.resx" />
<EmbeddedResource Include="ScheduleTaskControls\App_LocalResources\DomainLookupView.ascx.resx"> <EmbeddedResource Include="ScheduleTaskControls\App_LocalResources\DomainLookupView.ascx.resx">
<Generator>ResXFileCodeGenerator</Generator> <Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>DomainLookupView.ascx.Designer.cs</LastGenOutput> <LastGenOutput>DomainLookupView.ascx.Designer.cs</LastGenOutput>