Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add a IIS host header to website programmatically

I would like to setup a admin page (ASP.NET/C#) that can add IIS host headers to the website that the admin page is hosted on. Is this possible?

I dont want to add a http header - I want to mimick the action of going into IIS manually, bringing up the properties of the website, clicking advanced on the website tab, and in the advanced website identification screen and a new "identity" with host header value, ip address and tcp port.

like image 580
billfredtom Avatar asked Nov 05 '22 23:11

billfredtom


1 Answers

Here's a forum on Adding Another Identity To A Site Programmatically RSS

Also, here's an article on how to Append a host header by code in IIS:

The following example adds a host header to a website in IIS. This involves changing the ServerBindings property. There is no Append method that can be used to append a new serverbinding to this property, so what needs to be done is read the entire property and then add it back again, together with the new data. This is what is done in the code below. The ServerBindings property's data type is MULTISZ, and the string format is IP:Port:Hostname.

Note that this example code does not do any error checking. It is important that every ServerBindings entry is unique, and you - the programmer - is responsible for checking this (which means that you need to loop thru all entries and check if what is about to be added is unique).

using System.DirectoryServices;
using System;
 
public class IISAdmin
{
    /// <summary>
    /// Adds a host header value to a specified website. WARNING: NO ERROR CHECKING IS PERFORMED IN THIS EXAMPLE. 
    /// YOU ARE RESPONSIBLE FOR THAT EVERY ENTRY IS UNIQUE
    /// </summary>
    /// <param name="hostHeader">The host header. Must be in the form IP:Port:Hostname </param>
    /// <param name="websiteID">The ID of the website the host header should be added to </param>
    public static void AddHostHeader(string hostHeader, string websiteID)
    {
        
        DirectoryEntry site = new DirectoryEntry("IIS://localhost/w3svc/" + websiteID );
        try
        {                        
            //Get everything currently in the serverbindings propery. 
            PropertyValueCollection serverBindings = site.Properties["ServerBindings"];
            
            //Add the new binding
            serverBindings.Add(hostHeader);
            
            //Create an object array and copy the content to this array
            Object [] newList = new Object[serverBindings.Count];
            serverBindings.CopyTo(newList, 0);
            
            //Write to metabase
            site.Properties["ServerBindings"].Value = newList;            
                        
            //Commit the changes
            site.CommitChanges();
                        
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
        
    }
}
 
public class TestApp
{
    public static void Main(string[] args)
    {
        IISAdmin.AddHostHeader(":80:test.com", "1");
    }
}

But I'm not sure how to loop through the header values to do the error checking mentioned.

like image 102
billfredtom Avatar answered Nov 11 '22 09:11

billfredtom