Check before RDS users delete

This commit is contained in:
vfedosevich 2015-05-26 05:10:04 -07:00
parent bbce2a9916
commit 10bd8fe654
8 changed files with 255 additions and 64 deletions

View file

@ -1596,7 +1596,14 @@ namespace WebsitePanel.EnterpriseServer
var rds = RemoteDesktopServicesHelpers.GetRemoteDesktopServices(RemoteDesktopServicesHelpers.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); string alias = "";
if (remoteApp != null)
{
alias = remoteApp.Alias;
}
var users = rds.GetApplicationUsers(collection.Name, alias);
result.AddRange(users); result.AddRange(users);
return result; return result;

View file

@ -709,7 +709,11 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
Command cmd = new Command("Get-RDRemoteApp"); Command cmd = new Command("Get-RDRemoteApp");
cmd.Parameters.Add("CollectionName", collectionName); cmd.Parameters.Add("CollectionName", collectionName);
cmd.Parameters.Add("ConnectionBroker", ConnectionBroker); cmd.Parameters.Add("ConnectionBroker", ConnectionBroker);
if (!string.IsNullOrEmpty(applicationName))
{
cmd.Parameters.Add("Alias", applicationName); cmd.Parameters.Add("Alias", applicationName);
}
var application = ExecuteShellCommand(runspace, cmd, false).FirstOrDefault(); var application = ExecuteShellCommand(runspace, cmd, false).FirstOrDefault();

View file

@ -10,7 +10,7 @@
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
<div id="ExchangeContainer"> <div id="ExchangeContainer">
<div class="Module"> <div class="Module">
<div class="Left"> <div class="Left">
</div> </div>
@ -25,11 +25,9 @@
<div class="FormContentRDS"> <div class="FormContentRDS">
<wsp:SimpleMessageBox id="messageBox" runat="server" /> <wsp:SimpleMessageBox id="messageBox" runat="server" />
<wsp:CollectionTabs id="tabs" runat="server" SelectedTab="rds_collection_edit_users" /> <wsp:CollectionTabs id="tabs" runat="server" SelectedTab="rds_collection_edit_users" />
<wsp:CollapsiblePanel id="secRdsUsers" runat="server" <wsp:CollapsiblePanel id="secRdsUsers" runat="server"
TargetControlID="panelRdsUsers" meta:resourcekey="secRdsUsers" Text=""> TargetControlID="panelRdsUsers" meta:resourcekey="secRdsUsers" Text="">
</wsp:CollapsiblePanel> </wsp:CollapsiblePanel>
<asp:Panel runat="server" ID="panelRdsUsers"> <asp:Panel runat="server" ID="panelRdsUsers">
<div style="padding: 10px;"> <div style="padding: 10px;">
<wsp:CollectionUsers id="users" runat="server" /> <wsp:CollectionUsers id="users" runat="server" />
@ -48,4 +46,4 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -26,7 +26,9 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using AjaxControlToolkit;
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Web.UI.WebControls; using System.Web.UI.WebControls;
using WebsitePanel.EnterpriseServer; using WebsitePanel.EnterpriseServer;
@ -42,28 +44,13 @@ namespace WebsitePanel.Portal.RDS
protected void Page_Load(object sender, EventArgs e) protected void Page_Load(object sender, EventArgs e)
{ {
users.Module = Module; users.Module = Module;
users.OnRefreshClicked -= OnRefreshClicked;
users.OnRefreshClicked += OnRefreshClicked;
if (!IsPostBack) if (!IsPostBack)
{ {
BindQuota(); BindQuota();
var collectionUsers = ES.Services.RDS.GetRdsCollectionUsers(PanelRequest.CollectionID); users.BindUsers();
var collection = ES.Services.RDS.GetRdsCollection(PanelRequest.CollectionID);
var localAdmins = ES.Services.RDS.GetRdsCollectionLocalAdmins(PanelRequest.CollectionID);
foreach (var user in collectionUsers)
{
if (localAdmins.Select(l => l.AccountName).Contains(user.AccountName))
{
user.IsVIP = true;
}
else
{
user.IsVIP = false;
}
}
litCollectionName.Text = collection.DisplayName;
users.SetUsers(collectionUsers);
} }
} }
@ -87,6 +74,11 @@ namespace WebsitePanel.Portal.RDS
} }
} }
private void OnRefreshClicked(object sender, EventArgs e)
{
((ModalPopupExtender)asyncTasks.FindControl("ModalPopupProperties")).Hide();
}
private bool SaveRdsUsers() private bool SaveRdsUsers()
{ {
try try

View file

@ -126,6 +126,9 @@
<data name="btnCancel.Text" xml:space="preserve"> <data name="btnCancel.Text" xml:space="preserve">
<value>Cancel</value> <value>Cancel</value>
</data> </data>
<data name="btnCancelDeleteWarning.Text" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="btnDelete.Text" xml:space="preserve"> <data name="btnDelete.Text" xml:space="preserve">
<value>Delete</value> <value>Delete</value>
</data> </data>
@ -153,4 +156,10 @@
<data name="headerAddAccounts.Text" xml:space="preserve"> <data name="headerAddAccounts.Text" xml:space="preserve">
<value>Enabled Users</value> <value>Enabled Users</value>
</data> </data>
<data name="headerDeleteWarning.Text" xml:space="preserve">
<value>Warning</value>
</data>
<data name="locDeleteWarning.Text" xml:space="preserve">
<value>Unable to remove the following user(s) since they are local admins&lt;br/&gt;or they were granted access to remote applications</value>
</data>
</root> </root>

View file

@ -5,7 +5,7 @@
<ContentTemplate> <ContentTemplate>
<div class="FormButtonsBarClean"> <div class="FormButtonsBarClean">
<asp:Button ID="btnAdd" runat="server" Text="Add..." CssClass="Button1" OnClick="btnAdd_Click" meta:resourcekey="btnAdd" /> <asp:Button ID="btnAdd" runat="server" Text="Add..." CssClass="Button1" OnClick="btnAdd_Click" meta:resourcekey="btnAdd" />
<asp:Button ID="btnDelete" runat="server" Text="Delete" CssClass="Button1" OnClick="btnDelete_Click" meta:resourcekey="btnDelete"/> <asp:Button ID="btnDelete" runat="server" Text="Delete" CssClass="Button1" OnClick="btnDelete_Click" OnClientClick="ShowProgressDialog('Checking users ...');return true;" meta:resourcekey="btnDelete"/>
</div> </div>
<asp:GridView ID="gvUsers" runat="server" meta:resourcekey="gvUsers" AutoGenerateColumns="False" <asp:GridView ID="gvUsers" runat="server" meta:resourcekey="gvUsers" AutoGenerateColumns="False"
Width="600px" CssSelectorClass="NormalGridView" OnRowCommand="gvUsers_RowCommand" Width="600px" CssSelectorClass="NormalGridView" OnRowCommand="gvUsers_RowCommand"
@ -113,6 +113,41 @@
</div> </div>
</asp:Panel> </asp:Panel>
<asp:Panel ID="DeleteWarningPanel" runat="server" CssClass="Popup" style="display:none">
<table class="Popup-Header" cellpadding="0" cellspacing="0">
<tr>
<td class="Popup-HeaderLeft"/>
<td class="Popup-HeaderTitle">
<asp:Localize ID="lcDeleteWarningHeader" runat="server" meta:resourcekey="headerDeleteWarning"></asp:Localize>
</td>
<td class="Popup-HeaderRight"/>
</tr>
</table>
<div class="Popup-Content">
<div class="Popup-Body">
<br />
<asp:UpdatePanel ID="deleteWarningUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate>
<div class="Popup-Scroll" style="height:auto;">
<asp:Panel runat="server" ID="panelDeleteWarning">
<asp:Localize runat="server" ID="locDeleteWarning" Text="Unable to remove the following user(s) since they are local admins or<br/>they were granted access to remote applications" />
<br/>
<asp:Literal runat="server" ID="ltUsers" Text="" />
</asp:Panel>
</div>
</ContentTemplate>
</asp:UpdatePanel>
<br />
</div>
<div class="FormFooter">
<asp:Button ID="btnCancelDeleteWarning" runat="server" CssClass="Button1" meta:resourcekey="btnCancelDeleteWarning" Text="Cancel" CausesValidation="false" />
</div>
</div>
</asp:Panel>
<asp:Button ID="btnDeleteWarningFake" runat="server" style="display:none;" />
<ajaxToolkit:ModalPopupExtender ID="DeleteWarningModal" runat="server" TargetControlID="btnDeleteWarningFake" PopupControlID="DeleteWarningPanel"
BackgroundCssClass="modalBackground" DropShadow="false" CancelControlID="btnCancelDeleteWarning"/>
<asp:Button ID="btnAddAccountsFake" runat="server" style="display:none;" /> <asp:Button ID="btnAddAccountsFake" runat="server" style="display:none;" />
<ajaxToolkit:ModalPopupExtender ID="AddAccountsModal" runat="server" <ajaxToolkit:ModalPopupExtender ID="AddAccountsModal" runat="server"
TargetControlID="btnAddAccountsFake" PopupControlID="AddAccountsPanel" TargetControlID="btnAddAccountsFake" PopupControlID="AddAccountsPanel"

View file

@ -41,6 +41,7 @@ namespace WebsitePanel.Portal.RDS.UserControls
public partial class RDSCollectionUsers : WebsitePanelControlBase public partial class RDSCollectionUsers : WebsitePanelControlBase
{ {
public const string DirectionString = "DirectionString"; public const string DirectionString = "DirectionString";
public event EventHandler OnRefreshClicked;
public bool ButtonAddEnabled public bool ButtonAddEnabled
{ {
@ -99,12 +100,19 @@ namespace WebsitePanel.Portal.RDS.UserControls
} }
protected void btnDelete_Click(object sender, EventArgs e) protected void btnDelete_Click(object sender, EventArgs e)
{
if (CheckDeletedUsers())
{ {
List<OrganizationUser> selectedAccounts = GetGridViewUsers(SelectedState.Unselected); List<OrganizationUser> selectedAccounts = GetGridViewUsers(SelectedState.Unselected);
BindAccounts(selectedAccounts.ToArray(), false); BindAccounts(selectedAccounts.ToArray(), false);
} }
if (OnRefreshClicked != null)
{
OnRefreshClicked(sender, new EventArgs());
}
}
protected void btnAddSelected_Click(object sender, EventArgs e) protected void btnAddSelected_Click(object sender, EventArgs e)
{ {
List<OrganizationUser> selectedAccounts = GetGridViewAccounts(); List<OrganizationUser> selectedAccounts = GetGridViewAccounts();
@ -134,9 +142,66 @@ namespace WebsitePanel.Portal.RDS.UserControls
return GetThemedImage("Exchange/" + imgName); return GetThemedImage("Exchange/" + imgName);
} }
public bool CheckDeletedUsers()
{
var rdsUsers = GetGridViewUsers(SelectedState.Selected);
var localAdmins = ES.Services.RDS.GetRdsCollectionLocalAdmins(PanelRequest.CollectionID);
var organizationUsers = ES.Services.Organizations.GetOrganizationUsersPaged(PanelRequest.ItemID, null, null, null, 0, Int32.MaxValue).PageUsers;
var applicationUsers = ES.Services.RDS.GetApplicationUsers(PanelRequest.ItemID, PanelRequest.CollectionID, null);
var remoteAppUsers = organizationUsers.Where(x => applicationUsers.Select(a => a.Split('\\').Last().ToLower()).Contains(x.SamAccountName.Split('\\').Last().ToLower()));
var deletedUsers = new List<OrganizationUser>();
deletedUsers.AddRange(rdsUsers.Where(r => localAdmins.Select(l => l.AccountName.ToLower()).Contains(r.AccountName.ToLower())));
remoteAppUsers = remoteAppUsers.Where(r => !localAdmins.Select(l => l.AccountName.ToLower()).Contains(r.AccountName.ToLower()));
deletedUsers.AddRange(rdsUsers.Where(r => remoteAppUsers.Select(l => l.AccountName.ToLower()).Contains(r.AccountName.ToLower())));
deletedUsers = deletedUsers.Distinct().ToList();
if (deletedUsers.Any())
{
ltUsers.Text = string.Join("<br/>", deletedUsers.Select(d => d.DisplayName));
DeleteWarningModal.Show();
return false;
}
return true;
}
public void BindUsers()
{
var collectionUsers = ES.Services.RDS.GetRdsCollectionUsers(PanelRequest.CollectionID);
var collection = ES.Services.RDS.GetRdsCollection(PanelRequest.CollectionID);
var localAdmins = ES.Services.RDS.GetRdsCollectionLocalAdmins(PanelRequest.CollectionID);
foreach (var user in collectionUsers)
{
if (localAdmins.Select(l => l.AccountName).Contains(user.AccountName))
{
user.IsVIP = true;
}
else
{
user.IsVIP = false;
}
}
SetUsers(collectionUsers);
}
protected void BindPopupAccounts() protected void BindPopupAccounts()
{ {
OrganizationUser[] accounts = ES.Services.Organizations.GetOrganizationUsersPaged(PanelRequest.ItemID, null, null, null, 0, Int32.MaxValue).PageUsers; OrganizationUser[] accounts;
if (PanelRequest.Ctl == "rds_collection_edit_users")
{
accounts = ES.Services.Organizations.GetOrganizationUsersPaged(PanelRequest.ItemID, null, null, null, 0, Int32.MaxValue).PageUsers;
}
else
{
accounts = ES.Services.RDS.GetRdsCollectionUsers(PanelRequest.CollectionID);
}
var localAdmins = ES.Services.RDS.GetRdsCollectionLocalAdmins(PanelRequest.CollectionID); var localAdmins = ES.Services.RDS.GetRdsCollectionLocalAdmins(PanelRequest.CollectionID);
foreach (var user in accounts) foreach (var user in accounts)

View file

@ -138,6 +138,87 @@ namespace WebsitePanel.Portal.RDS.UserControls {
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Button btnCancelAdd; protected global::System.Web.UI.WebControls.Button btnCancelAdd;
/// <summary>
/// DeleteWarningPanel 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 DeleteWarningPanel;
/// <summary>
/// lcDeleteWarningHeader 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 lcDeleteWarningHeader;
/// <summary>
/// deleteWarningUpdatePanel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UpdatePanel deleteWarningUpdatePanel;
/// <summary>
/// panelDeleteWarning 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 panelDeleteWarning;
/// <summary>
/// locDeleteWarning 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 locDeleteWarning;
/// <summary>
/// ltUsers 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.Literal ltUsers;
/// <summary>
/// btnCancelDeleteWarning 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 btnCancelDeleteWarning;
/// <summary>
/// btnDeleteWarningFake 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 btnDeleteWarningFake;
/// <summary>
/// DeleteWarningModal control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::AjaxControlToolkit.ModalPopupExtender DeleteWarningModal;
/// <summary> /// <summary>
/// btnAddAccountsFake control. /// btnAddAccountsFake control.
/// </summary> /// </summary>