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

@ -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>
</ItemGroup>
<ItemGroup>
<Compile Include="RdsRunspaceExtensions.cs" />
<Compile Include="Windows2012.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="VersionInfo.cs" />

View file

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