2

We referred stackOverflow and a few other sites to create a website on IIS using console application. It worked after we run the console with administration permission. Code does create an Application pool and host site on a given port. Same code when we tried on asp.net web application it completed its execution but we did not found metadata on IIS.

Here is a code that works on console..

 try
 {
     ServerManager server = new ServerManager();

     ApplicationPool myApplicationPool = null;

     
     //we will first check to make sure that this pool does not already exist
     //since the ApplicationPools property is a collection, we can use the Linq FirstOrDefault method
     //to check for its existence by name
     if (server.ApplicationPools != null && server.ApplicationPools.Count > 0)
     {
         if (server.ApplicationPools.FirstOrDefault(p => p.Name == "TestPool") == null)
         {
             //if the pool is not already there we will create it
             myApplicationPool = server.ApplicationPools.Add("TestPool");

         }
         else
         {
             //if we find the pool already there, we will get a referecne to it for update
             myApplicationPool = server.ApplicationPools.FirstOrDefault(p => p.Name == "TestPool");
         }
     }
     else
     {
         //if the pool is not already there we will create it
         myApplicationPool = server.ApplicationPools.Add("TestPool");
     }

     if (myApplicationPool != null)
     {
         //for this sample, we will set the pool to run under the NetworkService identity
         myApplicationPool.ProcessModel.IdentityType = 
         ProcessModelIdentityType.NetworkService;

         //for this sample, we will set the pool to run under the identity of a specific user
         //myApplicationPool.ProcessModel.IdentityType = 
         ProcessModelIdentityType.SpecificUser;
         //myApplicationPool.ProcessModel.UserName = UserName;
         //myApplicationPool.ProcessModel.Password = Password;


         //we set the runtime version
         myApplicationPool.ManagedRuntimeVersion = "v4.0";

         //we save our new ApplicationPool!
         server.CommitChanges();
     }

     //Create website
     if (server.Sites != null && server.Sites.Count > 0)
     {
         //we will first check to make sure that the site isn't already there
         if (server.Sites.FirstOrDefault(s => s.Name == "MySite") == null)
         {
             //we will just pick an arbitrary location for the site
             string path = @"C:\inetpub\Custom";

             //we must specify the Binding information
             string ip = "*";
             string port = "98";
             string hostName = "*";

             string bindingInfo = string.Format(@"{0}:{1}:{2}", ip, port, hostName);

             //add the new Site to the Sites collection
             Site site = server.Sites.Add("MySite", "http", bindingInfo, path);

            //set the ApplicationPool for the new Site
            site.ApplicationDefaults.ApplicationPoolName = myApplicationPool.Name;

            //save the new Site!
            server.CommitChanges();
            Console.WriteLine("Web site created successfully...");
            Console.ReadLine();
        }
    }
}
catch (Exception ex)
{

   Console.WriteLine(ex.Message);
   Console.ReadLine()
}

Here site gets listed in IIS as well. enter image description here

Now when tried the same code on the web application, it does not create anything on IIS. when we inspect the server manager object we found that the Application pool list was coming from the project's

applicationhost.config

file which is located on .vs hidden folder.

We installed the latest IIS on the local machine for a test, is there any changes needed to get it to work on the web as well. (: we are new to IIS stuff)

Dark S
  • 308
  • 2
  • 15
  • Most likely, your ASP.NET web application ApplicationPool user doesn't have sufficient privileges to perform the necessary actions. Check the Application EventLog of your server for errors. – Filburt Jul 09 '20 at 13:17
  • there is no error as well, when we rebuild and inspect line by line we do find the last application pool name which we entered before as well, means code created application pool, but we dont know where it created and how to access it – Dark S Jul 09 '20 at 13:26
  • 1
    You probably added a wrong reference to Microsoft.Web.Administration, https://blog.lextudio.com/whats-microsoft-web-administration-and-the-horrible-facts-you-should-know-b82f2c974da6 Besides, uninstall IIS Express as it is always a tread stone for such cases. – Lex Li Jul 09 '20 at 14:40
  • yea, @LexLi, maybe! have to go through it now – Dark S Jul 10 '20 at 07:46

1 Answers1

2

You could try below code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Web.Administration;

namespace IISTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {

                Console.WriteLine("Do you want to create an Application Pool:y/n");
                string response = Console.ReadLine();
                if (response.ToString() == "y")
                {
                    Console.Write("Please enter Application Pool Name:");
                    string poolname = Console.ReadLine();
                    bool isEnable32bit = false;
                    ManagedPipelineMode mode = ManagedPipelineMode.Classic;
                    Console.Write("Need to enable 32 bit on Windows 64 bit?y/n [Applicable for 64 bit OS]: y/n?");
                    string enable32bit = Console.ReadLine();
                    if (enable32bit.ToLower() == "y")
                    {
                        isEnable32bit = true;
                    }
                    Console.Write("Please select Pipeline Mode: 1 for Classic, 2 for Integrated:");
                    string pipelinemode = Console.ReadLine();
                    if (pipelinemode.ToLower() == "2")
                    {
                        mode = ManagedPipelineMode.Integrated;
                    }
                    Console.Write("Please select Runtime Version for Application Pool: 1 for v2.0, 2 for v4.0:");
                    string runtimeVersion = Console.ReadLine() == "1" ? "v2.0" : "v4.0";

                    CreateAppPool(poolname, isEnable32bit, mode, runtimeVersion);
                    Console.WriteLine("Application Pool created successfully...");
                }
                Console.WriteLine("Do you want to create a website:y/n");
                response = Console.ReadLine();
                if (response.ToString() == "y")
                {
                    Console.Write("Please enter website name:");
                    string websiteName = Console.ReadLine();
                    Console.Write("Please enter host name:");
                    string hostname = Console.ReadLine();
                    Console.Write("Please enter physical path to point for website:");
                    string phypath = Console.ReadLine();
                    Console.WriteLine("Application pool Name:");
                    foreach (var pool in new ServerManager().ApplicationPools)
                    {
                        Console.WriteLine(pool.Name);
                    }
                    Console.WriteLine("");
                    Console.Write("Please enter Application pool Name for web site:");
                    string poolName = Console.ReadLine();
                    CreateIISWebsite(websiteName, hostname, phypath, poolName);
                    Console.WriteLine("Web site created successfully...");
                    Console.ReadLine();
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }
        }
        private static void CreateIISWebsite(string websiteName, string hostname, string phyPath, string appPool)
        {
            ServerManager iisManager = new ServerManager();
            iisManager.Sites.Add(websiteName, "http", "*:80:" + hostname, phyPath);
            iisManager.Sites[websiteName].ApplicationDefaults.ApplicationPoolName = appPool;

            foreach (var item in iisManager.Sites[websiteName].Applications)
            {
                item.ApplicationPoolName = appPool;
            }

            iisManager.CommitChanges();
        }
        private static void CreateAppPool(string poolname,bool enable32bitOn64, ManagedPipelineMode mode,string runtimeVersion="v4.0")
        {
            using (ServerManager serverManager = new ServerManager())
            {
                ApplicationPool newPool = serverManager.ApplicationPools.Add(poolname);
                newPool.ManagedRuntimeVersion = runtimeVersion;
                newPool.Enable32BitAppOnWin64 = true;
                newPool.ManagedPipelineMode = mode;
                serverManager.CommitChanges();
            }
        }
    }
}

note: do not forget to add a reference to Microsoft.Web.Administration.

Jalpa Panchal
  • 8,251
  • 1
  • 11
  • 26