websitepanel/WebsitePanel.Installer/Sources/WebsitePanel.Setup/Common/WebUtils.cs

1161 lines
41 KiB
C#

// Copyright (c) 2012, Outercurve Foundation.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// - Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// - Neither the name of the Outercurve Foundation nor the names of its
// contributors may be used to endorse or promote products derived from this
// software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.IO;
using System.Collections.Generic;
using System.Management;
using Microsoft.Win32;
using WebsitePanel.Setup.Web;
using Microsoft.Web.Management;
using Microsoft.Web.Administration;
using System.DirectoryServices;
using System.Text.RegularExpressions;
namespace WebsitePanel.Setup
{
/// <summary>
/// Web utils class.
/// </summary>
public sealed class WebUtils
{
/// <summary>IIS_SERVICE_ID</summary>
public const string IIS_SERVICE_ID = "W3SVC";
public const string AspNet11 = "v1.1.4322";
public const string AspNet20 = "v2.0.50727";
public const string AspNet40 = "v4.0.30319";
public const string WEBSITEPANEL_POOL = "WebsitePanel Pool";
public const string WEBSITEPANEL_ADMIN_POOL = "WebsitePanel Admin Pool";
internal static string[] aspNet11Maps = new string[] { ".asax", ".ascx", ".ashx",
".asmx", ".aspx", ".axd", ".config", ".cs", ".csproj", ".licx", ".rem", ".resources", ".resx",
".soap", ".vb", ".vbproj", ".vsdisco", ".webinfo"};
internal static string[] aspNet20Maps = new string[] { ".ad", ".adprototype", ".asax", ".ascx", ".ashx",
".asmx", ".aspx", ".axd", ".browser", ".cd", ".compiled", ".config", ".cs", ".csproj", ".dd",
".exclude", ".java", ".jsl", ".ldb", ".ldd", ".lddprototype", ".ldf", ".licx", ".master",
".mdb", ".mdf", ".msgx", ".refresh", ".rem", ".resources", ".resx", ".sd", ".sdm", ".sdmDocument",
".sitemap", ".skin", ".soap", ".svc", ".vb", ".vbproj", ".vjsproj", ".vsdisco", ".webinfo"};
internal static string[] aspNet40Maps = new string[] { ".ad", ".adprototype", ".asax", ".ascx", ".ashx",
".asmx", ".aspx", ".axd", ".browser", ".cd", ".compiled", ".config", ".cs", ".csproj", ".dd",
".exclude", ".java", ".jsl", ".ldb", ".ldd", ".lddprototype", ".ldf", ".licx", ".master",
".mdb", ".mdf", ".msgx", ".refresh", ".rem", ".resources", ".resx", ".sd", ".sdm", ".sdmDocument",
".sitemap", ".skin", ".soap", ".svc", ".vb", ".vbproj", ".vjsproj", ".vsdisco", ".webinfo"};
private static WmiHelper wmi = new WmiHelper("root\\MicrosoftIISv2");
/// <summary>
/// Initializes a new instance of the class.
/// </summary>
private WebUtils()
{
}
/// <summary>
/// Retrieves web sites.
/// </summary>
/// <returns>Web sites.</returns>
internal static WebSiteItem[] GetWebSites()
{
List<WebSiteItem> sites = new List<WebSiteItem>();
// get all sites
ManagementObjectCollection objSites = wmi.ExecuteQuery("SELECT * FROM IIsWebServerSetting");
foreach(ManagementObject objSite in objSites)
{
WebSiteItem site = new WebSiteItem();
FillWebSiteFromWmiObject(site, objSite);
sites.Add(site);
}
return sites.ToArray();
}
/*
/// <summary>
/// Creates virtual directory.
/// </summary>
/// <param name="siteId">Site id.</param>
/// <param name="directoryName">Directory name.</param>
/// <param name="contentPath">Content path.</param>
/// <param name="aspNet">ASP.NET version</param>
internal static void CreateVirtualDirectory(string siteId, string directoryName, string contentPath,
AspNetVersion aspNet)
{
// set folder permissions
SetWebFolderPermissions(contentPath, GetSiteAnonymousUserName(siteId));
string dirId = GetVirtualDirectoryPath(siteId, directoryName);
// create a new virtual directory
ManagementObject objDir = wmi.GetClass("IIsWebVirtualDir").CreateInstance();
objDir.Properties["Name"].EventData = dirId;
objDir.Put();
objDir.InvokeMethod("AppCreate",new Object[] {true});
// update directory properties
ManagementObject objDirSetting = wmi.GetClass("IIsWebVirtualDirSetting").CreateInstance();
objDirSetting.Properties["Name"].EventData = dirId;
objDirSetting.Properties["AppFriendlyName"].EventData = directoryName;
objDirSetting.Properties["Path"].EventData = contentPath;
// save object again
objDirSetting.Put();
// set ASP.NET
objDirSetting = wmi.GetObject(
String.Format("IIsWebVirtualDirSetting='{0}'", GetVirtualDirectoryPath(siteId, directoryName)));
SetVirtualDirectoryAspNetMappings(objDirSetting, aspNet);
// set correct default documents
SetVirtualDirectoryDefaultDocs(objDirSetting);
// save object again
objDirSetting.Put();
}
*/
internal static void SetWebFolderPermissions(string path, string userDomain, string userAccount)
{
if(!FileUtils.DirectoryExists(path))
FileUtils.CreateDirectory(path);
SecurityUtils.GrantNtfsPermissions(path, userDomain, userAccount, NtfsPermission.Modify, true, true);
SecurityUtils.GrantNtfsPermissionsBySid(path, SystemSID.NETWORK_SERVICE, NtfsPermission.Modify, true, true);
}
/// <summary>
/// Checks if the site exists.
/// </summary>
/// <param name="siteId">SiteID</param>
/// <returns></returns>
internal static bool SiteIdExists(string siteId)
{
return (wmi.ExecuteQuery(
String.Format("SELECT * FROM IIsWebServerSetting WHERE Name='{0}'", siteId)).Count > 0);
}
/// <summary>
/// Checks if the site exists.
/// </summary>
/// <param name="siteId">SiteID</param>
/// <returns></returns>
internal static bool IIS7SiteExists(string siteId)
{
ServerManager serverManager = new ServerManager();
bool ret = (serverManager.Sites[siteId] != null);
return ret;
}
/// <summary>
/// Retreives site by site id.
/// </summary>
/// <param name="siteId">Site id.</param>
/// <returns>Site object.</returns>
internal static WebSiteItem GetSite(string siteId)
{
WebSiteItem site = new WebSiteItem();
// get web server settings object
ManagementObject objSite = wmi.GetObject(String.Format("IIsWebServerSetting='{0}'", siteId));
FillWebSiteFromWmiObject(site, objSite);
// get ROOT vritual directory settings object
ManagementObject objVirtDir = wmi.GetObject(
String.Format("IIsWebVirtualDirSetting='{0}'", GetVirtualDirectoryPath(siteId, "")));
FillVirtualDirectoryFromWmiObject(site, objVirtDir);
FillVirtualDirectoryRestFromWmiObject(site, objVirtDir);
return site;
}
private static void FillWebSiteFromWmiObject(WebSiteItem site,
ManagementBaseObject obj)
{
site.SiteId = (string)obj.Properties["Name"].Value;
site.Name = (string)obj.Properties["ServerComment"].Value;
// get server bindings
ManagementBaseObject[] objBindings =
((ManagementBaseObject[])obj.Properties["ServerBindings"].Value);
if(objBindings != null)
{
site.Bindings = new ServerBinding[objBindings.Length];
for(int i = 0; i < objBindings.Length; i++)
{
site.Bindings[i] = new ServerBinding(
(string)objBindings[i].Properties["IP"].Value,
(string)objBindings[i].Properties["Port"].Value,
(string)objBindings[i].Properties["Hostname"].Value);
}
}
}
private static void FillVirtualDirectoryFromWmiObject(WebVirtualDirectoryItem virtDir,
ManagementBaseObject obj)
{
virtDir.AllowReadAccess = (bool)obj.Properties["AccessRead"].Value;
virtDir.AllowScriptAccess = (bool)obj.Properties["AccessScript"].Value;
virtDir.AllowSourceAccess = (bool)obj.Properties["AccessSource"].Value;
virtDir.AllowWriteAccess = (bool)obj.Properties["AccessWrite"].Value;
virtDir.AllowExecuteAccess = (bool)obj.Properties["AccessExecute"].Value;
virtDir.AllowDirectoryBrowsingAccess = (bool)obj.Properties["EnableDirBrowsing"].Value;
virtDir.AnonymousUsername = (string)obj.Properties["AnonymousUserName"].Value;
virtDir.AnonymousUserPassword = (string)obj.Properties["AnonymousUserPass"].Value;
virtDir.AuthWindows = (bool)obj.Properties["AuthNTLM"].Value;
virtDir.AuthAnonymous = (bool)obj.Properties["AuthAnonymous"].Value;
virtDir.AuthBasic = (bool)obj.Properties["AuthBasic"].Value;
virtDir.DefaultDocs = (string)obj.Properties["DefaultDoc"].Value;
}
private static void FillVirtualDirectoryRestFromWmiObject(WebVirtualDirectoryItem virtDir,
ManagementBaseObject obj)
{
virtDir.ContentPath = (string)obj.Properties["Path"].Value;
virtDir.HttpRedirect = (string)obj.Properties["HttpRedirect"].Value;
}
internal static string GetVirtualDirectoryPath(string siteId, string directoryName)
{
string path = siteId + "/ROOT";
if(directoryName != null && directoryName != string.Empty)
path += "/" + directoryName;
return path;
}
private static string GetSiteAnonymousUserName(string siteId)
{
// get ROOT virtual directory settings object
ManagementObject obj = wmi.GetObject(
String.Format("IIsWebVirtualDirSetting='{0}'", GetVirtualDirectoryPath(siteId, string.Empty)));
return (string)obj.Properties["AnonymousUserName"].Value;
}
/// <summary>
/// Checks site bindings.
/// </summary>
/// <param name="ip">IP address.</param>
/// <param name="port">TCP port.</param>
/// <param name="host">Host header value.</param>
/// <returns>True if site binding exist, otherwise false.</returns>
internal static bool CheckSiteBindings(string ip, string port, string host)
{
// check for server bindings
ManagementObjectCollection objSites = wmi.ExecuteQuery("SELECT * FROM IIsWebServerSetting");
foreach(ManagementObject objSite in objSites)
{
// check server bindings
ManagementBaseObject[] objProbBinings = (ManagementBaseObject[])objSite.Properties["ServerBindings"].Value;
if(objProbBinings != null)
{
// check this binding against provided ones
foreach(ManagementBaseObject objProbBinding in objProbBinings)
{
string siteIP = (string)objProbBinding.Properties["IP"].Value;
string sitePort = (string)objProbBinding.Properties["Port"].Value;
string siteHost = (string)objProbBinding.Properties["Hostname"].Value;
if(siteIP == ip && sitePort == port && host.ToLower() == siteHost.ToLower())
return false;
}
}
}
return true;
}
/// <summary>
/// Creates site.
/// </summary>
/// <param name="site">Site object.</param>
/// <returns>Site id.</returns>
internal static string CreateSite(WebSiteItem site)
{
//CheckWebServerBindings(site.Bindings);
// set folder permissions
//SetWebFolderPermissions(site.ContentPath, site.AnonymousUsername);
// create Web site
ManagementObject objService = wmi.GetObject(String.Format("IIsWebService='{0}'", IIS_SERVICE_ID));
ManagementBaseObject methodParams = objService.GetMethodParameters("CreateNewSite");
// create server bindings
ManagementClass clsBinding = wmi.GetClass("ServerBinding");
ManagementObject[] objBindings = new ManagementObject[site.Bindings.Length];
for(int i = 0; i < objBindings.Length; i++)
{
objBindings[i] = clsBinding.CreateInstance();
objBindings[i]["Hostname"] = site.Bindings[i].Host;
objBindings[i]["IP"] = site.Bindings[i].IP;
objBindings[i]["Port"] = site.Bindings[i].Port;
}
methodParams["ServerBindings"] = objBindings;
methodParams["ServerComment"] = site.Name;
methodParams["PathOfRootVirtualDir"] = site.ContentPath;
ManagementBaseObject objResult = objService.InvokeMethod("CreateNewSite", methodParams, new InvokeMethodOptions());
// get WEB settings
string siteId = ((string)objResult["returnValue"]).Remove(0, "IIsWebServer='".Length).Replace("'","");
// update site properties
ManagementObject objSite = wmi.GetObject(String.Format("IIsWebServerSetting='{0}'", siteId));
ManagementObject objVirtDir = wmi.GetObject(
String.Format("IIsWebVirtualDirSetting='{0}'", GetVirtualDirectoryPath(siteId, "")));
if(site.LogFileDirectory != null && site.LogFileDirectory != "")
objSite.Properties["LogFileDirectory"].Value = site.LogFileDirectory;
FillWmiObjectFromVirtualDirectory(objSite, site);
objSite.Put();
FillWmiObjectFromVirtualDirectory(objVirtDir, site);
FillWmiObjectFromVirtualDirectoryRest(objVirtDir, site);
// set correct default documents
SetVirtualDirectoryDefaultDocs(objVirtDir);
// set ASP.NET
SetVirtualDirectoryAspNetMappings(objVirtDir, site.InstalledDotNetFramework);
// save object
objVirtDir.Put();
// start site
ChangeSiteState(siteId, ServerState.Started);
return siteId;
}
/// <summary>
/// Creates site.
/// </summary>
/// <param name="site">Site object.</param>
/// <returns>Site id.</returns>
internal static string CreateIIS7Site(WebSiteItem site)
{
ServerManager serverManager = new ServerManager();
Site webSite = serverManager.Sites[site.Name];
if ( webSite == null )
webSite = serverManager.Sites.Add(site.Name, site.ContentPath, 80);
// cleanup all bindings
webSite.Bindings.Clear();
//
foreach (ServerBinding binding in site.Bindings)
{
//
webSite.Bindings.Add(binding.IP + ":" + binding.Port + ":" + binding.Host,
Uri.UriSchemeHttp);
}
//
webSite.Applications[0].ApplicationPoolName = site.ApplicationPool;
//
//webSite.LogFile.Directory = site.LogFileDirectory;
//
site.SiteId = webSite.Name;
//
webSite.ServerAutoStart = true;
//authentication
Configuration cnfg = serverManager.GetApplicationHostConfiguration();
ConfigurationSection section = cnfg.GetSection("system.webServer/security/authentication/anonymousAuthentication", site.Name);
section["enabled"] = site.AuthAnonymous;
section["userName"] = string.Empty;
section["password"] = string.Empty;
section = cnfg.GetSection("system.webServer/security/authentication/windowsAuthentication", site.Name);
section["enabled"] = site.AuthWindows;
//TODO: default documents
serverManager.CommitChanges();
return site.SiteId;
}
/// <summary>
/// Updates site
/// </summary>
/// <param name="siteId"></param>
/// <param name="contentPath"></param>
/// <param name="ip"></param>
/// <param name="port"></param>
/// <param name="host"></param>
/// <param name="aspNet">ASP.NET version</param>
internal static void UpdateSite(string siteId, string contentPath, string ip, string port, string host,
AspNetVersion aspNet)
{
ManagementObject objSite = wmi.GetObject(String.Format("IIsWebServerSetting='{0}'", siteId));
ManagementObject objVirtDir = wmi.GetObject(
String.Format("IIsWebVirtualDirSetting='{0}'", GetVirtualDirectoryPath(siteId, "")));
// check if we need to add a server binding
string existSiteId = GetSiteIdByBinding(ip, port, host);
if(existSiteId == null)
{
// binding doesn't exist
// add the binding to the web site
ManagementBaseObject[] objProbBindings = (ManagementBaseObject[])objSite.Properties["ServerBindings"].Value;
ManagementClass clsBinding = wmi.GetClass("ServerBinding");
ManagementObject[] newBindings = new ManagementObject[objProbBindings.Length+1];
// copy existing bindings
for(int i = 0; i < objProbBindings.Length; i++)
{
newBindings[i] = clsBinding.CreateInstance();
newBindings[i]["Hostname"] = (string)objProbBindings[i].Properties["Hostname"].Value;
newBindings[i]["IP"] = (string)objProbBindings[i].Properties["IP"].Value;
newBindings[i]["Port"] = (string)objProbBindings[i].Properties["Port"].Value;
}
//create new binding
newBindings[objProbBindings.Length] = clsBinding.CreateInstance();
newBindings[objProbBindings.Length]["Hostname"] = host;
newBindings[objProbBindings.Length]["IP"] = ip;
newBindings[objProbBindings.Length]["Port"] = port;
objSite.Properties["ServerBindings"].Value = newBindings;
}
objSite.Put();
// set path
if (!String.IsNullOrEmpty(contentPath))
{
// set content path
objVirtDir.Properties["Path"].Value = contentPath;
// set correct default documents
SetVirtualDirectoryDefaultDocs(objVirtDir);
}
// set ASP.NET
SetVirtualDirectoryAspNetMappings(objVirtDir, aspNet);
// save object
objVirtDir.Put();
}
/// <summary>
/// Changes site state.
/// </summary>
/// <param name="siteId">Site id.</param>
/// <param name="state">Server state.</param>
internal static void ChangeSiteState(string siteId, ServerState state)
{
ManagementObject objSite = wmi.GetObject(String.Format("IIsWebServer='{0}'", siteId));
string methodName = "Continue";
switch(state)
{
case ServerState.Started: methodName = "Start"; break;
case ServerState.Stopped: methodName = "Stop"; break;
case ServerState.Paused: methodName = "Pause"; break;
case ServerState.Continuing: methodName = "Continue"; break;
default: methodName = "Start"; break;
}
// invoke method
objSite.InvokeMethod(methodName, null);
}
private static void FillWmiObjectFromVirtualDirectory(ManagementBaseObject obj, WebVirtualDirectoryItem virtDir)
{
obj.Properties["AppFriendlyName"].Value = virtDir.Name;
obj.Properties["AccessRead"].Value = virtDir.AllowReadAccess;
obj.Properties["AccessScript"].Value = virtDir.AllowScriptAccess;
obj.Properties["AccessSource"].Value = virtDir.AllowSourceAccess;
obj.Properties["AccessWrite"].Value = virtDir.AllowWriteAccess;
obj.Properties["AccessExecute"].Value = virtDir.AllowExecuteAccess;
obj.Properties["EnableDirBrowsing"].Value = virtDir.AllowDirectoryBrowsingAccess;
obj.Properties["AuthNTLM"].Value = virtDir.AuthWindows;
obj.Properties["AuthAnonymous"].Value = virtDir.AuthAnonymous;
obj.Properties["AuthBasic"].Value = virtDir.AuthBasic;
if(virtDir.DefaultDocs != null && virtDir.DefaultDocs != string.Empty)
obj.Properties["DefaultDoc"].Value = virtDir.DefaultDocs;
if(virtDir.AnonymousUsername != null && virtDir.AnonymousUsername != string.Empty)
{
obj.Properties["AnonymousUserName"].Value = virtDir.AnonymousUsername;
obj.Properties["AnonymousUserPass"].Value = virtDir.AnonymousUserPassword;
}
obj.Properties["AppPoolId"].Value = virtDir.ApplicationPool;
}
private static void FillWmiObjectFromVirtualDirectoryRest(ManagementBaseObject obj,
WebVirtualDirectoryItem virtDir)
{
obj.Properties["Path"].Value = virtDir.ContentPath;
obj.Properties["HttpRedirect"].Value = (virtDir.HttpRedirect == null || virtDir.HttpRedirect == "") ?
null : virtDir.HttpRedirect;
}
private static void SetVirtualDirectoryDefaultDocs(ManagementBaseObject obj)
{
string defaultDoc = obj.Properties["DefaultDoc"].Value.ToString();
List<string> defaultDocs = new List<string>();
defaultDocs.AddRange(defaultDoc.Split(','));
bool contains = false;
foreach (string doc in defaultDocs)
{
if (String.Compare(doc, "default.aspx", true) == 0)
{
contains = true;
break;
}
}
if (!contains)
{
defaultDocs.Add("Default.aspx");
defaultDoc = String.Join(",", defaultDocs.ToArray());
obj.Properties["DefaultDoc"].Value = defaultDoc;
}
}
private static void SetVirtualDirectoryAspNetMappings(ManagementBaseObject obj, AspNetVersion aspNet)
{
if (aspNet != AspNetVersion.Unknown)
{
// configure ASP.NET
// remove existing mappings
List<string> aspNetMaps = new List<string>();
aspNetMaps.AddRange(aspNet20Maps);
List<ManagementBaseObject> scriptMaps = new List<ManagementBaseObject>();
ManagementBaseObject[] objScriptMaps =
((ManagementBaseObject[])obj.Properties["ScriptMaps"].Value);
// get/filter existing maps
foreach (ManagementBaseObject objScriptMap in objScriptMaps)
{
string ext = (string)objScriptMap.Properties["Extensions"].Value;
if (!aspNetMaps.Contains(ext))
scriptMaps.Add(objScriptMap);
}
// add script maps
string[] aspNetExtensions = aspNet11Maps;
string aspNetVersionName = AspNet11;
if (aspNet == AspNetVersion.AspNet20)
{
aspNetExtensions = aspNet20Maps;
aspNetVersionName = AspNet20;
}
// add required script maps
RegistryKey netFramework = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\.NetFramework", false);
string installRoot = netFramework.GetValue("InstallRoot").ToString();
string processorPath = Path.Combine(installRoot, aspNetVersionName + "\\aspnet_isapi.dll");
// correct mappings for IIS 32-bit mode
if (Utils.IsWin64() && Utils.IIS32Enabled())
processorPath = processorPath.Replace("Framework64", "Framework");
foreach (string extension in aspNetExtensions)
{
ManagementClass clsScriptMap = wmi.GetClass("ScriptMap");
ManagementObject objScriptMap = clsScriptMap.CreateInstance();
objScriptMap.Properties["Extensions"].Value = extension;
int flags = 5;
if (extension == ".soap" || extension == ".rem" || extension == ".vsdisco" ||
extension == ".axd" || extension == ".aspx" || extension == ".asmx" || extension == ".ashx")
flags = 1;
objScriptMap.Properties["Flags"].Value = flags;
objScriptMap.Properties["IncludedVerbs"].Value = "GET,HEAD,POST,DEBUG";
objScriptMap.Properties["ScriptProcessor"].Value = processorPath;
objScriptMap.Put();
scriptMaps.Add(objScriptMap);
}
// set script maps
obj.Properties["ScriptMaps"].Value = scriptMaps.ToArray();
}
}
/// <summary>
/// Checks whether virtual directory exists.
/// </summary>
/// <param name="siteId">Site id.</param>
/// <param name="directoryName">Directory name.</param>
/// <returns>True if viertual directory exists, otherwise false.</returns>
internal static bool VirtualDirectoryExists(string siteId, string directoryName)
{
return (wmi.ExecuteQuery(
String.Format("SELECT * FROM IIsWebVirtualDirSetting" +
" WHERE Name='{0}'", GetVirtualDirectoryPath(siteId, directoryName))).Count > 0);
}
/// <summary>
/// Deletes virtual directory
/// </summary>
/// <param name="siteId"></param>
/// <param name="directoryName"></param>
internal static void DeleteVirtualDirectory(string siteId, string directoryName)
{
try
{
ManagementObject objDir = wmi.GetObject(String.Format("IIsWebVirtualDir='{0}'",
GetVirtualDirectoryPath(siteId, directoryName)));
objDir.Delete();
}
catch(Exception ex)
{
throw new Exception("Can't delete virtual directory", ex);
}
}
/// <summary>
/// Deletes site
/// </summary>
/// <param name="siteId"></param>
internal static void DeleteSite(string siteId)
{
try
{
ManagementObject objSite = wmi.GetObject(String.Format("IIsWebServer='{0}'", siteId));
objSite.Delete();
}
catch(Exception ex)
{
throw new Exception("Can't delete web site", ex);
}
}
/// <summary>
/// Deletes site
/// </summary>
/// <param name="siteId"></param>
internal static void DeleteIIS7Site(string siteId)
{
try
{
ServerManager serverManager = new ServerManager();
Site site = serverManager.Sites[siteId];
if (site != null)
{
serverManager.Sites.Remove(site);
serverManager.CommitChanges();
}
}
catch (Exception ex)
{
throw new Exception("Can't delete web site", ex);
}
}
/// <summary>
/// Check if there is already a web site with the specified server binding.
/// </summary>
/// <param name="ip">IP address</param>
/// <param name="port">Port number</param>
/// <param name="host">Host header value</param>
/// <returns></returns>
internal static string GetSiteIdByBinding(string ip, string port, string host)
{
// check for server bindings
ObjectQuery objectQuery = new ObjectQuery("SELECT * FROM IIsWebServerSetting");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmi.WmiScope, objectQuery))
{
using (ManagementObjectCollection objSites = searcher.Get())
{
foreach (ManagementObject objProbSite in objSites)
{
string probSiteId = (string)objProbSite.Properties["Name"].Value;
// check server bindings
ManagementBaseObject[] objProbBinings = (ManagementBaseObject[])objProbSite.Properties["ServerBindings"].Value;
if (objProbBinings != null)
{
// check this binding against provided ones
foreach (ManagementBaseObject objProbBinding in objProbBinings)
{
string siteIP = (string)objProbBinding.Properties["IP"].Value;
string sitePort = (string)objProbBinding.Properties["Port"].Value;
string siteHost = (string)objProbBinding.Properties["Hostname"].Value;
if ((siteIP == ip && sitePort == port && host.ToLower() == siteHost.ToLower()) ||
(siteIP == "" && sitePort == port && host.ToLower() == siteHost.ToLower())) // (All unassigned)
return probSiteId;
objProbBinding.Dispose();
}
}
objProbSite.Dispose();
}
}
}
return null;
}
/// <summary>
/// Check if there is already a web site with the specified server binding.
/// </summary>
/// <param name="ip">IP address</param>
/// <param name="port">Port number</param>
/// <param name="host">Host header value</param>
/// <returns></returns>
internal static string GetIIS7SiteIdByBinding(string ip, string port, string host)
{
ServerManager serverManager = new ServerManager();
foreach (Site webSite in serverManager.Sites)
{
foreach (Binding binding in webSite.Bindings)
{
if (binding.Protocol != Uri.UriSchemeHttp)
continue;
string bi = binding.BindingInformation;
string[] tokens = bi.Split(':');
if (tokens.Length != 3)
continue;
string siteIP = tokens[0];
string sitePort = tokens[1];
string siteHost = tokens[2];
if ((siteIP == ip && sitePort == port && host.ToLower() == siteHost.ToLower()) ||
(siteIP == "*" && sitePort == port && host.ToLower() == siteHost.ToLower())) // (All unassigned)
return webSite.Name;
}
}
return null;
}
/// <summary>
/// Checks whether application pool exists
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
internal static bool ApplicationPoolExists(string name)
{
WmiHelper wmi = new WmiHelper("root\\MicrosoftIISv2");
return(wmi.ExecuteQuery(
String.Format("SELECT * FROM IIsApplicationPool WHERE Name='W3SVC/AppPools/{0}'", name)).Count > 0);
}
/// <summary>
/// Checks whether application pool exists
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
internal static bool IIS7ApplicationPoolExists(string name)
{
ServerManager serverManager = new ServerManager();
bool ret = (serverManager.ApplicationPools[name] != null);
return ret;
}
/// <summary>
/// Ctreates application pool
/// </summary>
/// <param name="name"></param>
/// <param name="username"></param>
/// <param name="password"></param>
internal static void CreateApplicationPool(string name, string username, string password)
{
// create pool
ManagementObject objPool = wmi.GetClass("IIsApplicationPool").CreateInstance();
objPool.Properties["Name"].Value = "W3SVC/AppPools/" + name;
objPool.Put();
// specify pool properties
objPool = wmi.GetClass("IIsApplicationPoolSetting").CreateInstance();
objPool.Properties["Name"].Value = "W3SVC/AppPools/" + name;
if (!String.IsNullOrEmpty(username))
{
// specified account
objPool.Properties["AppPoolIdentityType"].Value = 3;
objPool.Properties["WAMUserName"].Value = username;
objPool.Properties["WAMUserPass"].Value = password;
}
else
{
// NETWORK SERVICE
objPool.Properties["AppPoolIdentityType"].Value = 2;
}
objPool.Put();
}
internal static void StartApplicationPool(string name)
{
ManagementObject objPool = wmi.GetObject(String.Format("IIsApplicationPool='W3SVC/AppPools/{0}'", name));
objPool.InvokeMethod("Start", null);
}
internal static void StopApplicationPool(string name)
{
ManagementObject objPool = wmi.GetObject(String.Format("IIsApplicationPool='W3SVC/AppPools/{0}'", name));
objPool.InvokeMethod("Stop", null);
}
internal static void StartIIS7ApplicationPool(string name)
{
ServerManager serverManager = new ServerManager();
ApplicationPool pool = serverManager.ApplicationPools[name];
if (pool != null)
{
pool.Start();
serverManager.CommitChanges();
}
}
internal static void StopIIS7ApplicationPool(string name)
{
ServerManager serverManager = new ServerManager();
ApplicationPool pool = serverManager.ApplicationPools[name];
if (pool != null)
{
pool.Stop();
serverManager.CommitChanges();
}
}
/// <summary>
/// Ctreates application pool
/// </summary>
/// <param name="name"></param>
/// <param name="username"></param>
/// <param name="password"></param>
internal static void CreateIIS7ApplicationPool(string name, string username, string password)
{
ServerManager serverManager = new ServerManager();
ApplicationPool pool = serverManager.ApplicationPools.Add(name);
if (!String.IsNullOrEmpty(username))
{
pool.ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser;
pool.ProcessModel.UserName = username;
pool.ProcessModel.Password = password;
pool.ProcessModel.LoadUserProfile = true;
}
else
{
pool.ProcessModel.IdentityType = ProcessModelIdentityType.NetworkService;
}
pool.ManagedRuntimeVersion = "v2.0";
pool.ManagedPipelineMode = ManagedPipelineMode.Integrated;
serverManager.CommitChanges();
}
/// <summary>
/// Deletes application pool
/// </summary>
/// <param name="name"></param>
internal static void DeleteApplicationPool(string name)
{
try
{
ManagementObject objPool = wmi.GetObject(String.Format("IIsApplicationPool='W3SVC/AppPools/{0}'",
name));
objPool.Delete();
}
catch(Exception ex)
{
throw new Exception("Can't delete application pool", ex);
}
}
/// <summary>
/// Deletes application pool
/// </summary>
/// <param name="name"></param>
internal static void DeleteIIS7ApplicationPool(string name)
{
try
{
ServerManager serverManager = new ServerManager();
ApplicationPool pool = serverManager.ApplicationPools[name];
if (pool != null)
{
serverManager.ApplicationPools.Remove(pool);
serverManager.CommitChanges();
}
}
catch (Exception ex)
{
throw new Exception("Can't delete IIS 7 application pool", ex);
}
}
/// <summary>
/// Updates application pool
/// </summary>
/// <param name="name"></param>
/// <param name="username"></param>
/// <param name="password"></param>
internal static void UpdateApplicationPool(string name, string username, string password)
{
ManagementObject objPool = wmi.GetObject(String.Format("IIsApplicationPoolSetting='W3SVC/AppPools/{0}'",
name));
if (!String.IsNullOrEmpty(username))
{
// specified account
objPool.Properties["AppPoolIdentityType"].Value = 3;
objPool.Properties["WAMUserName"].Value = username;
objPool.Properties["WAMUserPass"].Value = password;
}
else
{
// NETWORK SERVICE
objPool.Properties["AppPoolIdentityType"].Value = 2;
}
objPool.Put();
}
/// <summary>
/// Updates application pool
/// </summary>
/// <param name="name"></param>
/// <param name="username"></param>
/// <param name="password"></param>
internal static void UpdateIIS7ApplicationPool(string name, string username, string password)
{
ServerManager serverManager = new ServerManager();
ApplicationPool pool = serverManager.ApplicationPools[name];
if (!String.IsNullOrEmpty(username))
{
pool.ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser;
pool.ProcessModel.UserName = username;
pool.ProcessModel.Password = password;
pool.ProcessModel.LoadUserProfile = true;
}
else
{
pool.ProcessModel.IdentityType = ProcessModelIdentityType.NetworkService;
}
serverManager.CommitChanges();
}
/// <summary>
/// Updates virtual directory application pool
/// </summary>
/// <param name="siteId"></param>
/// <param name="directoryName"></param>
/// <param name="applicationPoolName"></param>
internal static void UpdateVirtualDirectoryApplicationPool(string siteId, string directoryName, string applicationPoolName)
{
ManagementObject obj = wmi.GetObject(
String.Format("IIsWebVirtualDirSetting='{0}'", GetVirtualDirectoryPath(siteId, directoryName)));
obj.Properties["AppPoolId"].Value = applicationPoolName;
obj.Put();
}
/// <summary>
/// Returns number of sites/virtual directories in the specified application pool.
/// </summary>
/// <param name="applicationPoolName"></param>
/// <returns></returns>
internal static int GetApplicationPoolSitesCount(string applicationPoolName)
{
ManagementObjectCollection objSites = wmi.ExecuteQuery(
string.Format("SELECT * FROM IIsWebVirtualDirSetting where AppPoolId = '{0}'", applicationPoolName));
return objSites.Count;
}
/// <summary>
/// Returns number of sites/virtual directories in the specified application pool.
/// </summary>
/// <param name="applicationPoolName"></param>
/// <returns></returns>
internal static int GetIIS7ApplicationPoolSitesCount(string applicationPoolName)
{
ServerManager serverManager = new ServerManager();
int num = 0;
foreach (Site site in serverManager.Sites)
{
try
{
foreach (Application application in site.Applications)
{
if (String.Equals(application.ApplicationPoolName, applicationPoolName,
StringComparison.InvariantCultureIgnoreCase))
{
num++;
}
}
}
catch
{
continue;
}
}
return num;
}
/*internal static ServerBinding[] GetSiteBindings(string siteId)
{
// get web server settings object
ManagementObject objSite = wmi.GetObject(String.Format("IIsWebServerSetting='{0}'", siteId));
WebSiteItem site = new WebSiteItem();
FillWebSiteFromWmiObject(site, objSite);
return site.Bindings;
}*/
internal static void UpdateSiteBindings(string siteId, ServerBinding[] bindings)
{
ManagementObject objSite = wmi.GetObject(String.Format("IIsWebServerSetting='{0}'", siteId));
// update bindings
ManagementClass clsBinding = wmi.GetClass("ServerBinding");
ManagementObject[] objBinings = new ManagementObject[bindings.Length];
for (int i = 0; i < objBinings.Length; i++)
{
objBinings[i] = clsBinding.CreateInstance();
objBinings[i]["Hostname"] = bindings[i].Host;
objBinings[i]["IP"] = bindings[i].IP;
objBinings[i]["Port"] = bindings[i].Port;
}
objSite.Properties["ServerBindings"].Value = objBinings;
objSite.Put();
}
internal static void UpdateIIS7SiteBindings(string siteId, ServerBinding[] bindings)
{
ServerManager serverManager = new ServerManager();
Site webSite = serverManager.Sites[siteId];
// cleanup all bindings
webSite.Bindings.Clear();
//
foreach (ServerBinding binding in bindings)
{
//
webSite.Bindings.Add(binding.IP + ":" + binding.Port + ":" + binding.Host,
Uri.UriSchemeHttp);
}
//
serverManager.CommitChanges();
}
internal static string[] GetIPs()
{
List<string> list = new List<string>();
WmiHelper wmi = new WmiHelper("root\\cimv2");
ManagementObjectCollection collection = wmi.ExecuteQuery("SELECT IPAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True'");
foreach (ManagementObject obj in collection)
{
string[] ips = obj["IPAddress"] as string[];
if (ips != null)
{
foreach (string ip in ips)
{
if (!list.Contains(ip))
list.Add(ip);
}
}
}
return list.ToArray();
}
internal static string[] GetIPv4Addresses()
{
List<string> list = new List<string>();
WmiHelper wmi = new WmiHelper("root\\cimv2");
ManagementObjectCollection collection = wmi.ExecuteQuery("SELECT IPAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True'");
foreach (ManagementObject obj in collection)
{
string[] ips = obj["IPAddress"] as string[];
if (ips != null)
{
foreach (string ip in ips)
{
if (!list.Contains(ip) && IsValidIPv4(ip))
list.Add(ip);
}
}
}
return list.ToArray();
}
private static bool IsValidIPv4(string address)
{
return Regex.IsMatch(address, @"^(?:(?:25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)(?(?=\.?\d)\.)){4}$");
}
internal static WebExtensionStatus CheckIIS6WebExtensions()
{
WebExtensionStatus status = WebExtensionStatus.NotInstalled;
DirectoryEntry iis = new DirectoryEntry("IIS://LocalHost/W3SVC");
foreach (string propertyName in iis.Properties.PropertyNames)
{
if (propertyName.Equals("WebSvcExtRestrictionList", StringComparison.InvariantCultureIgnoreCase))
{
PropertyValueCollection valueCollection = iis.Properties[propertyName];
foreach (object objVal in valueCollection)
{
if (objVal != null && !string.IsNullOrEmpty(objVal.ToString()))
{
string strVal = objVal.ToString().ToLower();
if (strVal.Contains(@"\v2.0.50727\aspnet_isapi.dll".ToLower()))
{
if (strVal[0] == '1')
{
status = WebExtensionStatus.Allowed;
}
else if (status == WebExtensionStatus.NotInstalled)
{
status = WebExtensionStatus.Prohibited;
}
}
}
}
}
}
return status;
}
}
}