using System.Collections.Generic;
using System.Text;
using System.DirectoryServices;
using System.Collections;
namespace SetupClassLibrary
{
public class WebHelper
{
static DirectoryEntry iisDE = new DirectoryEntry("IIS://localhost/W3SVC");
///<summary>
/// Get The Location IIS WebServers Information
///</summary>
///<returns></returns>
public static Hashtable GetLocationIIsWebServers()
{
Hashtable result = new Hashtable();
GetWebSiteInfo(ref result);
return result;
}
///<summary>
/// Create a new IIS Webserver
///</summary>
///<param name="webServerName">webserver name</param>
///<param name="path">webserver directory path</param>
///<param name="port">access port</param>
public static void CreateNewIIsWebServer(string webServerName, string path, int port)
{
int siteID = GetWebSiteInfo(port);
using (DirectoryEntry site = (DirectoryEntry)iisDE.Invoke("Create", "IIsWebServer", siteID))
{
site.Invoke("Put", "ServerComment", webServerName);
site.Invoke("Put", "KeyType", "IIsWebServer");
site.Invoke("Put", "ServerBindings", ":" + port.ToString() + ":");//第一个分号前面可以加ip地址。第二个分号后面可以添加主机头例如www.oa.com之类的网站名称
site.Invoke("Put", "ServerState", 2);
site.Invoke("Put", "FrontPageWeb", 1);
site.Invoke("Put", "DefaultDoc", "index.aspx");
site.Invoke("Put", "SecureBindings", ":443:");
site.Invoke("Put", "ServerAutoStart", 1);
site.Invoke("Put", "ServerSize", 1);
site.Invoke("SetInfo");
using (DirectoryEntry siteVDir = site.Children.Add("Root", "IISWebVirtualDir"))
{
siteVDir.Properties["AppIsolated"][0] = 2;
siteVDir.Properties["Path"][0] = path;
siteVDir.Properties["AccessFlags"][0] = 513;
siteVDir.Properties["FrontPageWeb"][0] = 1;
siteVDir.Properties["AppFriendlyName"][0] = webServerName;
siteVDir.Properties["EnableDirBrowsing"][0] = false;
siteVDir.Properties["AccessRead"][0] = true;
siteVDir.Properties["AccessExecute"][0] = true;
siteVDir.Properties["AccessWrite"][0] = false;
siteVDir.Properties["AccessScript"][0] = true;//设置脚本访问
siteVDir.Properties["DefaultDoc"][0] = "MyLogin.aspx";设置主目录
siteVDir.Invoke("AppCreate", true);
siteVDir.CommitChanges();
//启动aspnet_iis.exe程序 使网站是net2.0的网站
string fileName = Environment.GetEnvironmentVariable("windir") + @"/Microsoft.NET/Framework/v2.0.50727/aspnet_regiis.exe";
ProcessStartInfo startInfo = new ProcessStartInfo(fileName);
//处理目录路径
string path2 = siteVDir.Path.ToUpper();
int index = path2.IndexOf("W3SVC");
path2 = path2.Remove(0, index);
//启动aspnet_iis.exe程序,刷新教本映射
startInfo.Arguments = "-s " + path2;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
Process process = new Process();
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();
string errors = process.StandardError.ReadToEnd();
if (errors != string.Empty)
throw new Exception(errors);
Console.WriteLine(process.StandardOutput.ReadToEnd()); }
site.CommitChanges();
}
}
///<summary>
/// Create a new virtual directory
///</summary>
///<param name="website">webserver name</param>
///<param name="dirName">virtual directory name</param>
///<param name="properties">virtual dirctory properties</param>
public static void CreateNewVirtualDir(string website, string dirName, System.Data.PropertyCollection properties)
{
if (GetVirtualDir(website, dirName)) throw new Exception(" The Virtual Dir is alread existed");
using (DirectoryEntry de = GetWebSiteInfo(website))
{
using (DirectoryEntry vde = de.Children.Add(dirName, "IIsWebVirtualDir"))
{
vde.CommitChanges();
de.CommitChanges();
UpdateVDirInfo(vde, ref properties);
vde.Invoke("AppCreate", true);
vde.CommitChanges();
de.CommitChanges();
}
}
}
///<summary>
/// Get Common virtual directory setting
///</summary>
///<param name="path">virtual directory path</param>
///<param name="vdir">virtual directory name</param>
///<returns></returns>
public static System.Data.PropertyCollection GetDefaultVirtualDirSetting(string path, string vdir)
{
System.Data.PropertyCollection vProperty = new System.Data.PropertyCollection();
//vProperty.Add("AnonymousUserName","");
//vProperty.Add("AnonymousUserPass","");
vProperty.Add("AccessRead", true);
vProperty.Add("AccessExecute", false);
vProperty.Add("AuthBasic", true);
vProperty.Add("AuthNTLM", true);
vProperty.Add("ContentIndexed", true);
vProperty.Add("EnableDefaultDoc", true);
vProperty.Add("EnableDirBrowsing", false);
vProperty.Add("AccessSSL", false);
vProperty.Add("AccessScript", false);
vProperty.Add("DefaultDoc", "index.aspx");
vProperty.Add("Path", path);
vProperty.Add("AppIsolated", 2);
vProperty.Add("AppFriendlyName", vdir);
vProperty.Add("AccessFlags", 513);
vProperty.Add("FrontPageWeb", 1);
//vProperty.Add("DontLog", true);
//vProperty.Add("AppRoot", "LM/W3SVC/" + siteID + "/" + vdir);
return vProperty;
}
///<summary>
/// Delete the virtual directory in the WebServer
///</summary>
///<param name="website">webserver name</param>
///<param name="vdir">virtual directory name</param>
public static void DeleteVirtualDir(string website, string vdir)
{
if (!GetVirtualDir(website, vdir)) throw new Exception(" The virtual directory don't exist in the website");
using (DirectoryEntry de = GetWebSiteInfo(website))
{
foreach (DirectoryEntry sub in de.Children)
{
if (sub.Name == vdir)
{
de.Invoke("Delete", new string[] { sub.SchemaClassName, vdir });
de.CommitChanges();
}
}
}
}
private static void UpdateVDirInfo(DirectoryEntry newDE, ref System.Data.PropertyCollection properties)
{
//newDE.Properties["AnonyMousUserName"][0] = properties["AnonymousUserName"].ToString();
//newDE.Properties["AnonymousUserPass"][0] = properties["AnonymousUserPass"].ToString();
newDE.Properties["AccessRead"][0] = (bool)properties["AccessRead"];
newDE.Properties["AccessExecute"][0] = (bool)properties["AccessExecute"];
newDE.Properties["AuthBasic"][0] = (bool)properties["AuthBasic"];
newDE.Properties["AuthNTLM"][0] = (bool)properties["AuthNTLM"];
newDE.Properties["ContentIndexed"][0] = (bool)properties["ContentIndexed"];
newDE.Properties["EnableDefaultDoc"][0] = (bool)properties["EnableDefaultDoc"];
newDE.Properties["EnableDirBrowsing"][0] = (bool)properties["EnableDirBrowsing"];
newDE.Properties["AccessSSL"][0] = (bool)properties["AccessSSL"];
newDE.Properties["AccessScript"][0] = (bool)properties["AccessScript"];
newDE.Properties["DefaultDoc"][0] = properties["DefaultDoc"].ToString();
newDE.Properties["Path"][0] = properties["Path"].ToString();
newDE.Properties["AppIsolated"][0] = (int)properties["AppIsolated"];
newDE.Properties["AppFriendlyName"][0] = properties["AppFriendlyName"].ToString();
newDE.Properties["AccessFlags"][0] = (int)properties["AccessFlags"];
newDE.Properties["FrontPageWeb"][0] = (int)properties["FrontPageWeb"];
//newDE.Properties["DontLog"][0] = (bool)properties["DontLog"];
//newDE.Properties["AppRoot"][0] = properties["AppRoot"].ToString();
}
private static bool GetVirtualDir(string webSite, string dirName)
{
bool result = false;
using (DirectoryEntry de = GetWebSiteInfo(webSite))
{
if (de != null)
{
foreach (DirectoryEntry subVD in de.Children)
{
if (subVD.SchemaClassName == "IIsWebVirtualDir" && subVD.Name == dirName)
{
result = true;
break;
}
}
}
}
return result;
}
private static void GetWebSiteInfo(ref Hashtable webServer)
{
DirectoryEntries des = iisDE.Children;
foreach (DirectoryEntry subDE in des)
{
if (subDE.SchemaClassName == "IIsWebServer")
{
webServer.Add(subDE.Properties["ServerComment"].Value.ToString(), subDE.Name);
}
}
des = null;
}
private static DirectoryEntry GetWebSiteInfo(string website)
{
DirectoryEntry result = null;
DirectoryEntries des = iisDE.Children;
foreach (DirectoryEntry subDE in des)
{
if (subDE.SchemaClassName == "IIsWebServer" && subDE.Properties["ServerComment"].Value.ToString() == website)
{
result = subDE.Children.Find("Root", "IIsWebVirtualDir");
break;
}
}
des = null;
return result;
}
private static int GetWebSiteInfo(int port)
{
int result = 1, i = 1;
DirectoryEntries des = iisDE.Children;
foreach (DirectoryEntry subDE in des)
{
if (subDE.SchemaClassName == "IIsWebServer")
{
if ((i = Convert.ToInt32(subDE.Name)) >= result)
{
result = i + 1;
}
if (subDE.Properties["ServerBindings"][0].ToString() == ":" + port.ToString() + ":")
{
throw new Exception(" The port is already used");
}
}
}
des = null;
return result;
}
}
}