Files
Disco/Disco.Services/Interop/IIS/PreserveIisBindingsTask.cs
T

79 lines
2.6 KiB
C#

using Disco.Data.Repository;
using Disco.Services.Tasks;
using Microsoft.Web.Administration;
using Microsoft.Win32;
using Quartz;
using System;
using System.Linq;
using System.Text;
namespace Disco.Services.Interop.DiscoServices
{
public class PreserveIisBindingsTask : ScheduledTask
{
private const string DiscoRegistryKey = @"SOFTWARE\Disco";
public override string TaskName { get { return "Disco ICT - Preserve IIS Bindings"; } }
public override bool SingleInstanceTask { get { return true; } }
public override bool CancelInitiallySupported { get { return false; } }
public override void InitalizeScheduledTask(DiscoDataContext Database)
{
TriggerBuilder triggerBuilder = TriggerBuilder.Create()
.StartAt(DateTimeOffset.Now.AddMinutes(10));
ScheduleTask(triggerBuilder);
}
protected override void ExecuteTask()
{
// retrieve IIS bindings
var bindings = GetWebsiteBindings();
if (bindings == null || !bindings.Any())
{
ScheduledTasksLog.LogScheduledTaskInformation(Status.TaskName, Status.SessionId, "Bindings for IIS Web Site 'Disco' not found");
return;
}
using (var key = Registry.LocalMachine.CreateSubKey(DiscoRegistryKey))
{
key.SetValue("WebsiteBindings", bindings, RegistryValueKind.MultiString);
}
}
private string[] GetWebsiteBindings()
{
using (var manager = new ServerManager())
{
var site = manager.Sites["Disco"];
if (site == null)
return null;
var bindings = site.Bindings;
var sb = new StringBuilder();
var result = new string[bindings.Count];
for (int i = 0; i < bindings.Count; i++)
{
var binding = bindings[i];
sb.Append(binding.BindingInformation);
sb.Append(';');
sb.Append(binding.Protocol);
if (string.Equals(binding.Protocol, "https", StringComparison.OrdinalIgnoreCase))
{
sb.Append(';');
sb.Append(Convert.ToBase64String(binding.CertificateHash));
sb.Append(';');
sb.Append(binding.CertificateStoreName);
}
result[i] = sb.ToString();
sb.Clear();
}
return result;
}
}
}
}