mx ns scheduler task initial commit
This commit is contained in:
parent
ffca6a8535
commit
11ed35f0f9
24 changed files with 4970 additions and 1421 deletions
|
@ -6082,3 +6082,134 @@ set Php4Path='%PROGRAMFILES(x86)%\PHP\ph.exe'
|
|||
where ProviderId in(101, 105)
|
||||
|
||||
GO
|
||||
|
||||
-- Domain lookup tasks
|
||||
|
||||
IF NOT EXISTS (SELECT * FROM [dbo].[ScheduleTasks] WHERE [TaskID] = N'SCHEDULE_TASK_DOMAIN_LOOKUP')
|
||||
BEGIN
|
||||
INSERT [dbo].[ScheduleTasks] ([TaskID], [TaskType], [RoleID]) VALUES (N'SCHEDULE_TASK_DOMAIN_LOOKUP', N'WebsitePanel.EnterpriseServer.DomainLookupViewTask, WebsitePanel.EnterpriseServer.Code', 1)
|
||||
END
|
||||
GO
|
||||
|
||||
IF NOT EXISTS (SELECT * FROM [dbo].[ScheduleTaskViewConfiguration] WHERE [TaskID] = N'SCHEDULE_TASK_DOMAIN_LOOKUP')
|
||||
BEGIN
|
||||
INSERT [dbo].[ScheduleTaskViewConfiguration] ([TaskID], [ConfigurationID], [Environment], [Description]) VALUES (N'SCHEDULE_TASK_DOMAIN_LOOKUP', N'ASP_NET', N'ASP.NET', N'~/DesktopModules/WebsitePanel/ScheduleTaskControls/DomainLookupView.ascx')
|
||||
END
|
||||
GO
|
||||
|
||||
IF NOT EXISTS (SELECT * FROM [dbo].[ScheduleTaskParameters] WHERE [TaskID] = N'SCHEDULE_TASK_DOMAIN_LOOKUP' AND [ParameterID]= N'DNS_SERVERS' )
|
||||
BEGIN
|
||||
INSERT [dbo].[ScheduleTaskParameters] ([TaskID], [ParameterID], [DataTypeID], [DefaultValue], [ParameterOrder]) VALUES (N'SCHEDULE_TASK_DOMAIN_LOOKUP', N'DNS_SERVERS', N'String', NULL, 1)
|
||||
END
|
||||
GO
|
||||
|
||||
IF NOT EXISTS (SELECT * FROM [dbo].[ScheduleTaskParameters] WHERE [TaskID] = N'SCHEDULE_TASK_DOMAIN_LOOKUP' AND [ParameterID]= N'MAIL_TO' )
|
||||
BEGIN
|
||||
INSERT [dbo].[ScheduleTaskParameters] ([TaskID], [ParameterID], [DataTypeID], [DefaultValue], [ParameterOrder]) VALUES (N'SCHEDULE_TASK_DOMAIN_LOOKUP', N'MAIL_TO', N'String', NULL, 2)
|
||||
END
|
||||
GO
|
||||
|
||||
-- Domain lookup tables
|
||||
|
||||
IF EXISTS (SELECT * FROM SYS.TABLES WHERE name = 'DomainDnsRecords')
|
||||
DROP TABLE DomainDnsRecords
|
||||
GO
|
||||
CREATE TABLE DomainDnsRecords
|
||||
(
|
||||
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
|
||||
DomainId INT NOT NULL,
|
||||
RecordType INT NOT NULL,
|
||||
DnsServer NVARCHAR(255),
|
||||
Value NVARCHAR(255),
|
||||
Date DATETIME
|
||||
)
|
||||
GO
|
||||
|
||||
ALTER TABLE [dbo].[DomainDnsRecords] WITH CHECK ADD CONSTRAINT [FK_DomainDnsRecords_DomainId] FOREIGN KEY([DomainId])
|
||||
REFERENCES [dbo].[Domains] ([DomainID])
|
||||
ON DELETE CASCADE
|
||||
GO
|
||||
|
||||
-- Procedures for Domai lookup service
|
||||
|
||||
|
||||
IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetAllPackageIds')
|
||||
DROP PROCEDURE GetAllPackageIds
|
||||
GO
|
||||
CREATE PROCEDURE [dbo].GetAllPackageIds
|
||||
|
||||
AS
|
||||
SELECT
|
||||
[PackageID]
|
||||
FROM [dbo].[Packages]
|
||||
GO
|
||||
|
||||
|
||||
IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetDomainDnsRecords')
|
||||
DROP PROCEDURE GetDomainDnsRecords
|
||||
GO
|
||||
CREATE PROCEDURE [dbo].GetDomainDnsRecords
|
||||
(
|
||||
@DomainId INT,
|
||||
@RecordType INT
|
||||
)
|
||||
AS
|
||||
SELECT
|
||||
ID,
|
||||
DomainId,
|
||||
DnsServer,
|
||||
RecordType,
|
||||
Value,
|
||||
Date
|
||||
FROM [dbo].[DomainDnsRecords]
|
||||
WHERE [DomainId] = @DomainId AND [RecordType] = @RecordType
|
||||
GO
|
||||
|
||||
|
||||
|
||||
IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'AddDomainDnsRecord')
|
||||
DROP PROCEDURE AddDomainDnsRecord
|
||||
GO
|
||||
CREATE PROCEDURE [dbo].[AddDomainDnsRecord]
|
||||
(
|
||||
@DomainId INT,
|
||||
@RecordType INT,
|
||||
@DnsServer NVARCHAR(255),
|
||||
@Value NVARCHAR(255),
|
||||
@Date DATETIME
|
||||
)
|
||||
AS
|
||||
|
||||
INSERT INTO DomainDnsRecords
|
||||
(
|
||||
DomainId,
|
||||
DnsServer,
|
||||
RecordType,
|
||||
Value,
|
||||
Date
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@DomainId,
|
||||
@DnsServer,
|
||||
@RecordType,
|
||||
@Value,
|
||||
@Date
|
||||
)
|
||||
GO
|
||||
|
||||
|
||||
|
||||
IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'DeleteDomainDnsRecord')
|
||||
DROP PROCEDURE DeleteDomainDnsRecord
|
||||
GO
|
||||
CREATE PROCEDURE [dbo].[DeleteDomainDnsRecord]
|
||||
(
|
||||
@Id INT
|
||||
)
|
||||
AS
|
||||
|
||||
|
||||
DELETE FROM DomainDnsRecords
|
||||
WHERE Id = @Id
|
||||
GO
|
||||
|
|
|
@ -36,6 +36,8 @@ using Microsoft.ApplicationBlocks.Data;
|
|||
using System.Collections.Generic;
|
||||
using Microsoft.Win32;
|
||||
using WebsitePanel.Providers.RemoteDesktopServices;
|
||||
using WebsitePanel.Providers.DNS;
|
||||
using WebsitePanel.Providers.DomainLookup;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
|
@ -4718,5 +4720,54 @@ namespace WebsitePanel.EnterpriseServer
|
|||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region MX|NX Services
|
||||
|
||||
public static IDataReader GetAllPackagesIds()
|
||||
{
|
||||
return SqlHelper.ExecuteReader(
|
||||
ConnectionString,
|
||||
CommandType.StoredProcedure,
|
||||
"GetAllPackageIds"
|
||||
);
|
||||
}
|
||||
|
||||
public static IDataReader GetDomainMXRecords(int domainId, DnsRecordType recordType)
|
||||
{
|
||||
return SqlHelper.ExecuteReader(
|
||||
ConnectionString,
|
||||
CommandType.StoredProcedure,
|
||||
"GetDomainDnsRecords",
|
||||
new SqlParameter("@DomainId", domainId),
|
||||
new SqlParameter("@RecordType", recordType)
|
||||
);
|
||||
}
|
||||
|
||||
public static IDataReader AddDomainDnsRecord(DnsRecordInfo domainDnsRecord)
|
||||
{
|
||||
return SqlHelper.ExecuteReader(
|
||||
ConnectionString,
|
||||
CommandType.StoredProcedure,
|
||||
"AddDomainDnsRecord",
|
||||
new SqlParameter("@DomainId", domainDnsRecord.DomainId),
|
||||
new SqlParameter("@RecordType", domainDnsRecord.RecordType),
|
||||
new SqlParameter("@DnsServer", domainDnsRecord.DnsServer),
|
||||
new SqlParameter("@Value", domainDnsRecord.Value),
|
||||
new SqlParameter("@Date", domainDnsRecord.Date)
|
||||
);
|
||||
}
|
||||
|
||||
public static IDataReader DeleteDomainDnsRecord(int id)
|
||||
{
|
||||
return SqlHelper.ExecuteReader(
|
||||
ConnectionString,
|
||||
CommandType.StoredProcedure,
|
||||
"DeleteDomainDnsRecord",
|
||||
new SqlParameter("@Id", id)
|
||||
);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,6 +40,9 @@ using WebsitePanel.Providers;
|
|||
using WebsitePanel.Providers.OS;
|
||||
using OS = WebsitePanel.Providers.OS;
|
||||
using System.Collections;
|
||||
using WebsitePanel.Providers.DomainLookup;
|
||||
using WebsitePanel.Providers.DNS;
|
||||
using System.Linq;
|
||||
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
|
@ -811,5 +814,24 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
|
||||
#endregion
|
||||
|
||||
#region Domain DNS Records lookup
|
||||
|
||||
public static List<DnsRecordInfo> GetDomainRecords(int packageId, string domain, string dnsServer, DnsRecordType recordType)
|
||||
{
|
||||
List<DnsRecordInfo> records = new List<DnsRecordInfo>();
|
||||
|
||||
// load OS service
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.Os);
|
||||
|
||||
var os = GetOS(serviceId);
|
||||
|
||||
records = os.GetDomainDnsRecords(domain, dnsServer, recordType).ToList();
|
||||
|
||||
return records;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,222 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using WebsitePanel.Providers.DNS;
|
||||
using WebsitePanel.Providers.DomainLookup;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class DomainLookupViewTask : SchedulerTask
|
||||
{
|
||||
// Input parameters:
|
||||
private static readonly string DnsServersParameter = "DNS_SERVERS";
|
||||
private static readonly string MailToParameter = "MAIL_TO";
|
||||
|
||||
public override void DoWork()
|
||||
{
|
||||
BackgroundTask topTask = TaskManager.TopTask;
|
||||
|
||||
List<DomainChanges> domainsChanges = new List<DomainChanges>();
|
||||
|
||||
// get input parameters
|
||||
string dnsServersString = (string)topTask.GetParamValue(DnsServersParameter);
|
||||
|
||||
// check input parameters
|
||||
if (String.IsNullOrEmpty(dnsServersString))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'DNS' task parameter.");
|
||||
return;
|
||||
}
|
||||
|
||||
var dnsServers = dnsServersString.Split(';');
|
||||
|
||||
var packages = ObjectUtils.CreateListFromDataReader<PackageInfo>(DataProvider.GetAllPackagesIds());
|
||||
|
||||
foreach (var package in packages)
|
||||
{
|
||||
|
||||
PackageContext cntx = PackageController.GetPackageContext(package.PackageId);
|
||||
|
||||
if (cntx == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
bool dnsEnabled = cntx.GroupsArray.Any(x => x.GroupName == ResourceGroups.Dns);
|
||||
|
||||
if (!dnsEnabled)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var domains = ServerController.GetDomains(package.PackageId);
|
||||
|
||||
domains = domains.Where(x => !x.IsSubDomain && !x.IsDomainPointer).ToList(); //Selecting top-level domains
|
||||
|
||||
foreach (var domain in domains)
|
||||
{
|
||||
DomainChanges domainChanges = new DomainChanges();
|
||||
|
||||
var mxRecords = ObjectUtils.CreateListFromDataReader<DnsRecordInfo>(DataProvider.GetDomainMXRecords(domain.DomainId, DnsRecordType.MX));
|
||||
var nsRecords = ObjectUtils.CreateListFromDataReader<DnsRecordInfo>(DataProvider.GetDomainMXRecords(domain.DomainId, DnsRecordType.NS));
|
||||
|
||||
//execute server
|
||||
foreach (var dnsServer in dnsServers)
|
||||
{
|
||||
var dnsMxRecords = OperatingSystemController.GetDomainRecords(domain.PackageId, domain.DomainName, dnsServer, DnsRecordType.MX);
|
||||
var dnsNsRecords = OperatingSystemController.GetDomainRecords(domain.PackageId, domain.DomainName, dnsServer, DnsRecordType.NS);
|
||||
|
||||
FillRecordData(dnsMxRecords, domain, dnsServer);
|
||||
FillRecordData(dnsNsRecords, domain, dnsServer);
|
||||
|
||||
domainChanges.MxChanges.Add(ApplyDomainRecordsChanges(mxRecords, dnsMxRecords, dnsServer));
|
||||
domainChanges.NsChanges.Add(ApplyDomainRecordsChanges(nsRecords, dnsNsRecords, dnsServer));
|
||||
}
|
||||
|
||||
domainsChanges.Add(domainChanges);
|
||||
}
|
||||
}
|
||||
|
||||
var changedDomains = FindDomainsWithChangedRecords(domainsChanges);
|
||||
|
||||
if (changedDomains.Any())
|
||||
{
|
||||
SendMailMessage(changedDomains);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region Helpers
|
||||
|
||||
private IEnumerable<DomainChanges> FindDomainsWithChangedRecords(IEnumerable<DomainChanges> domainsChanges)
|
||||
{
|
||||
var changedDomains = new List<DomainChanges>();
|
||||
|
||||
foreach (var domainChanges in domainsChanges)
|
||||
{
|
||||
var firstTimeAdditon = domainChanges.MxChanges.All(x => x.DnsRecordsCompare.All(dns => dns.DbRecord == null))
|
||||
&& domainChanges.NsChanges.All(x => x.DnsRecordsCompare.All(dns => dns.DbRecord == null));
|
||||
|
||||
if (firstTimeAdditon)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
bool mxIsChanged = domainChanges.MxChanges.Any(x => x.DnsRecordsCompare.Any(d => d.Status != DomainDnsRecordStatuses.NotChanged));
|
||||
bool nsIsChanged = domainChanges.NsChanges.Any(x => x.DnsRecordsCompare.Any(d => d.Status != DomainDnsRecordStatuses.NotChanged));
|
||||
|
||||
if (mxIsChanged || nsIsChanged)
|
||||
{
|
||||
changedDomains.Add(domainChanges);
|
||||
}
|
||||
}
|
||||
|
||||
return changedDomains;
|
||||
}
|
||||
|
||||
private DomainDnsRecordsChanges ApplyDomainRecordsChanges(List<DnsRecordInfo> dbRecords, List<DnsRecordInfo> dnsRecords, string dnsServer)
|
||||
{
|
||||
var domainRecordChanges = new DomainDnsRecordsChanges();
|
||||
domainRecordChanges.DnsServer = dnsServer;
|
||||
|
||||
var filteredDbRecords = dbRecords.Where(x => x.DnsServer == dnsServer);
|
||||
|
||||
foreach (var record in filteredDbRecords)
|
||||
{
|
||||
var dnsRecord = dnsRecords.FirstOrDefault(x => x.Value == record.Value);
|
||||
|
||||
if (dnsRecord != null)
|
||||
{
|
||||
domainRecordChanges.DnsRecordsCompare.Add(new DomainDnsRecordCompare { DbRecord = record, DnsRecord = dnsRecord, Status = DomainDnsRecordStatuses.NotChanged });
|
||||
|
||||
dnsRecords.Remove(dnsRecord);
|
||||
}
|
||||
else
|
||||
{
|
||||
domainRecordChanges.DnsRecordsCompare.Add(new DomainDnsRecordCompare { DbRecord = record, DnsRecord = null, Status = DomainDnsRecordStatuses.Removed });
|
||||
|
||||
RemoveRecord(record);
|
||||
|
||||
domainRecordChanges.IsChanged = true;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var record in dnsRecords)
|
||||
{
|
||||
domainRecordChanges.DnsRecordsCompare.Add(new DomainDnsRecordCompare { DbRecord = null, DnsRecord = record, Status = DomainDnsRecordStatuses.Added });
|
||||
|
||||
AddRecord(record);
|
||||
|
||||
domainRecordChanges.IsChanged = true;
|
||||
}
|
||||
|
||||
return domainRecordChanges;
|
||||
}
|
||||
|
||||
private void FillRecordData(IEnumerable<DnsRecordInfo> records, DomainInfo domain, string dnsServer)
|
||||
{
|
||||
foreach (var record in records)
|
||||
{
|
||||
FillRecordData(record, domain, dnsServer);
|
||||
}
|
||||
}
|
||||
|
||||
private void FillRecordData(DnsRecordInfo record, DomainInfo domain, string dnsServer)
|
||||
{
|
||||
record.DomainId = domain.DomainId;
|
||||
record.Date = DateTime.Now;
|
||||
record.DnsServer = dnsServer;
|
||||
}
|
||||
|
||||
private void RemoveRecords(IEnumerable<DnsRecordInfo> dnsRecords)
|
||||
{
|
||||
foreach (var record in dnsRecords)
|
||||
{
|
||||
RemoveRecord(record);
|
||||
}
|
||||
}
|
||||
|
||||
private void RemoveRecord(DnsRecordInfo dnsRecord)
|
||||
{
|
||||
DataProvider.DeleteDomainDnsRecord(dnsRecord.Id);
|
||||
}
|
||||
|
||||
private void AddRecords(IEnumerable<DnsRecordInfo> dnsRecords)
|
||||
{
|
||||
foreach (var record in dnsRecords)
|
||||
{
|
||||
AddRecord(record);
|
||||
}
|
||||
}
|
||||
|
||||
private void AddRecord(DnsRecordInfo dnsRecord)
|
||||
{
|
||||
DataProvider.AddDomainDnsRecord(dnsRecord);
|
||||
}
|
||||
|
||||
private void SendMailMessage(IEnumerable<DomainChanges> domainsChanges)
|
||||
{
|
||||
BackgroundTask topTask = TaskManager.TopTask;
|
||||
|
||||
// input parameters
|
||||
string mailFrom = "wsp@scheduler.noreply";
|
||||
string mailTo = (string)topTask.GetParamValue("MAIL_TO");
|
||||
string mailSubject = "WSP MX and NS notification";
|
||||
string mailBody = "Hello!<br><br>";
|
||||
|
||||
if (String.IsNullOrEmpty(mailTo))
|
||||
{
|
||||
TaskManager.WriteWarning("The e-mail message has not been sent because 'Mail To' is empty.");
|
||||
}
|
||||
else
|
||||
{
|
||||
// send mail message
|
||||
// MailHelper.SendMessage(mailFrom, mailTo, mailSubject, mailBody, false);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -143,6 +143,7 @@
|
|||
<Compile Include="SchedulerTasks\FTPFilesTask.cs" />
|
||||
<Compile Include="SchedulerTasks\GenerateInvoicesTask.cs" />
|
||||
<Compile Include="SchedulerTasks\HostedSolutionReport.cs" />
|
||||
<Compile Include="SchedulerTasks\DomainLookupViewTask.cs" />
|
||||
<Compile Include="SchedulerTasks\NotifyOverusedDatabasesTask.cs" />
|
||||
<Compile Include="SchedulerTasks\RunPaymentQueueTask.cs" />
|
||||
<Compile Include="SchedulerTasks\RunSystemCommandTask.cs" />
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using WebsitePanel.Providers.DNS;
|
||||
|
||||
namespace WebsitePanel.Providers.DomainLookup
|
||||
{
|
||||
public class DnsRecordInfo
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public int DomainId { get; set; }
|
||||
public string DnsServer { get; set; }
|
||||
public DnsRecordType RecordType { get; set; }
|
||||
public string Value { get; set; }
|
||||
public DateTime Date { get; set; }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace WebsitePanel.Providers.DomainLookup
|
||||
{
|
||||
public class DomainChanges
|
||||
{
|
||||
public string Domain { get; set; }
|
||||
|
||||
public List<DomainDnsRecordsChanges> MxChanges { get; set; }
|
||||
public List<DomainDnsRecordsChanges> NsChanges { get; set; }
|
||||
|
||||
public DomainChanges()
|
||||
{
|
||||
MxChanges = new List<DomainDnsRecordsChanges>();
|
||||
NsChanges = new List<DomainDnsRecordsChanges>();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace WebsitePanel.Providers.DomainLookup
|
||||
{
|
||||
public class DomainDnsRecordCompare
|
||||
{
|
||||
public DnsRecordInfo DbRecord { get; set; }
|
||||
public DnsRecordInfo DnsRecord { get; set; }
|
||||
public DomainDnsRecordStatuses Status { get; set; }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace WebsitePanel.Providers.DomainLookup
|
||||
{
|
||||
public enum DomainDnsRecordStatuses
|
||||
{
|
||||
NotChanged,
|
||||
Removed,
|
||||
Added
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace WebsitePanel.Providers.DomainLookup
|
||||
{
|
||||
public class DomainDnsRecordsChanges
|
||||
{
|
||||
public string DnsServer { get; set; }
|
||||
|
||||
public bool IsChanged { get; set; }
|
||||
|
||||
public List<DomainDnsRecordCompare> DnsRecordsCompare { get; set; }
|
||||
|
||||
public DomainDnsRecordsChanges()
|
||||
{
|
||||
DnsRecordsCompare = new List<DomainDnsRecordCompare>();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -28,6 +28,9 @@
|
|||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using WebsitePanel.Providers.DNS;
|
||||
using WebsitePanel.Providers.DomainLookup;
|
||||
|
||||
namespace WebsitePanel.Providers.OS
|
||||
{
|
||||
|
@ -88,5 +91,8 @@ namespace WebsitePanel.Providers.OS
|
|||
|
||||
// File Services
|
||||
bool CheckFileServicesInstallation();
|
||||
|
||||
//DNS
|
||||
DnsRecordInfo[] GetDomainDnsRecords(string domain, string dnsServer, DnsRecordType recordType);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -85,6 +85,11 @@
|
|||
<Compile Include="Common\ErrorCodes.cs" />
|
||||
<Compile Include="Common\PasswdHelper.cs" />
|
||||
<Compile Include="Common\WPIEntries.cs" />
|
||||
<Compile Include="DomainLookup\DnsRecordInfo.cs" />
|
||||
<Compile Include="DomainLookup\DomainChanges.cs" />
|
||||
<Compile Include="DomainLookup\DomainDnsRecordCompare.cs" />
|
||||
<Compile Include="DomainLookup\DomainDnsRecordsChanges.cs" />
|
||||
<Compile Include="DomainLookup\DomainDnsRecordStatuses.cs" />
|
||||
<Compile Include="EnterpriseStorage\IEnterpriseStorage.cs" />
|
||||
<Compile Include="HeliconZoo\IHeliconZooServer.cs" />
|
||||
<Compile Include="HostedSolution\BaseReport.cs" />
|
||||
|
|
|
@ -34,6 +34,8 @@ using Microsoft.Win32;
|
|||
|
||||
using WebsitePanel.Server.Utils;
|
||||
using WebsitePanel.Providers.Utils;
|
||||
using WebsitePanel.Providers.DomainLookup;
|
||||
using WebsitePanel.Providers.DNS;
|
||||
|
||||
namespace WebsitePanel.Providers.OS
|
||||
{
|
||||
|
@ -744,6 +746,10 @@ namespace WebsitePanel.Providers.OS
|
|||
}
|
||||
#endregion
|
||||
|
||||
public virtual DnsRecordInfo[] GetDomainDnsRecords(string domain, string dnsServer, DnsRecordType recordType)
|
||||
{
|
||||
return new DnsRecordInfo[0];
|
||||
}
|
||||
|
||||
public override bool IsInstalled()
|
||||
{
|
||||
|
|
|
@ -49,6 +49,9 @@ using System.Management.Automation.Runspaces;
|
|||
using WebsitePanel.Providers.Common;
|
||||
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Linq;
|
||||
using WebsitePanel.Providers.DomainLookup;
|
||||
using WebsitePanel.Providers.DNS;
|
||||
|
||||
|
||||
namespace WebsitePanel.Providers.OS
|
||||
|
@ -295,6 +298,76 @@ namespace WebsitePanel.Providers.OS
|
|||
|
||||
ExecuteShellCommand(runSpace, cmd, false);
|
||||
}
|
||||
|
||||
#region Domain LookUp
|
||||
|
||||
public override DnsRecordInfo[] GetDomainDnsRecords(string domain, string dnsServer, DnsRecordType recordType)
|
||||
{
|
||||
List<DnsRecordInfo> records = new List<DnsRecordInfo>();
|
||||
|
||||
Runspace runSpace = null;
|
||||
|
||||
try
|
||||
{
|
||||
runSpace = OpenRunspace();
|
||||
|
||||
Command cmd = new Command("Resolve-DnsName");
|
||||
cmd.Parameters.Add("Name", domain);
|
||||
cmd.Parameters.Add("Server", dnsServer);
|
||||
cmd.Parameters.Add("Type", recordType.ToString());
|
||||
|
||||
var dnsRecordsPs = ExecuteShellCommand(runSpace, cmd, false);
|
||||
|
||||
if (dnsRecordsPs != null)
|
||||
{
|
||||
foreach (var dnsRecordPs in dnsRecordsPs)
|
||||
{
|
||||
DnsRecordInfo newRecord;
|
||||
|
||||
switch (recordType)
|
||||
{
|
||||
case DnsRecordType.MX: { newRecord = CreateMxDnsRecordFromPsObject(dnsRecordPs); break; }
|
||||
case DnsRecordType.NS: { newRecord = CreateNsDnsRecordFromPsObject(dnsRecordPs); break; }
|
||||
default: continue;
|
||||
}
|
||||
|
||||
newRecord.DnsServer = dnsServer;
|
||||
newRecord.RecordType = recordType;
|
||||
|
||||
records.Add(newRecord);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
CloseRunspace(runSpace);
|
||||
}
|
||||
|
||||
return records.ToArray();
|
||||
}
|
||||
|
||||
private DnsRecordInfo CreateMxDnsRecordFromPsObject(PSObject psObject)
|
||||
{
|
||||
var dnsRecord = new DnsRecordInfo
|
||||
{
|
||||
Value = Convert.ToString(GetPSObjectProperty(psObject, "NameExchange")),
|
||||
};
|
||||
|
||||
return dnsRecord;
|
||||
}
|
||||
|
||||
private DnsRecordInfo CreateNsDnsRecordFromPsObject(PSObject psObject)
|
||||
{
|
||||
var dnsRecord = new DnsRecordInfo
|
||||
{
|
||||
Value = Convert.ToString(GetPSObjectProperty(psObject, "NameHost")),
|
||||
};
|
||||
|
||||
return dnsRecord;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region PowerShell integration
|
||||
private static InitialSessionState session = null;
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -38,6 +38,9 @@ using Microsoft.Web.Services3;
|
|||
using WebsitePanel.Providers;
|
||||
using WebsitePanel.Providers.OS;
|
||||
using WebsitePanel.Server.Utils;
|
||||
using WebsitePanel.Providers.DNS;
|
||||
using WebsitePanel.Providers.DomainLookup;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace WebsitePanel.Server
|
||||
{
|
||||
|
@ -737,5 +740,26 @@ namespace WebsitePanel.Server
|
|||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Dns
|
||||
|
||||
[WebMethod, SoapHeader("settings")]
|
||||
public DnsRecordInfo[] GetDomainDnsRecords(string domain, string dnsServer, DnsRecordType recordType)
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.WriteStart("'{0}' GetDomainDnsRecords", ProviderSettings.ProviderName);
|
||||
var result = OsProvider.GetDomainDnsRecords(domain, dnsServer, recordType);
|
||||
Log.WriteEnd("'{0}' GetDomainDnsRecords", ProviderSettings.ProviderName);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.WriteError(String.Format("'{0}' GetDomainDnsRecords", ProviderSettings.ProviderName), ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5593,4 +5593,7 @@
|
|||
<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>
|
||||
</data>
|
||||
<data name="SchedulerTask.SCHEDULE_TASK_DOMAIN_LOOKUP" xml:space="preserve">
|
||||
<value>Check MX and NS on DNS servers</value>
|
||||
</data>
|
||||
</root>
|
|
@ -0,0 +1,82 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.33440
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace WebsitePanel.Portal.ScheduleTaskControls.App_LocalResources {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class DomainLookupView_ascx {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal DomainLookupView_ascx() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WebsitePanel.Portal.ScheduleTaskControls.App_LocalResources.DomainLookupView.ascx" +
|
||||
"", typeof(DomainLookupView_ascx).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to DNS Servers.
|
||||
/// </summary>
|
||||
internal static string lblDnsServers {
|
||||
get {
|
||||
return ResourceManager.GetString("lblDnsServers", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Please enter dns servers to check..
|
||||
/// </summary>
|
||||
internal static string lblDnsServersHint {
|
||||
get {
|
||||
return ResourceManager.GetString("lblDnsServersHint", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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="lblDnsServers" xml:space="preserve">
|
||||
<value>DNS Servers</value>
|
||||
</data>
|
||||
<data name="lblDnsServersHint" xml:space="preserve">
|
||||
<value>Please enter dns servers to check.</value>
|
||||
</data>
|
||||
</root>
|
|
@ -0,0 +1,19 @@
|
|||
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DomainLookupView.ascx.cs" Inherits="WebsitePanel.Portal.ScheduleTaskControls.DomainLookupView" %>
|
||||
|
||||
<table cellspacing="0" cellpadding="4" width="100%">
|
||||
<tr>
|
||||
<td class="SubHead" nowrap>
|
||||
<asp:Label ID="lblDnsServers" runat="server" meta:resourcekey="lblDnsServers" Text="DNS Servers:"></asp:Label>
|
||||
</td>
|
||||
<td class="Normal" width="100%">
|
||||
<asp:TextBox ID="txtDnsServers" runat="server" Width="95%" CssClass="NormalTextBox" MaxLength="1000"></asp:TextBox>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="SubHead" nowrap>
|
||||
<asp:Label ID="lblMailTo" runat="server" meta:resourcekey="lblMailTo" Text="Mail To:"></asp:Label>
|
||||
</td>
|
||||
<td class="Normal" width="100%">
|
||||
<asp:TextBox ID="txtMailTo" runat="server" Width="95%" CssClass="NormalTextBox" MaxLength="1000"></asp:TextBox>
|
||||
</tr>
|
||||
</table>
|
|
@ -0,0 +1,46 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
using WebsitePanel.Portal.UserControls.ScheduleTaskView;
|
||||
|
||||
namespace WebsitePanel.Portal.ScheduleTaskControls
|
||||
{
|
||||
public partial class DomainLookupView : EmptyView
|
||||
{
|
||||
private static readonly string DnsServersParameter = "DNS_SERVERS";
|
||||
private static readonly string MailToParameter = "MAIL_TO";
|
||||
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets scheduler task parameters on view.
|
||||
/// </summary>
|
||||
/// <param name="parameters">Parameters list to be set on view.</param>
|
||||
public override void SetParameters(ScheduleTaskParameterInfo[] parameters)
|
||||
{
|
||||
base.SetParameters(parameters);
|
||||
|
||||
this.SetParameter(this.txtDnsServers, DnsServersParameter);
|
||||
this.SetParameter(this.txtMailTo, MailToParameter);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets scheduler task parameters from view.
|
||||
/// </summary>
|
||||
/// <returns>Parameters list filled from view.</returns>
|
||||
public override ScheduleTaskParameterInfo[] GetParameters()
|
||||
{
|
||||
ScheduleTaskParameterInfo dnsServers = this.GetParameter(this.txtDnsServers, DnsServersParameter);
|
||||
ScheduleTaskParameterInfo mailTo = this.GetParameter(this.txtMailTo, MailToParameter);
|
||||
|
||||
return new ScheduleTaskParameterInfo[2] { dnsServers, mailTo };
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <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.ScheduleTaskControls {
|
||||
|
||||
|
||||
public partial class DomainLookupView {
|
||||
|
||||
/// <summary>
|
||||
/// lblDnsServers 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.Label lblDnsServers;
|
||||
|
||||
/// <summary>
|
||||
/// txtDnsServers 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 txtDnsServers;
|
||||
|
||||
/// <summary>
|
||||
/// lblMailTo 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.Label lblMailTo;
|
||||
|
||||
/// <summary>
|
||||
/// txtMailTo 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 txtMailTo;
|
||||
}
|
||||
}
|
|
@ -288,6 +288,18 @@
|
|||
<Compile Include="RDS\UserControls\RDSCollectionUsers.ascx.designer.cs">
|
||||
<DependentUpon>RDSCollectionUsers.ascx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="ScheduleTaskControls\App_LocalResources\DomainLookupView.ascx.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>DomainLookupView.ascx.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="ScheduleTaskControls\DomainLookupView.ascx.cs">
|
||||
<DependentUpon>DomainLookupView.ascx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ScheduleTaskControls\DomainLookupView.ascx.designer.cs">
|
||||
<DependentUpon>DomainLookupView.ascx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="SettingsServiceLevels.ascx.cs">
|
||||
<DependentUpon>SettingsServiceLevels.ascx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
|
@ -4234,6 +4246,11 @@
|
|||
<Content Include="RDS\UserControls\RDSCollectionApps.ascx" />
|
||||
<Content Include="RDS\UserControls\RDSCollectionServers.ascx" />
|
||||
<Content Include="RDS\UserControls\RDSCollectionUsers.ascx" />
|
||||
<EmbeddedResource Include="ScheduleTaskControls\App_LocalResources\DomainLookupView.ascx.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>DomainLookupView.ascx.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
<Content Include="ScheduleTaskControls\DomainLookupView.ascx" />
|
||||
<Content Include="SettingsServiceLevels.ascx" />
|
||||
<Content Include="CRM\CRMStorageSettings.ascx" />
|
||||
<Content Include="ExchangeServer\EnterpriseStorageCreateDriveMap.ascx" />
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue