программно создать сайт iis 6.0 и пул приложений с указанной версией .net - PullRequest
1 голос
/ 05 октября 2011

Мне нужно создать новый веб-сайт в iis 6.0 (Windows Server 2003 r2 sp2) и создать новый виртуальный каталог с .net framework 4.0 и назначить его на созданный сайт .

вот мой код:

public static int CreateWebSite(string webSiteName, string PhysicalPath, string PortNumber, string HostHeader, string DefaultDoc, string appPoolName, out string errorMessage)
    {
        errorMessage = string.Empty;
        try
        {
            DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC");
            // Find unused ID value for new web site
            int siteID = 1;
            foreach (DirectoryEntry e in root.Children)
            {
                if (e.SchemaClassName == "IIsWebServer")
                {
                    int ID = Convert.ToInt32(e.Name);
                    if (ID >= siteID)
                    {
                        siteID = ID + 1;
                    }
                }
            }

            DirectoryEntry site = (DirectoryEntry)root.Invoke("Create", "IIsWebServer", siteID);
            site.Invoke("Put", "ServerComment", webSiteName);
            site.Invoke("Put", "KeyType", "IIsWebServer");

            site.Invoke("Put", "ServerBindings", ":" + PortNumber + ":" + HostHeader);

            site.Invoke("Put", "ServerState", 2);
            site.Invoke("Put", "FrontPageWeb", 1);
            site.Invoke("Put", "DefaultDoc", DefaultDoc);

            site.Invoke("Put", "ServerAutoStart", 1);
            site.Invoke("Put", "ServerSize", 1);
            site.Invoke("SetInfo");

            DirectoryEntry siteVDir = site.Children.Add("Root", "IISWebVirtualDir");

            if (appPoolName != "")
            {
                object[] param = { 0, appPoolName, true };
                siteVDir.Invoke("AppCreate3", param);
            }

            siteVDir.Properties["AppIsolated"][0] = 2;

            siteVDir.Properties["Path"][0] = PhysicalPath;

            siteVDir.Properties["AccessFlags"][0] = 513;
            siteVDir.Properties["AspEnableParentPaths"][0] = true;
            siteVDir.Properties["AppFriendlyName"][0] = webSiteName;
            siteVDir.Properties["FrontPageWeb"][0] = 1;
            siteVDir.Properties["AppRoot"][0] = "LM/W3SVC/" + siteID + "/Root";
            siteVDir.Properties["AppFriendlyName"][0] = "Root";
            siteVDir.Properties["AspSessionTimeout"][0] = "60";
            siteVDir.Properties["AuthFlags"].Value = 4;//integrity windows Authentication checked
            siteVDir.Properties["AuthAnonymous"][0] = true;//Anonymouse uncheck
            siteVDir.Properties["HttpErrors"].Add("401,1,FILE," + PhysicalPath + "/Lib/CustomError/SSOLoginError.htm");
            siteVDir.Properties["HttpErrors"].Add("401,2,FILE," + PhysicalPath + "/Lib/CustomError/SSOLoginError.htm");
            siteVDir.Properties["HttpErrors"].Add("401,3,FILE," + PhysicalPath + "/Lib/CustomError/SSOLoginError.htm");
            siteVDir.Properties["HttpErrors"].Add("401,4,FILE," + PhysicalPath + "/Lib/CustomError/SSOLoginError.htm");
            siteVDir.Properties["HttpErrors"].Add("401,5,FILE," + PhysicalPath + "/Lib/CustomError/SSOLoginError.htm");
            siteVDir.Properties["HttpErrors"].Add("401,7,FILE," + PhysicalPath + "/Lib/CustomError/SSOLoginError.htm");

            //For SSO, Set special settings for  WinLogin.aspx page -- This has beed added after version 8.1.1001
            DirectoryEntry deLoginDir;
            deLoginDir = siteVDir.Children.Add("WinLogin.aspx", siteVDir.SchemaClassName);
            deLoginDir.Properties["AuthAnonymous"][0] = false;//Anonymouse uncheck
            deLoginDir.Properties["AuthFlags"].Value = 4;//integrity windows Authentication checked
            deLoginDir.CommitChanges();
            ////////////////////////////////////////////

            siteVDir.CommitChanges();

            siteVDir.Invoke("AppDelete");
            siteVDir.Invoke("AppCreate", true);
            siteVDir.Invoke("AppEnable");

            site.CommitChanges();

            #region AssignApplicationPool

            DirectoryEntry vDir = new DirectoryEntry("IIS://localhost/W3SVC/" + siteID.ToString() + "/Root");
            string className = vDir.SchemaClassName.ToString();
            if (className.EndsWith("VirtualDir"))
            {
                object[] param = { 0, appPoolName, true };
                vDir.Invoke("AppCreate3", param);
                vDir.Properties["AppIsolated"][0] = "2";
                vDir.CommitChanges();
            }
            else
            {
                return -1;
            }

            if (Environment.OSVersion.Version.Major < 6)
            {
                try
                {
                    const string aspNetV1 = "1.0.3705";
                    const string aspNetV11 = "1.1.4322";
                    const string aspNetV2 = "2.0.50727";
                    const string aspNetV4 = "4.0.30319";
                    const string targetAspNetVersion = aspNetV4;

                    //loop through the script maps
                    for (var i = 0; i < siteVDir.Properties["ScriptMaps"].Count; i++)
                    {
                        //replace the versions if they exists
                        siteVDir.Properties["ScriptMaps"][i] =
                            siteVDir.Properties["ScriptMaps"][i].ToString().Replace(aspNetV1, targetAspNetVersion);
                        siteVDir.Properties["ScriptMaps"][i] =
                            siteVDir.Properties["ScriptMaps"][i].ToString().Replace(aspNetV11, targetAspNetVersion);
                        siteVDir.Properties["ScriptMaps"][i] =
                            siteVDir.Properties["ScriptMaps"][i].ToString().Replace(aspNetV2, targetAspNetVersion);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    errorMessage = ex.Message + Environment.NewLine + ex.StackTrace;
                }
            }
            else
            {
                string appPoolPath = @"IIS://localhost/W3SVC/AppPools/" + appPoolName;
                try
                {
                    var appPoolEntry = new DirectoryEntry(appPoolPath);
                    appPoolEntry.Properties["managedRuntimeVersion"].Value = "v4.0";
                    appPoolEntry.Invoke("SetInfo", null);
                    appPoolEntry.CommitChanges();
                    appPoolEntry.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    errorMessage = ex.Message + Environment.NewLine + ex.StackTrace;
                }

                siteVDir.CommitChanges();
                siteVDir.Close();
            }

            #endregion


            return siteID;
        }
        catch
        {
            return -1;
        }
    }

Этот код должен нормально работать в IIS 6.0 (Windows 2003) и IIS 7.5+ (Windows 7 и Windows 2008). в windows 7 и 2008 все выглядит отлично! но в Windows 2003 у меня есть некоторые проблемы:

  1. Asp.net версия веб-сайта не меняется на v4
  2. Пул приложений не кажется корректным, и его узел в inetmgr имеет только один узел с именем Root , а не имя веб-сайта
  3. в окне свойств веб-сайта -> вкладка домашнего каталога, имя приложения пусто !

что не так с моим кодом?

заранее спасибо

1 Ответ

0 голосов
/ 08 января 2013
DirectoryEntry sited = new DirectoryEntry(string.Format("IIS://localhost/w3svc/{0}/Root", websiteID.ToString()));
sited.Properties["AccessRead"].Add(true);
PropertyValueCollection testScriptMap = sited.Properties["ScriptMaps"];

object[] allValues = (object[])testScriptMap.Value;
object[] newValues = new object[allValues.Length];
string oldVersion = "v1.1.4322";
string newVersion = "v2.0.50727";
//... etc to 4.0.30319 .....
for (int i = 0; i < allValues.Length; i++)
{
    if (allValues[i] is string)
    {
        string temp = allValues[i] as string;
        if (temp.Contains(oldVersion))
        {
            newValues[i] = temp.Replace(oldVersion, newVersion);
        }
        else
        {
            newValues[i] = allValues[i];
        }

    }
    else
    {
        newValues[i] = allValues[i];
    }
}
testScriptMap.Value = newValues;

sited.CommitChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...