使用vs2008制作web安装包

本人想制作一个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 

 

ContractedBlock.gif ExpandedBlockStart.gif 实例代码
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
ExpandedBlockStart.gifContractedBlock.gif
{
    
public class IISClass
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ContractedSubBlock.gifExpandedSubBlockStart.gif        
UserName,Password,HostName的定义#region UserName,Password,HostName的定义
        
public static string HostName
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return hostName;
            }

            
set
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                hostName 
= value;
            }

        }

        
public static string UserName
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return userName;
            }

            
set
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                userName 
= value;
            }

        }

        
public static string Password
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return password;
            }

            
set
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (UserName.Length <= 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
throw new ArgumentException("还没有指定好用户名。请先指定用户名");
                }

                password 
= value;
            }

        }

        
public static void RemoteConfig(string hostName, string userName, string password)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            HostName 
= hostName;
            UserName 
= userName;
            Password 
= password;
        }

        
private static string hostName = "localhost";
        
private static string userName = "qf";
        
private static string password = "qinfei";
        
#endregion

ContractedSubBlock.gifExpandedSubBlockStart.gif        
根据路径构造Entry的方法#region 根据路径构造Entry的方法
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
        
/// 根据是否有用户名来判断是否是远程服务器。
        
/// 然后再构造出不同的DirectoryEntry出来
        
/// </summary>
        
/// <param name="entPath">DirectoryEntry的路径</param>
        
/// <returns>返回的是DirectoryEntry实例</returns>

        public static DirectoryEntry GetDirectoryEntry(string entPath)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            DirectoryEntry ent;
            
if (UserName == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ent 
= new DirectoryEntry(entPath);
            }

            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                ent 
= new DirectoryEntry(entPath, HostName + "\\" + UserName, Password, AuthenticationTypes.Secure);
                
//ent = new DirectoryEntry(entPath, UserName, Password, AuthenticationTypes.Secure);
            }

            
return ent;
        }

        
#endregion

ContractedSubBlock.gifExpandedSubBlockStart.gif        
添加,删除网站的方法#region 添加,删除网站的方法
        
public static void CreateNewWebSite(string hostIP, string portNum, string descOfWebSite, string commentOfWebSite, string webPath)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if (!EnsureNewSiteEnavaible(hostIP + portNum + descOfWebSite))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
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;

ContractedSubBlock.gifExpandedSubBlockStart.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


             vdEntry.CommitChanges();


ContractedSubBlock.gifExpandedSubBlockStart.gif             
增加虚拟目录aspnet_client#region 增加虚拟目录aspnet_client
             
try
ExpandedSubBlockStart.gifContractedSubBlock.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();      //更改根目录 

             }

             
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif             
{
                 
//MessageBox.Show("共享目录已存在,不进行共享操作!");

             }

             
#endregion


        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
        
/// 删除一个网站。根据网站名称删除。
        
/// </summary>
        
/// <param name="siteName">网站名称</param>

        public static void DeleteWebSiteByName(string siteName)
ExpandedSubBlockStart.gifContractedSubBlock.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.gifExpandedSubBlockStart.gif        
Start和Stop网站的方法#region Start和Stop网站的方法
        
public static void StartWebSite(string siteName)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
string siteNum = GetWebSiteNum(siteName);
            
string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
            DirectoryEntry siteEntry 
= GetDirectoryEntry(siteEntPath);
ExpandedSubBlockStart.gifContractedSubBlock.gif            siteEntry.Invoke(
"Start"new object[] { });
        }

        
public static void StopWebSite(string siteName)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
string siteNum = GetWebSiteNum(siteName);
            
string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
            DirectoryEntry siteEntry 
= GetDirectoryEntry(siteEntPath);
ExpandedSubBlockStart.gifContractedSubBlock.gif            siteEntry.Invoke(
"Stop"new object[] { });
        }

        
#endregion

ContractedSubBlock.gifExpandedSubBlockStart.gif        
确认网站是否相同#region 确认网站是否相同
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
        
/// 确定一个新的网站与现有的网站没有相同的。
        
/// 这样防止将非法的数据存放到IIS里面去
        
/// </summary>
        
/// <param name="bindStr">网站邦定信息</param>
        
/// <returns>真为可以创建,假为不可以创建</returns>

        public static bool EnsureNewSiteEnavaible(string bindStr)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
string entPath = String.Format("IIS://{0}/w3svc", HostName);
            DirectoryEntry ent 
= GetDirectoryEntry(entPath);
            
foreach (DirectoryEntry child in ent.Children)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (child.SchemaClassName == "IIsWebServer")
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
if (child.Properties["ServerBindings"].Value != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        
if (child.Properties["ServerBindings"].Value.ToString() == bindStr)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
{
                            
return false;
                        }

                    }

                }

            }

            
return true;
        }


        
#endregion

ContractedSubBlock.gifExpandedSubBlockStart.gif        
获取一个网站编号//一个输入参数为站点描述#region 获取一个网站编号//一个输入参数为站点描述
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
        
/// 输入参数为 站点的描述名 默认是站点描述为 "默认网站"
        
/// <exception cref="NotFoundWebSiteException">表示没有找到网站</exception>

        public static string GetWebSiteNum(string siteName)
ExpandedSubBlockStart.gifContractedSubBlock.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.gifContractedSubBlock.gif            
{
                
if (child.SchemaClassName == "IIsWebServer")
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
if (child.Properties["ServerBindings"].Value != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        tmpStr 
= child.Properties["ServerBindings"].Value.ToString();
                        
if (regex.Match(tmpStr).Success)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
{
                            
return child.Name;
                        }

                    }

                    
if (child.Properties["ServerComment"].Value != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        tmpStr 
= child.Properties["ServerComment"].Value.ToString();
                        
if (regex.Match(tmpStr).Success)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
{
                            
return child.Name;
                        }

                    }

                }

            }

            
throw new Exception("没有找到我们想要的站点" + siteName);
        }

        
#endregion

ContractedSubBlock.gifExpandedSubBlockStart.gif        
获取新网站id的方法#region 获取新网站id的方法
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
        
/// 获取网站系统里面可以使用的最小的ID。
        
/// 这是因为每个网站都需要有一个唯一的编号,而且这个编号越小越好。
        
/// 这里面的算法经过了测试是没有问题的。
        
/// </summary>
        
/// <returns>最小的id</returns>

        public static string GetNewWebSiteID()
ExpandedSubBlockStart.gifContractedSubBlock.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.gifContractedSubBlock.gif            
{
                
if (child.SchemaClassName == "IIsWebServer")
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    tmpStr 
= child.Name.ToString();
                    list.Add(Convert.ToInt32(tmpStr));
                }

            }

            list.Sort();
            
int i = 1;
            
foreach (int j in list)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (i == j)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    i
++;
                }

            }

            
return i.ToString();
        }

        
#endregion

        
ContractedSubBlock.gifExpandedSubBlockStart.gif        
设置目录访问权限#region 设置目录访问权限
ExpandedSubBlockStart.gifContractedSubBlock.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.gifContractedSubBlock.gif    
{
        DirectoryInfo dirinfo 
= new DirectoryInfo(pathname);
        
if ((dirinfo.Attributes & FileAttributes.ReadOnly) != 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            dirinfo.Attributes 
= FileAttributes.Normal;
        }

        
//取得访问控制列表
        DirectorySecurity dirsecurity = dirinfo.GetAccessControl();
        
try
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
switch (power)
ExpandedSubBlockStart.gifContractedSubBlock.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;

                
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)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
return e.Message.ToString();
        }


        
return "true";
    }

    
#endregion


       

    }

}

 

 

 

 

转载于:https://www.cnblogs.com/star250/archive/2009/10/30/1593252.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值