Slexy.org is shutting down and stopped accepting new Pastes on May 4th, 2021.
Existing Pastes will stop being available on or after May 10th, 2021.
Author: Nate Language: csharp
Description: mwd-imagesetup Timestamp: 2017-06-28 17:45:14 +0000
View raw paste Reply
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Management.Automation;
  11. using System.Management.Automation.Runspaces;
  12. using System.Text.RegularExpressions;
  13. using System.Diagnostics;
  14. using System.IO;
  15. using System.Security;
  16. using Microsoft.Azure.Management.Dns;
  17. using Microsoft.Azure.Management.Dns.Models;
  18. using Microsoft.Rest.Azure.Authentication;
  19. using Microsoft.IdentityModel.Clients.ActiveDirectory;
  20. using System.Net.Http;
  21. using Microsoft.Web.Administration;
  22. using System.Threading;
  23.  
  24.  
  25. namespace convert
  26. {
  27.     public partial class Form1 : Form
  28.     {
  29.         /// Initializes global variables that are used in DCPROMO process
  30.         string current = "site";
  31.         string domain = null;
  32.         string pwd = null;
  33.         string bios = null;
  34.         string currentZone = null;
  35.         string fqdnFinal = null;
  36.         List<string> recordList = new List<string>();
  37.         /// End initialization of global variables to be used in DCPROMO process
  38.        
  39.         /// Available zones in Azure in which records can be made
  40.         string[] zones = new string[] {"cloudshareconnect.com", "fileshareaccess.com", "filewebaccess.net", "myworkfolders.com", "myworkfolders.net"};
  41.  
  42.         public Form1()
  43.         {
  44.             InitializeComponent();
  45.  
  46.             /// Want to populate the list of records in the chosen record set
  47.             /// because it happens asynchronously - and make sure it finishes
  48.             populateRecordList();
  49.            
  50.            
  51.  
  52.  
  53.            
  54.         }
  55.  
  56.  
  57.         /// populateRecordList() populates the variable recordList with already-used records
  58.         /// for the given zone, which is picked at random
  59.         private async void populateRecordList()
  60.         {
  61.             label3.Visible = false;
  62.             label3.Refresh();
  63.             var tenantId = "ad88c0ea-749c-4648-bf2e-31728ef234aa";
  64.             var clientId = "ed3bde71-3d80-4789-9a68-65a1404749df";
  65.             var secret = "Co0UsX8twJeukk0stvzGGEkfKeWuE0w5GzOBJUmjPhs=";
  66.             var subscriptionId = "4f27b492-f4de-4104-ba1e-d82c3fc55b26";
  67.             // Build the service credentials and DNS management client
  68.             var serviceCreds = await ApplicationTokenProvider.LoginSilentAsync(tenantId, clientId, secret);
  69.             var dnsClient = new DnsManagementClient(serviceCreds);
  70.             dnsClient.SubscriptionId = subscriptionId;
  71.             int recordSets = 0;
  72.             int countt = zones.Length;
  73.             Random random = new Random();
  74.             int randomNumber = random.Next(0, countt);
  75.             string zone = zones[randomNumber];
  76.             currentZone = zone;
  77.             Debug.WriteLine(zone);
  78.             var page = dnsClient.RecordSets.ListByType(zone, zone, RecordType.CNAME);
  79.             recordSets += page.Count();
  80.             var pageList = page.ToList();
  81.             var count = 0;
  82.             while (count < recordSets)
  83.             {
  84.                 var newPage = pageList[count];
  85.                 count += 1;
  86.                 recordList.Add(newPage.Name);
  87.             }
  88.             label4.Text = currentZone;
  89.  
  90.         }
  91.  
  92.         /// validate validates the input for domain, password, and site
  93.         /// in the form. When the password is confirmed, it also begins
  94.         /// the DC promotion process and puts the letsencrypt process
  95.         /// in the runonce key to run upon reboot
  96.         private void validate(string input)
  97.         {
  98.             if (current == "domain")
  99.             {
  100.                 if (validateDomain(textBox1.Text))
  101.                 {
  102.                     current = "pwd";
  103.                     label2.Text = "Please input your Active Directory recovery password";
  104.                     textBox1.PasswordChar = '*';
  105.                     textBox1.Clear();
  106.                 } else
  107.                 {
  108.                     textBox1.Clear();
  109.                 }
  110.             } else if (current == "pwd")
  111.             {
  112.                 if (validatePwd(textBox1.Text))
  113.                 {
  114.                     current = "confirmPwd";
  115.                     label2.Text = "Please confirm your password";
  116.                     textBox1.PasswordChar = '*';
  117.                     textBox1.Clear();
  118.                 } else
  119.                 {
  120.                     textBox1.Clear();
  121.                 }
  122.             } else if (current == "confirmPwd")
  123.             {
  124.                 if (confirmPwd(textBox1.Text))
  125.                 {
  126.  
  127.                     label2.Text = "Your domain is: " + domain;
  128.                     label3.Text = "Your site is: " + fqdnFinal;
  129.                     label3.Visible = true;
  130.                    
  131.                    
  132.                     textBox1.Clear();
  133.                     var powershell = PowerShell.Create();
  134.                     var command = "set-itemproperty";
  135.                     powershell.AddCommand(command).AddArgument("HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce").
  136.                         AddParameter("name", "setupsite").
  137.                         AddParameter("value", "C:\\Wanpath\\Release\\letsencrypt.exe").Invoke();
  138.  
  139.                     var powershell2 = PowerShell.Create();
  140.                    
  141.                     foreach (PSObject result in PowerShell.Create().AddCommand("get-netconnectionprofile").Invoke())
  142.                     {
  143.                       var dns = result.Members["interfaceindex"].Value;
  144.                       PowerShell.Create().AddCommand("set-dnsclientserveraddress").AddParameter("interfaceindex", dns).
  145.                             AddParameter("serveraddresses", "127.0.0.1").Invoke();
  146.  
  147.                     }
  148.                    
  149.  
  150.                     promote();
  151.                     textBox1.PasswordChar = '\0' ;
  152.                     System.Windows.Forms.Application.Exit();
  153.                    
  154.                 } else
  155.                 {
  156.                     textBox1.Clear();
  157.                 }
  158.             } else
  159.             {
  160.                 if (validateSite(textBox1.Text))
  161.                 {
  162.                    
  163.                     textBox1.Clear();
  164.  
  165.                 } else
  166.                 {
  167.                     Cursor.Current = Cursors.WaitCursor;
  168.                     string prefix = textBox1.Text;
  169.                     string fqdn = prefix + "." + currentZone;
  170.                     fqdnFinal = fqdn;
  171.                     var powershell = PowerShell.Create();
  172.                     addSiteBinding(fqdn);
  173.                     Task t= createNewSite(textBox1.Text);
  174.                     Cursor.Current = Cursors.Default;
  175.                     current = "domain";
  176.                     textBox1.Clear();
  177.                     label2.Text = "Please enter a domain name";
  178.                     label4.Visible = false;
  179.                 }
  180.             }
  181.         }
  182.  
  183.         /// addSiteBinding binds the chosen site name to port 80
  184.         /// on the Wanpath.WebClient web site
  185.         private void addSiteBinding(string fqdn)
  186.         {
  187.             var powershell = PowerShell.Create();
  188.             var command = "new-webbinding";
  189.             powershell.AddCommand(command).AddArgument("Wanpath.WebClient").
  190.                         AddParameter("hostheader", fqdn).
  191.                         AddParameter("port", 80).
  192.                         AddParameter("protocol", "http").
  193.                         Invoke();
  194.  
  195.         }
  196.  
  197.         /// createNewSite creates a new site with the input prefix in Azure
  198.         private async Task createNewSite(string prefix)
  199.         {
  200.  
  201.             var tenantId = "ad88c0ea-749c-4648-bf2e-31728ef234aa";
  202.             var clientId = "ed3bde71-3d80-4789-9a68-65a1404749df";
  203.             var secret = "Co0UsX8twJeukk0stvzGGEkfKeWuE0w5GzOBJUmjPhs=";
  204.             var subscriptionId = "4f27b492-f4de-4104-ba1e-d82c3fc55b26";
  205.             // Build the service credentials and DNS management client
  206.             var serviceCreds = await ApplicationTokenProvider.LoginSilentAsync(tenantId, clientId, secret);
  207.             var dnsClient = new DnsManagementClient(serviceCreds);
  208.             dnsClient.SubscriptionId = subscriptionId;
  209.  
  210.             var recordSetParams = new RecordSet();
  211.             recordSetParams.TTL = 1;
  212.  
  213.             recordSetParams.CnameRecord = new CnameRecord();
  214.             string computerName = Environment.MachineName;
  215.             string cname = computerName + ".cloudapp.net";
  216.             recordSetParams.CnameRecord.Cname = cname;
  217.             recordSetParams.Name = prefix;
  218.             var recordSet = dnsClient.RecordSets.CreateOrUpdate(currentZone, currentZone, prefix, RecordType.CNAME, recordSetParams);
  219.             return;
  220.         }
  221.  
  222.         private bool validateDomain(string tempDomain)
  223.         {
  224.             string[] split = tempDomain.Split('.');
  225.             if ((split.Length == 2))
  226.             {
  227.                 domain = tempDomain;
  228.                 bios = split[0];
  229.                 return true;
  230.             }
  231.             else
  232.             {
  233.                 textBox1.Text = "";
  234.                 return false;
  235.             }
  236.         }
  237.  
  238.         private bool validateSite(string prefix)
  239.         {
  240.  
  241.             return (recordList.Contains(prefix));
  242.         }
  243.  
  244.         private bool validatePwd(string tempPwd)
  245.         {
  246.             Regex first = new Regex("[A-Z]");
  247.             Regex second = new Regex("[a-z]");
  248.             Regex third = new Regex("[0-9]");
  249.             Regex fourth = new Regex("[.?!]");
  250.             if (first.IsMatch(tempPwd) && second.IsMatch(tempPwd)
  251.                    && third.IsMatch(tempPwd) && fourth.IsMatch(tempPwd))
  252.             {
  253.                 pwd = tempPwd;
  254.                 return true;
  255.             } else
  256.             {
  257.                 return false;
  258.             }
  259.         }
  260.  
  261.         private bool confirmPwd(string tempPwd)
  262.         {
  263.             return (tempPwd == pwd);
  264.         }
  265.  
  266.         private void button1_Click(object sender, EventArgs e)
  267.         {
  268.  
  269.             validate(current);
  270.         }
  271.  
  272.         private void label2_Click(object sender, EventArgs e)
  273.         {
  274.             populateRecordList();
  275.         }
  276.  
  277.         private void textBox1_KeyDown(object sender, KeyEventArgs e)
  278.         {
  279.             if (e.KeyCode == Keys.Enter)
  280.             {
  281.                 button1_Click(this, new EventArgs());
  282.             }
  283.         }
  284.  
  285.         private void promote()
  286.         {
  287.             var powershell = PowerShell.Create();
  288.             var command = "Install-ADDSForest";
  289.             SecureString securePwd = new SecureString();
  290.  
  291.             foreach (char c in pwd)
  292.             {
  293.                 securePwd.AppendChar(c);
  294.             }
  295.             securePwd.MakeReadOnly();
  296.  
  297.             powershell.AddCommand("import-module").AddArgument("addsdeployment").AddCommand(command).
  298.                         AddParameter("CreateDNSDelegation", false).
  299.                         AddParameter("DataBasePath", "C:\\Windows\\NTDS").
  300.                         AddParameter("DomainMode", "Win2012R2").
  301.                         AddParameter("DomainName", domain).
  302.                         AddParameter("DomainNetbiosName", bios).
  303.                         AddParameter("ForestMode", "Win2012R2").
  304.                         AddParameter("SafeModeAdministratorPassword", securePwd).
  305.                         AddParameter("InstallDNS", true).
  306.                         AddParameter("LogPath", "C:\\Windows\\NTDS").
  307.                         AddParameter("NoRebootOnCompletion", false).
  308.                         AddParameter("Sysvolpath", "C:\\Windows\\SYSVOL").
  309.                         AddParameter("Force", true).
  310.                         AddParameter("warningaction", "SilentlyContinue").
  311.                         Invoke();
  312.         }
  313.  
  314.        
  315.  
  316.         private void label1_Click(object sender, EventArgs e)
  317.         {
  318.  
  319.         }
  320.  
  321.         private void Form1_Load(object sender, EventArgs e)
  322.         {
  323.  
  324.         }
  325.     }
  326. }
View raw paste Reply