本人想制作一个asp.net网站的安装包,以便别人方便的安装使用。
看了一个网络文章,步骤不少。有写代码调试不成功,不知道不是环境问题,把我折腾了好几天。
vs2008里的web setup project可以轻松的打包asp.net网站,但是安装时只能创建虚拟目录。
我需要创建站点,修改web.config,执行sql脚本。
于是使用 setup project。
网站的方法很多,这里我就说说遇到的问题。
1,在用C#创建网站时,很多代码无效,后来终于能创建了,在win2003里创建了网站,但是没有应用程序,没有读取权限,没有使用 Windows 身份验证。网站是创建了,但是这些都没有配置好,需要C#完成。
2,在安装网站后,创建的文件夹可能没有web访问的权限,会导致本地可以访问,外网不能访问,需要C#修改文件夹权限。
参考:http://www.cnblogs.com/nerocool/archive/2008/08/13/1266733.html
实例代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
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;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace ClassLibrary
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public class IISClass
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![ContractedSubBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
UserName,Password,HostName的定义#region UserName,Password,HostName的定义
public static string HostName
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return hostName;
}
set
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
hostName = value;
}
}
public static string UserName
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return userName;
}
set
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
userName = value;
}
}
public static string Password
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return password;
}
set
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (UserName.Length <= 1)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw new ArgumentException("还没有指定好用户名。请先指定用户名");
}
password = value;
}
}
public static void RemoteConfig(string hostName, string userName, string password)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
HostName = hostName;
UserName = userName;
Password = password;
}
private static string hostName = "localhost";
private static string userName = "qf";
private static string password = "qinfei";
#endregion
![ContractedSubBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
根据路径构造Entry的方法#region 根据路径构造Entry的方法
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 根据是否有用户名来判断是否是远程服务器。
/// 然后再构造出不同的DirectoryEntry出来
/// </summary>
/// <param name="entPath">DirectoryEntry的路径</param>
/// <returns>返回的是DirectoryEntry实例</returns>
public static DirectoryEntry GetDirectoryEntry(string entPath)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
DirectoryEntry ent;
if (UserName == null)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ent = new DirectoryEntry(entPath);
}
else
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ent = new DirectoryEntry(entPath, HostName + "\\" + UserName, Password, AuthenticationTypes.Secure);
//ent = new DirectoryEntry(entPath, UserName, Password, AuthenticationTypes.Secure);
}
return ent;
}
#endregion
![ContractedSubBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
添加,删除网站的方法#region 添加,删除网站的方法
public static void CreateNewWebSite(string hostIP, string portNum, string descOfWebSite, string commentOfWebSite, string webPath)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (!EnsureNewSiteEnavaible(hostIP + portNum + descOfWebSite))
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
throw new ArgumentNullException("已经有了这样的网站了。" + Environment.NewLine + hostIP + portNum + descOfWebSite);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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 ;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
DirectoryEntry vdEntry = newSiteEntry.Children.Add("root", "IIsWebVirtualDir");
vdEntry.CommitChanges();
vdEntry.Properties["Path"].Value = webPath;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![ContractedSubBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
增加站点的应用程序设置#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
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
vdEntry.CommitChanges();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![ContractedSubBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
增加虚拟目录aspnet_client#region 增加虚拟目录aspnet_client
try
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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(); //更改根目录
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
catch
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//MessageBox.Show("共享目录已存在,不进行共享操作!");
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
#endregion
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 删除一个网站。根据网站名称删除。
/// </summary>
/// <param name="siteName">网站名称</param>
public static void DeleteWebSiteByName(string siteName)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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
![ContractedSubBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
Start和Stop网站的方法#region Start和Stop网站的方法
public static void StartWebSite(string siteName)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string siteNum = GetWebSiteNum(siteName);
string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
siteEntry.Invoke("Start", new object[]
{ });
}
public static void StopWebSite(string siteName)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string siteNum = GetWebSiteNum(siteName);
string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
siteEntry.Invoke("Stop", new object[]
{ });
}
#endregion
![ContractedSubBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
确认网站是否相同#region 确认网站是否相同
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 确定一个新的网站与现有的网站没有相同的。
/// 这样防止将非法的数据存放到IIS里面去
/// </summary>
/// <param name="bindStr">网站邦定信息</param>
/// <returns>真为可以创建,假为不可以创建</returns>
public static bool EnsureNewSiteEnavaible(string bindStr)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string entPath = String.Format("IIS://{0}/w3svc", HostName);
DirectoryEntry ent = GetDirectoryEntry(entPath);
foreach (DirectoryEntry child in ent.Children)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (child.SchemaClassName == "IIsWebServer")
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (child.Properties["ServerBindings"].Value != null)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (child.Properties["ServerBindings"].Value.ToString() == bindStr)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return false;
}
}
}
}
return true;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
#endregion
![ContractedSubBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
获取一个网站编号//一个输入参数为站点描述#region 获取一个网站编号//一个输入参数为站点描述
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 输入参数为 站点的描述名 默认是站点描述为 "默认网站"
/// <exception cref="NotFoundWebSiteException">表示没有找到网站</exception>
public static string GetWebSiteNum(string siteName)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Regex regex = new Regex(siteName);
string tmpStr;
string entPath = String.Format("IIS://{0}/w3svc", HostName);
DirectoryEntry ent = GetDirectoryEntry(entPath);
foreach (DirectoryEntry child in ent.Children)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (child.SchemaClassName == "IIsWebServer")
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (child.Properties["ServerBindings"].Value != null)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
tmpStr = child.Properties["ServerBindings"].Value.ToString();
if (regex.Match(tmpStr).Success)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return child.Name;
}
}
if (child.Properties["ServerComment"].Value != null)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
tmpStr = child.Properties["ServerComment"].Value.ToString();
if (regex.Match(tmpStr).Success)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return child.Name;
}
}
}
}
throw new Exception("没有找到我们想要的站点" + siteName);
}
#endregion
![ContractedSubBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
获取新网站id的方法#region 获取新网站id的方法
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 获取网站系统里面可以使用的最小的ID。
/// 这是因为每个网站都需要有一个唯一的编号,而且这个编号越小越好。
/// 这里面的算法经过了测试是没有问题的。
/// </summary>
/// <returns>最小的id</returns>
public static string GetNewWebSiteID()
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ArrayList list = new ArrayList();
string tmpStr;
string entPath = String.Format("IIS://{0}/w3svc", HostName);
DirectoryEntry ent = GetDirectoryEntry(entPath);
foreach (DirectoryEntry child in ent.Children)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (child.SchemaClassName == "IIsWebServer")
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
tmpStr = child.Name.ToString();
list.Add(Convert.ToInt32(tmpStr));
}
}
list.Sort();
int i = 1;
foreach (int j in list)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (i == j)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
i++;
}
}
return i.ToString();
}
#endregion
![ContractedSubBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
设置目录访问权限#region 设置目录访问权限
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**///// <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)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
DirectoryInfo dirinfo = new DirectoryInfo(pathname);
if ((dirinfo.Attributes & FileAttributes.ReadOnly) != 0)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
dirinfo.Attributes = FileAttributes.Normal;
}
//取得访问控制列表
DirectorySecurity dirsecurity = dirinfo.GetAccessControl();
try
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
switch (power)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
case "ReadAndExecute": //读取和运行
dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.ReadAndExecute, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow));
dirinfo.SetAccessControl(dirsecurity);
break;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
dirsecurity.AddAccessRule(new FileSystemAccessRule("Everyone",FileSystemRights.ReadAndExecute,AccessControlType.Allow));
dirinfo.SetAccessControl(dirsecurity);
}
catch (Exception e)
![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return e.Message.ToString();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return "true";
}
#endregion
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
}