标签:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;
using System.Collections;
using System.Text.RegularExpressions;
using System.IO;
using System.Security.AccessControl;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Data;
namespace ClassLibrary
{
public class IISClass
{
#region UserName,Password,HostName的定义
public static string HostName
{
get
{
return hostName;
}
set
{
hostName = value;
}
}
public static string UserName
{
get
{
return userName;
}
set
{
userName = value;
}
}
public static string Password
{
get
{
return password;
}
set
{
if (UserName.Length <= 1)
{
throw new ArgumentException("还没有指定好用户名。请先指定用户名");
}
password = value;
}
}
public static void RemoteConfig(string hostName, string userName, string password)
{
HostName = hostName;
UserName = userName;
Password = password;
}
private static string hostName = "localhost";
private static string userName = "qf";
private static string password = "qinfei";
#endregion
#region 根据路径构造Entry的方法
/// <summary>
/// 根据是否有用户名来判断是否是远程服务器。
/// 然后再构造出不同的DirectoryEntry出来
/// </summary>
/// <param name="entPath">DirectoryEntry的路径</param>
/// <returns>返回的是DirectoryEntry实例</returns>
public static DirectoryEntry GetDirectoryEntry(string entPath)
{
DirectoryEntry ent;
if (UserName == null)
{
ent = new DirectoryEntry(entPath);
}
else
{
ent = new DirectoryEntry(entPath, HostName + "\\" + UserName, Password, AuthenticationTypes.Secure);
//ent = new DirectoryEntry(entPath, UserName, Password, AuthenticationTypes.Secure);
}
return ent;
}
#endregion
#region 添加,删除网站的方法
public static void CreateNewWebSite(string hostIP, string portNum, string descOfWebSite, string commentOfWebSite, string webPath)
{
if (!EnsureNewSiteEnavaible(hostIP + portNum + descOfWebSite))
{
throw new ArgumentNullException("已经有了这样的网站了。" + Environment.NewLine + hostIP + portNum + descOfWebSite);
}
string entPath = String.Format("IIS://{0}/w3svc", HostName);
DirectoryEntry rootEntry = GetDirectoryEntry(entPath);//取得iis路径
string newSiteNum = GetNewWebSiteID(); //取得新网站ID
DirectoryEntry newSiteEntry = rootEntry.Children.Add(newSiteNum, "IIsWebServer"); //增加站点
newSiteEntry.CommitChanges();//保存对区域的更改(这里对站点的更改)
newSiteEntry.Properties["ServerBindings"].Add(":"+portNum+":"); //(hostIP + portNum + descOfWebSite);
newSiteEntry.Properties["ServerComment"].Value= commentOfWebSite ;
newSiteEntry.Properties["AccessRead"].Add(true); //增加 读取权限
// newSiteEntry.Properties["AppFriendlyName"].Add("DefaultAppPool");
// System.DirectoryServices.DirectoryEntry appPoolRoot = new System.DirectoryServices.DirectoryEntry(@"IIS://" + HostName + "/W3SVC/AppPools");
// newSiteEntry.Properties["ApplicationProtection"].Value="vsdapMedium";
newSiteEntry.Properties["DefaultDoc"][0] = "Default.aspx";
//默认文档
newSiteEntry.Properties["AuthNTLM"][0] = true; // 指定集成 Windows 身份验证
newSiteEntry.CommitChanges();
DirectoryEntry vdEntry = newSiteEntry.Children.Add("root", "IIsWebVirtualDir");
vdEntry.CommitChanges();
vdEntry.Properties["Path"].Value = webPath;
#region 增加站点的应用程序设置
vdEntry.Invoke("AppCreate", true);
vdEntry.Properties["AppFriendlyName"].Value = commentOfWebSite;// 友好的显示名称
vdEntry.Properties["AppIsolated"].Value = 2; // 值 0 表示应用程序在进程内运行,值 1 表示进程外,值 2 表示进程池
vdEntry.Properties["AccessScript"][0] = true;
// 可执行脚本。执行权限下拉菜单中
vdEntry.Properties["AuthNTLM"][0] = true; // 指定集成 Windows 身份验证
#endregion
vdEntry.CommitChanges();
#region 增加虚拟目录aspnet_client
try
{
DirectoryEntry _RootFolder = new DirectoryEntry("IIS://" + HostName + "/W3SVC/" + newSiteNum + "/Root");
DirectoryEntry _VirDir = _RootFolder.Children.Add("aspnet_client", "IIsWebVirtualDir");
_VirDir.Properties["Path"].Value = @"C:\Inetpub\wwwroot\aspnet_client"; //webPath; //设置路径
_VirDir.Invoke("AppCreate", true);
//设置名称
_VirDir.Properties["AppFriendlyName"].Value = "aspnet_client";
_VirDir.Properties["AppIsolated"].Value = 2;
_VirDir.Properties["AccessScript"][0] = true; // 可执行脚本。执行权限下拉菜单中
_VirDir.CommitChanges();//更改目录
_RootFolder.CommitChanges(); //更改根目录
}
catch
{
//MessageBox.Show("共享目录已存在,不进行共享操作!");
}
#endregion
}
/// <summary>
/// 删除一个网站。根据网站名称删除。
/// </summary>
/// <param name="siteName">网站名称</param>
public static void DeleteWebSiteByName(string siteName)
{
string siteNum = GetWebSiteNum(siteName);
string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
string rootPath = String.Format("IIS://{0}/w3svc", HostName);
DirectoryEntry rootEntry = GetDirectoryEntry(rootPath);
rootEntry.Children.Remove(siteEntry);
rootEntry.CommitChanges(); }
#endregion
#region 确认网站是否相同
/// <summary>
/// 确定一个新的网站与现有的网站没有相同的。
/// 这样防止将非法的数据存放到IIS里面去
/// </summary>
/// <param name="bindStr">网站邦定信息</param>
/// <returns>真为可以创建,假为不可以创建</returns>
public static bool EnsureNewSiteEnavaible(string bindStr)
{
string entPath = String.Format("IIS://{0}/w3svc", HostName);
DirectoryEntry ent = GetDirectoryEntry(entPath);
foreach (DirectoryEntry child in ent.Children)
{
if (child.SchemaClassName == "IIsWebServer")
{
if (child.Properties["ServerBindings"].Value != null)
{
if (child.Properties["ServerBindings"].Value.ToString() == bindStr)
{
return false;
}
}
}
}
return true;
}
#endregion
#region 获取新网站id的方法
/// <summary>
/// 获取网站系统里面可以使用的最小的ID。
/// 这是因为每个网站都需要有一个唯一的编号,而且这个编号越小越好。
/// 这里面的算法经过了测试是没有问题的。
/// </summary>
/// <returns>最小的id</returns>
public static string GetNewWebSiteID()
{
ArrayList list = new ArrayList();
string tmpStr;
string entPath = String.Format("IIS://{0}/w3svc", HostName);
DirectoryEntry ent = GetDirectoryEntry(entPath);
foreach (DirectoryEntry child in ent.Children)
{
if (child.SchemaClassName == "IIsWebServer")
{
tmpStr = child.Name.ToString();
list.Add(Convert.ToInt32(tmpStr));
}
}
list.Sort();
int i = 1; foreach (int j in list) { if (i == j) { i++; } } return i.ToString(); } #endregion #region 设置目录访问权限 //// <summary> /// 为创建的临时文件分配权限 /// </summary> /// <param name="pathname"></param> /// <param name="username"></param> /// <param name="power"> </param> /// <remarks> 用法: addpathPower("指定目录路径", "Everyone", "FullControl"); //Everyone表示用户名 //FullControl为权限类型</remarks> public string addpathPower(string pathname, string username, string power) { DirectoryInfo dirinfo = new DirectoryInfo(pathname); if ((dirinfo.Attributes & FileAttributes.ReadOnly) != 0) { dirinfo.Attributes = FileAttributes.Normal; } //取得访问控制列表 DirectorySecurity dirsecurity = dirinfo.GetAccessControl(); try { switch (power) { case "FullControl": dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow)); dirinfo.SetAccessControl(dirsecurity); break; case "ReadOnly": dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.Read, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow)); dirinfo.SetAccessControl(dirsecurity); break; case "Write": dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.Write, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow)); dirinfo.SetAccessControl(dirsecurity); break; case "Modify": dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.Modify, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow)); dirinfo.SetAccessControl(dirsecurity); break; case "ReadAndExecute": //读取和运行 dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.ReadAndExecute, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow)); dirinfo.SetAccessControl(dirsecurity); break; } dirsecurity.AddAccessRule(new FileSystemAccessRule("Everyone",FileSystemRights.ReadAndExecute,AccessControlType.Allow)); dirinfo.SetAccessControl(dirsecurity); } catch (Exception e) { return e.Message.ToString(); } return "true"; } #endregion }}
标签:
原文地址:http://www.cnblogs.com/mr-lee1976/p/4746740.html