From b7ab52690e75a832c78bcc6d8f1f23092a3518e7 Mon Sep 17 00:00:00 2001 From: robvde Date: Sat, 2 Feb 2013 16:01:38 +0400 Subject: [PATCH 1/3] Update OnScheduler issues. --- .../HostedSolution/OrganizationController.cs | 1 + .../Code/Scheduling/Scheduler.cs | 62 +++++++++++-------- .../Code/Tasks/TaskManager.cs | 17 ++--- .../Global.asax.cs | 7 ++- 4 files changed, 54 insertions(+), 33 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs index c868b440..dbc21e84 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs @@ -2132,6 +2132,7 @@ namespace WebsitePanel.EnterpriseServer catch(Exception ex) { TaskManager.WriteError(ex); + res.IsSuccess = false; } return res; } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs index 9da7a64b..8da3adaf 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs @@ -40,9 +40,9 @@ namespace WebsitePanel.EnterpriseServer public sealed class Scheduler { - static SchedulerJob nextSchedule = null; + public static SchedulerJob nextSchedule = null; - // main timer + // main timer and put it to sleep static Timer scheduleTimer = new Timer(new TimerCallback(RunNextSchedule), null, Timeout.Infinite, @@ -92,6 +92,8 @@ namespace WebsitePanel.EnterpriseServer // this will put the timer to sleep scheduleTimer.Change(Timeout.Infinite, Timeout.Infinite); + System.Threading.Thread.Sleep(1000); + // run immediately RunNextSchedule(null); } @@ -122,31 +124,41 @@ namespace WebsitePanel.EnterpriseServer static void RunSchedule(SchedulerJob schedule, bool changeNextRun) { - // update next run (if required) - if (changeNextRun) + + + try { - SchedulerController.CalculateNextStartTime(schedule.ScheduleInfo); + // update next run (if required) + if (changeNextRun) + { + SchedulerController.CalculateNextStartTime(schedule.ScheduleInfo); + } + + // disable run once task + if (schedule.ScheduleInfo.ScheduleType == ScheduleType.OneTime) + schedule.ScheduleInfo.Enabled = false; + + Dictionary scheduledTasks = TaskManager.GetScheduledTasks(); + if (!scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId)) + // this task should be run, so + // update its last run + schedule.ScheduleInfo.LastRun = DateTime.Now; + + // update schedule + SchedulerController.UpdateSchedule(schedule.ScheduleInfo); + + // skip execution if the current task is still running + scheduledTasks = TaskManager.GetScheduledTasks(); + if (!scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId)) + { + // run the schedule in the separate thread + schedule.Run(); + } + } + catch (Exception Ex) + { + TaskManager.WriteError(string.Format("RunSchedule Error : {0}", Ex.Message)); } - - // disable run once task - if (schedule.ScheduleInfo.ScheduleType == ScheduleType.OneTime) - schedule.ScheduleInfo.Enabled = false; - - Dictionary scheduledTasks = TaskManager.GetScheduledTasks(); - if (!scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId)) - // this task should be run, so - // update its last run - schedule.ScheduleInfo.LastRun = DateTime.Now; - - // update schedule - SchedulerController.UpdateSchedule(schedule.ScheduleInfo); - - // skip execution if the current task is still running - if (scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId)) - return; - - // run the schedule in the separate thread - schedule.Run(); } } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Tasks/TaskManager.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Tasks/TaskManager.cs index e7b3c904..f69cb478 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Tasks/TaskManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Tasks/TaskManager.cs @@ -150,8 +150,8 @@ namespace WebsitePanel.EnterpriseServer { // ERROR WriteLogRecord(2, ex.Message, ex.StackTrace); - return new Exception(String.Format("Error executing '{0}' task on '{1}' {2}", - TopTask.TaskName, TopTask.ItemName, TopTask.Source), ex); + return new Exception((TopTask != null) ? String.Format("Error executing '{0}' task on '{1}' {2}", + TopTask.TaskName, TopTask.ItemName, TopTask.Source) : String.Format("Error executing task"), ex); } public static void WriteError(Exception ex, string text, params string[] textParameters) @@ -182,12 +182,15 @@ namespace WebsitePanel.EnterpriseServer logRecord.TextParameters = textParameters; logRecord.TextIdent = TasksStack.Count - 1; logRecord.ExceptionStackTrace = stackTrace; - RootTask.LogRecords.Add(logRecord); - RootTask.LastLogRecord = logRecord; + if (RootTask != null) + { + RootTask.LogRecords.Add(logRecord); + RootTask.LastLogRecord = logRecord; - // change entire task severity - if (severity > RootTask.Severity) - RootTask.Severity = severity; + // change entire task severity + if (severity > RootTask.Severity) + RootTask.Severity = severity; + } } public static void CompleteTask() diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Global.asax.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Global.asax.cs index a1dc2caa..64282fa2 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Global.asax.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Global.asax.cs @@ -46,7 +46,12 @@ namespace WebsitePanel.EnterpriseServer protected void Application_Start(object sender, EventArgs e) { - Scheduler.Start(); + if (ConfigurationManager.AppSettings["WebsitePanel.DistableScheduler"] != null) + if (Boolean.Parse(ConfigurationManager.AppSettings["WebsitePanel.DistableScheduler"]) == false) + { + if (Scheduler.nextSchedule == null) + Scheduler.Start(); + } } protected void Application_End(object sender, EventArgs e) From f924299d3e985556735b654625dcdac6254877d0 Mon Sep 17 00:00:00 2001 From: robvde Date: Sat, 2 Feb 2013 16:03:23 +0400 Subject: [PATCH 2/3] Partial fixed on exchange 2013 litigation hold --- .../WebsitePanel.EnterpriseServer/Web.config | 5 +- .../Exchange2013.cs | 64 +++++++++++++++++-- 2 files changed, 60 insertions(+), 9 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Web.config b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Web.config index 99362901..d8b40300 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Web.config +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Web.config @@ -5,11 +5,11 @@ - + - + @@ -21,6 +21,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution.Exchange2013/Exchange2013.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution.Exchange2013/Exchange2013.cs index a932dae7..5e35cf33 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution.Exchange2013/Exchange2013.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution.Exchange2013/Exchange2013.cs @@ -1934,13 +1934,22 @@ namespace WebsitePanel.Providers.HostedSolution if (enabledLitigationHold) { - cmd.Parameters.Add("LitigationHoldEnabled", true); cmd.Parameters.Add("RecoverableItemsQuota", ConvertKBToUnlimited(recoverabelItemsSpace)); cmd.Parameters.Add("RecoverableItemsWarningQuota", ConvertKBToUnlimited(recoverabelItemsWarning)); } ExecuteShellCommand(runSpace, cmd); + //Litigation Hold + if (enabledLitigationHold) + { + cmd = new Command("New-MailboxSearch"); + cmd.Parameters.Add("Name", upn); + cmd.Parameters.Add("InPlaceHoldEnabled", enabledLitigationHold); + cmd.Parameters.Add("SourceMailboxes", upn); + ExecuteShellCommand(runSpace, cmd); + } + //Client Access cmd = new Command("Set-CASMailbox"); cmd.Parameters.Add("Identity", id); @@ -2267,7 +2276,7 @@ namespace WebsitePanel.Providers.HostedSolution info.DisplayName = (string)GetPSObjectProperty(mailbox, "DisplayName"); info.HideFromAddressBook = (bool)GetPSObjectProperty(mailbox, "HiddenFromAddressListsEnabled"); - info.EnableLitigationHold = (bool)GetPSObjectProperty(mailbox, "LitigationHoldEnabled"); + Command cmd = new Command("Get-User"); cmd.Parameters.Add("Identity", accountName); @@ -2298,6 +2307,18 @@ namespace WebsitePanel.Providers.HostedSolution info.WebPage = (string)GetPSObjectProperty(user, "WebPage"); info.Notes = (string)GetPSObjectProperty(user, "Notes"); + //Litigation Hold + info.EnableLitigationHold = false; + cmd = new Command("Get-MailboxSearch"); + cmd.Parameters.Add("Identity", accountName); + result = ExecuteShellCommand(runSpace, cmd); + if ((result != null) & (result.Count > 0)) + { + mailbox = result[0]; + info.EnableLitigationHold = (bool)GetPSObjectProperty(mailbox, "InPlaceHoldEnabled"); + } + + } finally { @@ -2478,8 +2499,6 @@ namespace WebsitePanel.Providers.HostedSolution info.KeepDeletedItemsDays = ConvertEnhancedTimeSpanToDays((EnhancedTimeSpan)GetPSObjectProperty(mailbox, "RetainDeletedItemsFor")); - info.EnableLitigationHold = (bool)GetPSObjectProperty(mailbox, "LitigationHoldEnabled"); - info.RecoverabelItemsSpace = ConvertUnlimitedToKB((Unlimited)GetPSObjectProperty(mailbox, "RecoverableItemsQuota")); info.RecoverabelItemsWarning = @@ -2497,6 +2516,18 @@ namespace WebsitePanel.Providers.HostedSolution info.EnablePOP = (bool)GetPSObjectProperty(mailbox, "PopEnabled"); info.EnableIMAP = (bool)GetPSObjectProperty(mailbox, "ImapEnabled"); + //Litigation Hold + info.EnableLitigationHold = false; + cmd = new Command("Get-MailboxSearch"); + cmd.Parameters.Add("Identity", accountName); + result = ExecuteShellCommand(runSpace, cmd); + if ((result != null) & (result.Count > 0)) + { + mailbox = result[0]; + info.EnableLitigationHold = (bool)GetPSObjectProperty(mailbox, "InPlaceHoldEnabled"); + } + + //Statistics cmd = new Command("Get-MailboxStatistics"); cmd.Parameters.Add("Identity", accountName); @@ -2558,9 +2589,7 @@ namespace WebsitePanel.Providers.HostedSolution cmd.Parameters.Add("MaxSendSize", ConvertKBToUnlimited(maxSendMessageSizeKB)); cmd.Parameters.Add("MaxReceiveSize", ConvertKBToUnlimited(maxReceiveMessageSizeKB)); - cmd.Parameters.Add("LitigationHoldEnabled", enabledLitigationHold); cmd.Parameters.Add("RecoverableItemsQuota", ConvertKBToUnlimited(recoverabelItemsSpace)); - cmd.Parameters.Add("RetentionUrl", litigationHoldUrl); cmd.Parameters.Add("RetentionComment", litigationHoldMsg); @@ -2568,6 +2597,16 @@ namespace WebsitePanel.Providers.HostedSolution ExecuteShellCommand(runSpace, cmd); + //LitigationHold + cmd = new Command("Get-MailboxSearch"); + cmd.Parameters.Add("Identity", accountName); + Collection result = ExecuteShellCommand(runSpace, cmd); + cmd = new Command((result == null) || (result.Count == 0) ? "New-MailboxSearch" : "Set-MailboxSearch"); + cmd.Parameters.Add((result == null) || (result.Count == 0) ? "Name" : "Identity", accountName); + cmd.Parameters.Add("InPlaceHoldEnabled", enabledLitigationHold); + cmd.Parameters.Add("SourceMailboxes", accountName); + ExecuteShellCommand(runSpace, cmd); + //Client Access cmd = new Command("Set-CASMailbox"); cmd.Parameters.Add("Identity", accountName); @@ -2943,7 +2982,6 @@ namespace WebsitePanel.Providers.HostedSolution string path = AddADPrefix(dn); DirectoryEntry entry = GetADObject(path); info.Enabled = !(bool)entry.InvokeGet("AccountDisabled"); - info.LitigationHoldEnabled = (bool)GetPSObjectProperty(mailbox, "LitigationHoldEnabled"); info.DisplayName = (string)GetPSObjectProperty(mailbox, "DisplayName"); SmtpAddress smtpAddress = (SmtpAddress)GetPSObjectProperty(mailbox, "PrimarySmtpAddress"); @@ -2953,6 +2991,7 @@ namespace WebsitePanel.Providers.HostedSolution info.MaxSize = ConvertUnlimitedToBytes((Unlimited)GetPSObjectProperty(mailbox, "ProhibitSendReceiveQuota")); DateTime? whenCreated = (DateTime?)GetPSObjectProperty(mailbox, "WhenCreated"); info.AccountCreated = ConvertNullableToDateTime(whenCreated); + //Client Access Command cmd = new Command("Get-CASMailbox"); cmd.Parameters.Add("Identity", id); @@ -2965,6 +3004,17 @@ namespace WebsitePanel.Providers.HostedSolution info.POPEnabled = (bool)GetPSObjectProperty(mailbox, "PopEnabled"); info.IMAPEnabled = (bool)GetPSObjectProperty(mailbox, "ImapEnabled"); + //Litigation Hold + info.LitigationHoldEnabled = false; + cmd = new Command("Get-MailboxSearch"); + cmd.Parameters.Add("Identity", id); + result = ExecuteShellCommand(runSpace, cmd); + if ((result != null) & (result.Count > 0)) + { + mailbox = result[0]; + info.LitigationHoldEnabled = (bool)GetPSObjectProperty(mailbox, "InPlaceHoldEnabled"); + } + //Statistics cmd = new Command("Get-MailboxStatistics"); cmd.Parameters.Add("Identity", id); From b00e11a2b9047b668354d7b9201040c1f49fa07e Mon Sep 17 00:00:00 2001 From: robvde Date: Mon, 4 Mar 2013 18:31:13 +0400 Subject: [PATCH 3/3] Revert changes to exchange 2013 provider Fix applied on deadlock for scheduled task Support added to server configuration for powershell remoting --- .../Code/Scheduling/Scheduler.cs | 26 ++++++++++- .../Code/Scheduling/SchedulerJob.cs | 8 +++- .../App_Data/SiteSettings.config | 2 +- .../Exchange_Settings.ascx.resx | 6 +++ .../ProviderControls/Exchange_Settings.ascx | 19 ++++++++ .../Exchange_Settings.ascx.cs | 6 +++ .../Exchange_Settings.ascx.designer.cs | 45 +++++++++++++++++++ 7 files changed, 108 insertions(+), 4 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs index 8da3adaf..5b08d474 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs @@ -33,6 +33,7 @@ using System.Collections; using System.Diagnostics; using System.Collections.Generic; using System.Text; +using System.Data.SqlClient; namespace WebsitePanel.EnterpriseServer { @@ -145,7 +146,22 @@ namespace WebsitePanel.EnterpriseServer schedule.ScheduleInfo.LastRun = DateTime.Now; // update schedule - SchedulerController.UpdateSchedule(schedule.ScheduleInfo); + int MAX_RETRY_COUNT = 10; + int counter = 0; + while (counter < MAX_RETRY_COUNT) + { + try + { + SchedulerController.UpdateSchedule(schedule.ScheduleInfo); + break; + } + catch (SqlException) + { + System.Threading.Thread.Sleep(1000); + } + + counter++; + } // skip execution if the current task is still running scheduledTasks = TaskManager.GetScheduledTasks(); @@ -157,7 +173,13 @@ namespace WebsitePanel.EnterpriseServer } catch (Exception Ex) { - TaskManager.WriteError(string.Format("RunSchedule Error : {0}", Ex.Message)); + try + { + TaskManager.WriteError(string.Format("RunSchedule Error : {0}", Ex.Message)); + } + catch(Exception) + { + } } } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerJob.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerJob.cs index 301fa943..24df4082 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerJob.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerJob.cs @@ -119,7 +119,13 @@ namespace WebsitePanel.EnterpriseServer finally { // complete task - TaskManager.CompleteTask(); + try + { + TaskManager.CompleteTask(); + } + catch (Exception) + { + } } } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/SiteSettings.config b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/SiteSettings.config index 4fc71ff6..7d01aafd 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/SiteSettings.config +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/SiteSettings.config @@ -3,7 +3,7 @@ WebsitePanel - http://localhost:9002 + http://hstprov01.hosting.local:9002 UserCulture UserTheme diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Exchange_Settings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Exchange_Settings.ascx.resx index c2df5d53..8ed90f04 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Exchange_Settings.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/App_LocalResources/Exchange_Settings.ascx.resx @@ -192,4 +192,10 @@ Database Availability Group: + + e.g. http://server.domain.com/PowerShell + + + Powershell URL: + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx index 48636a4d..be0220cb 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx @@ -1,6 +1,25 @@ <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Exchange_Settings.ascx.cs" Inherits="WebsitePanel.Portal.ProviderControls.Exchange2010_Settings" %> + + + + + + + + + + +
+ + +
+ + + +
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx.cs index 944b4d94..51a9393b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx.cs @@ -91,6 +91,8 @@ namespace WebsitePanel.Portal.ProviderControls txtStorageGroup.Text = ""; locMailboxDAG.Visible = false; + + powershellUrl1.Visible = powershellUrl2.Visible = false; break; case EXCHANGE2010SP2_PROVIDER_ID: @@ -101,6 +103,7 @@ namespace WebsitePanel.Portal.ProviderControls txtStorageGroup.Text = ""; locMailboxDatabase.Visible = false; + powershellUrl1.Visible = powershellUrl2.Visible = false; break; case EXCHANGE2013_PROVIDER_ID: @@ -111,6 +114,7 @@ namespace WebsitePanel.Portal.ProviderControls txtStorageGroup.Text = ""; locMailboxDatabase.Visible = false; + powershellUrl1.Visible = powershellUrl2.Visible = true; break; default: @@ -147,6 +151,7 @@ namespace WebsitePanel.Portal.ProviderControls txtActiveSyncServer.Text = settings["ActiveSyncServer"]; txtOABServer.Text = settings["OABServer"]; txtPublicFolderServer.Text = settings["PublicFolderServer"]; + txtPowerShellUrl.Text = settings["PowerShellUrl"]; UpdateHubTransportsGrid(); UpdateClientAccessGrid(); @@ -173,6 +178,7 @@ namespace WebsitePanel.Portal.ProviderControls settings["PublicFolderServer"] = txtPublicFolderServer.Text; settings["StorageGroup"] = txtStorageGroup.Text; + settings["PowerShellUrl"] = txtPowerShellUrl.Text; } public void BindExchangeServices(DropDownList ddl, bool isHubservice) diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx.designer.cs index 771c7fb0..7cf03022 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ProviderControls/Exchange_Settings.ascx.designer.cs @@ -12,6 +12,51 @@ namespace WebsitePanel.Portal.ProviderControls { public partial class Exchange2010_Settings { + /// + /// powershellUrl1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow powershellUrl1; + + /// + /// lblFileServiceInfo control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label lblFileServiceInfo; + + /// + /// powershellUrl2 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlTableRow powershellUrl2; + + /// + /// loclocPowerShellUrl control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize loclocPowerShellUrl; + + /// + /// txtPowerShellUrl control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtPowerShellUrl; + /// /// storageGroup control. ///