RDS Collections import
This commit is contained in:
parent
fbec129fc1
commit
dbfdb87088
32 changed files with 1504 additions and 347 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -46,6 +46,7 @@
|
|||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="RdsRunspaceExtensions.cs" />
|
||||
<Compile Include="Windows2012.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="VersionInfo.cs" />
|
||||
|
|
|
@ -486,19 +486,7 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
|
|||
try
|
||||
{
|
||||
runSpace = OpenRunspace();
|
||||
|
||||
Command cmd = new Command("Get-RDSessionCollection");
|
||||
cmd.Parameters.Add("CollectionName", collectionName);
|
||||
cmd.Parameters.Add("ConnectionBroker", ConnectionBroker);
|
||||
|
||||
var collectionPs = ExecuteShellCommand(runSpace, cmd, false).FirstOrDefault();
|
||||
|
||||
if (collectionPs != null)
|
||||
{
|
||||
collection = new RdsCollection();
|
||||
collection.Name = Convert.ToString(GetPSObjectProperty(collectionPs, "CollectionName"));
|
||||
collection.Description = Convert.ToString(GetPSObjectProperty(collectionPs, "CollectionDescription"));
|
||||
}
|
||||
collection = runSpace.GetCollection(collectionName, ConnectionBroker, PrimaryDomainController);
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
@ -1656,6 +1644,124 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
|
|||
|
||||
#endregion
|
||||
|
||||
#region Import Collection
|
||||
|
||||
public ImportedRdsCollection GetExistingCollection(string collectionName)
|
||||
{
|
||||
Runspace runspace = null;
|
||||
ImportedRdsCollection result;
|
||||
|
||||
try
|
||||
{
|
||||
runspace = OpenRunspace();
|
||||
var collection = runspace.GetCollection(collectionName, ConnectionBroker, PrimaryDomainController);
|
||||
result = new ImportedRdsCollection
|
||||
{
|
||||
CollectionName = collection.Name,
|
||||
Description = collection.Description
|
||||
};
|
||||
|
||||
if (collection == null)
|
||||
{
|
||||
throw new NullReferenceException(string.Format("Collection \"{0}\" not found", collectionName));
|
||||
}
|
||||
|
||||
object[] errors;
|
||||
result.CollectionSettings = runspace.GetCollectionSettings(collectionName, ConnectionBroker, PrimaryDomainController, out errors).ToList();
|
||||
|
||||
if (errors.Any())
|
||||
{
|
||||
throw new Exception(string.Format("Collection not imported:\r\n{0}", string.Join("r\\n\\", errors.Select(e => e.ToString()).ToArray())));
|
||||
}
|
||||
|
||||
result.SessionHosts = runspace.GetSessionHosts(collectionName, ConnectionBroker, PrimaryDomainController, out errors);
|
||||
|
||||
if (errors.Any())
|
||||
{
|
||||
throw new Exception(string.Format("Collection not imported:\r\n{0}", string.Join("r\\n\\", errors.Select(e => e.ToString()).ToArray())));
|
||||
}
|
||||
|
||||
result.UserGroups = runspace.GetCollectionUserGroups(collectionName, ConnectionBroker, PrimaryDomainController, out errors).ToList();
|
||||
|
||||
if (errors.Any())
|
||||
{
|
||||
throw new Exception(string.Format("Collection not imported:\r\n{0}", string.Join("r\\n\\", errors.Select(e => e.ToString()).ToArray())));
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
CloseRunspace(runspace);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void ImportCollection(string organizationId, RdsCollection collection, List<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)
|
||||
{
|
||||
Command cmd = new Command("Add-RDserver");
|
||||
|
@ -2723,6 +2829,11 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
|
|||
cmd.Parameters.Add("CollectionName", collection.Name);
|
||||
cmd.Parameters.Add("ConnectionBroker", ConnectionBroker);
|
||||
|
||||
if (string.IsNullOrEmpty(collection.Settings.ClientDeviceRedirectionOptions))
|
||||
{
|
||||
collection.Settings.ClientDeviceRedirectionOptions = "None";
|
||||
}
|
||||
|
||||
var properties = collection.Settings.GetType().GetProperties();
|
||||
|
||||
foreach(var prop in properties)
|
||||
|
@ -2733,7 +2844,7 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
|
|||
|
||||
if (value != null)
|
||||
{
|
||||
cmd.Parameters.Add(prop.Name, value);
|
||||
cmd.Parameters.Add(prop.Name, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue