public void CopyToCurrentDetails(Session session)
        {
            session.SetPropertyValue(FeaturePropertyName, this.FeatureName);

            if (this is WebsiteInstallationInfo)
            {
                WebsiteInstallationInfo websiteInstallationInfo = this as WebsiteInstallationInfo;
                session.SetPropertyValue(Constants.CreateWebsite, websiteInstallationInfo.CreateAsWebsite.ToString());
                session.SetPropertyValue(Constants.ApplicationPath, websiteInstallationInfo.TargetWmiPath);
                session.SetPropertyValue(Constants.VirtualDirectoryName, "");
                session.SetPropertyValue(Constants.WebsiteName, websiteInstallationInfo.WebsiteName);
                session.SetPropertyValue(Constants.VirtualDirectorySitePath, "");
            }
            else
            {
                VirtualDirectoryInstallationInfo virtualDirectoryInstallationInfo = this as VirtualDirectoryInstallationInfo;
                session.SetPropertyValue(Constants.CreateWebsite, virtualDirectoryInstallationInfo.CreateAsWebsite.ToString());
                session.SetPropertyValue(Constants.ApplicationPath, virtualDirectoryInstallationInfo.TargetWmiPath);
                session.SetPropertyValue(Constants.VirtualDirectoryName, virtualDirectoryInstallationInfo.VirtualDirectoryName);
                session.SetPropertyValue(Constants.WebsiteName, virtualDirectoryInstallationInfo.WebsiteName);
                session.SetPropertyValue(Constants.VirtualDirectorySitePath, virtualDirectoryInstallationInfo.WebsitePath);
            }
        }
        public static ActionResult DeployWebsite(Session session, Dictionary <string, WebInstallationOptions> allOptions)
        {
            RunWebAction(session,
                         featureName =>
            {
                try
                {
                    EnsureIISComponents();
                    var options             = allOptions[featureName];
                    var webInstallationInfo = WebInstallationInfo.CreateFromFeature(session, featureName);
                    bool exists             = webInstallationInfo.TargetEntryExists;
                    int siteID = webInstallationInfo.GetSiteId();
                    int scriptMapVersion;

                    RunRegIIS("-ir", options.FrameworkVersion);

                    if (webInstallationInfo.CreateAsWebsite)
                    {
                        WebsiteInstallationInfo websiteInstallationInfo = webInstallationInfo as WebsiteInstallationInfo;
                        using (DirectoryEntry machineRoot = new DirectoryEntry(WebInstallationInfo.ServerRoot))
                        {
                            string appPoolName = "";
                            if (DirectoryEntry.Exists(WebsiteInstallationInfo.AppPoolsRoot))
                            {
                                using (DirectoryEntry appPools = new DirectoryEntry(WebsiteInstallationInfo.AppPoolsRoot))
                                {
                                    appPoolName        = webInstallationInfo.WebsiteName;
                                    bool appPoolExixts = DirectoryEntry.Exists(websiteInstallationInfo.AppPoolWmiPath);
                                    using (DirectoryEntry appPool = appPoolExixts ? new DirectoryEntry(appPools.Path + "/" + websiteInstallationInfo.WebsiteName) : appPools.Invoke("Create", "IIsApplicationPool", websiteInstallationInfo.WebsiteName) as DirectoryEntry)
                                    {
                                        appPool.InvokeSet("AppPoolIdentityType", 2);    //LocalSystem 0; LocalService 1; NetworkService 2;  Custom (user & pwd) 3;  ApplicationPoolIdentity 4
                                        appPool.InvokeSet("AppPoolAutoStart", true);
                                        if (GetIisMajorVersion() > 6)
                                        {
                                            appPool.InvokeSet("ManagedRuntimeVersion", string.Format("v{0}", options.FrameworkVersion.ToString(2)));
                                            appPool.InvokeSet("ManagedPipelineMode", 0);     // Integrated 0; Classic 1
                                        }
                                        appPool.CommitChanges();
                                    }
                                }
                            }
                            using (DirectoryEntry site = exists ? new DirectoryEntry(machineRoot.Path + "/" + siteID) : machineRoot.Invoke("Create", "IIsWebServer", siteID) as System.DirectoryServices.DirectoryEntry)
                            {
                                site.Invoke("Put", "ServerComment", websiteInstallationInfo.WebsiteName);
                                site.Invoke("Put", "KeyType", "IIsWebServer");
                                site.Invoke("Put", "ServerBindings", "*:80:" + websiteInstallationInfo.WebsiteName);
                                site.Invoke("Put", "ServerState", 2);
                                site.Invoke("Put", "FrontPageWeb", 1);
                                site.Invoke("Put", "DefaultDoc", "Default.aspx");
                                site.Invoke("Put", "SecureBindings", "*:443:" + websiteInstallationInfo.WebsiteName);
                                site.Invoke("Put", "ServerAutoStart", 1);
                                site.Invoke("Put", "ServerSize", 1);
                                site.Invoke("SetInfo");
                                site.CommitChanges();

                                WebInstallationInfo.AddFeatureDetails(session, webInstallationInfo);
                                string siteRootPath = site.Path + "/Root";
                                using (DirectoryEntry siteRoot = DirectoryEntry.Exists(siteRootPath) ? new DirectoryEntry(siteRootPath) : site.Children.Add("Root", "IIsWebVirtualDir"))
                                {
                                    siteRoot.InvokeSet("Path", websiteInstallationInfo.GetWebFolderPath(options));
                                    siteRoot.InvokeSet("DefaultDoc", "Default.aspx");
                                    if (!string.IsNullOrEmpty(appPoolName))
                                    {
                                        siteRoot.InvokeSet("AppPoolId", appPoolName);
                                    }
                                    siteRoot.Invoke("AppCreate", true);
                                    siteRoot.CommitChanges();
                                    scriptMapVersion = GetScriptMapsVersion(siteRoot);
                                }
                            }
                        }
                    }
                    else
                    {
                        VirtualDirectoryInstallationInfo virtualDirectoryInstallationInfo = webInstallationInfo as VirtualDirectoryInstallationInfo;
                        using (DirectoryEntry websiteEntry = new DirectoryEntry(virtualDirectoryInstallationInfo.WebsitePath))
                        {
                            using (DirectoryEntry applicationEntry = exists ? new DirectoryEntry(virtualDirectoryInstallationInfo.TargetWmiPath) : websiteEntry.Invoke("Create", "IIsWebVirtualDir", virtualDirectoryInstallationInfo.VirtualDirectoryName) as DirectoryEntry)
                            {
                                applicationEntry.InvokeSet("Path", virtualDirectoryInstallationInfo.GetWebFolderPath(options));
                                applicationEntry.Invoke("AppCreate", true);
                                applicationEntry.InvokeSet("AppFriendlyName", virtualDirectoryInstallationInfo.VirtualDirectoryName);
                                applicationEntry.InvokeSet("DefaultDoc", "Default.aspx");
                                applicationEntry.CommitChanges();
                                WebInstallationInfo.AddFeatureDetails(session, virtualDirectoryInstallationInfo);
                            }
                            scriptMapVersion = GetScriptMapsVersion(websiteEntry);
                        }
                    }

                    // Set ASP.NET to target framework version
                    if (scriptMapVersion != options.FrameworkVersion.Major)
                    {
                        RunRegIIS(string.Format("-s {0}", webInstallationInfo.TargetWmiSubPath), options.FrameworkVersion);
                    }

                    // Mark as done
                    WebInstallationInfo.AddFeatureDetails(session, webInstallationInfo);

                    GrantConfigEncryptionAccess(options.FrameworkVersion);

                    var configFilePath  = webInstallationInfo.GetWebConfigFilePath(options);
                    var appRelativePath = webInstallationInfo.GetAppRelativePath();

                    // Data provider keys
                    EncryptConfigSections(configFilePath, siteID.ToString(), appRelativePath, options.ConfigSectionGroupEncryptionOptions, options.FrameworkVersion);

                    // Logging flat file access
                    if (options.InitializeFlatFileLogging)
                    {
                        InitializeFlatFileLogging(configFilePath);
                    }

                    // Set and encrypt connection strings and enqueue their encryption
                    SetConnectionStrings(configFilePath, options.ConnectionStrings);
                    if (options.EncryptConnectionStrings)
                    {
                        EncryptConnectionStrings(siteID.ToString(), appRelativePath, options.FrameworkVersion);
                    }

                    // Add url to internet explorer trusted zone
                    var internetSecurityManager = InternetSecurityManager.CreateObject();
                    foreach (var url in webInstallationInfo.CalculateWebUrls())
                    {
                        AddUrlToLocalIntranet(url);
                    }
                }
                catch (InstallException ex)
                {
                    throw ex;
                }
                catch (Exception ex)
                {
                    throw new InstallException(Messages.AnErrorHasOccurredAndInstallationWillBeCancelled, ex);
                }
            });
            return(ActionResult.Success);
        }