在上一篇的Asp.net网站的ClickOnce自动部署(2)-虚拟目录的配置 里面,我介绍了如何通过封装iisvdir.vbs的调用来实现iis虚拟目录的配置,今天继续介绍如何使用System.DirectoryServices.DirectoryEntry来实现iis虚拟目录的管理,供初学者参考。相对于调用iisvdir.vbs的脚本,后者可以设定虚拟目录的更多属性,如身份验证方式、默认文档等,还可以进行更有力的异常处理。IIS虚拟目录的属性可以参考MSDN IIsWebVirtualDir。

主要内容:
1、介绍System.DirectoryServices.DirectoryEntry
2、如何使用DirectoryEntry来进行虚拟目录的管理

本文相关代码可以从/Files/chwkai/CreateIIsDirectory.rar下载。


介绍System.DirectoryServices.DirectoryEntry
虽然在MSDN中的说法是"封装 Active Directory 层次结构中的节点或对象",但是通过DirectoryEntry,我们可以连接ActiveDirectory服务器来获取AD上的信息,用来连接WindowNT服务器来管理服务器上的用户,甚至还可以用来管理IIS。

1)连接ActiveDirectory服务器:

// 获取AD服务器foo.com的连接
DirectoryEntry entry = new DirectoryEntry("LDAP://foo.com/DC=foo, DC=com", user, password);

2)连接WinNT服务器:

// 获取NT服务器foo的连接
DirecotryEntry entry = new DirectoryEntry("WinNT://foo", user, password);

3)连接IIS服务器
获取本机的“默认网站”的节点对象:

1 // 获取本机的“默认网站”的节点对象
2  DirectoryEntry entry = new DirectoryEntry("IIS://localhost/w3svc/1/ROOT");

获取服务器foo上的“默认网站”的节点对象:

DirectoryEntry entry = new DirectoryEntry("IIS://foo/w3svc/1/ROOT", user, password);

通过DirectoryEntry,我们可以很方便的管理这些服务器上的节点。


如何使用DirectoryEntry来实现IIS虚拟目录的管理

1、创建虚拟目录:
创建虚拟目录的经过以下步骤:
1)获取该虚拟目录的上级目录的DirectoryEntry对象rootEntry;
2)通过rootEntry的DirectoryEntry::Childrens.Add来添加该虚拟目录;

// 创建虚拟目录
                DirectoryEntry entry = rootEntry.Children.Add(this.m_strAlias, "IIsWebVirtualDir");

3)更新该虚拟目录的属性,如更新身份验证模式,访问权限和所对应的物理目录等。需要注意的是,使用DirectoryEntry来创建虚拟目录,只能在该虚拟目录建立了以后,才能设置物理目录等属性。

创建虚拟目录的代码如下:

 1 /// <summary>
 2         /// 创建iis虚拟目录
 3         /// </summary>
 4         /// <exception cref="CreateIIsDirectory.DirectoryException">虚拟目录操作异常</exception>
 5          public override void CreateDirectory()
 6         {
 7             // 已不覆盖的方式创建虚拟目录,当虚拟目录存在时抛出异常
 8             this.CreateDirectory(false);
 9         }
10 
11         /// <summary>
12         /// 创建iis虚拟目录
13         /// </summary>
14         /// <param name="bReplace">是否覆盖掉原有的虚拟目录</param>
15         /// <exception cref="CreateIIsDirectory.DirectoryException">虚拟目录操作异常</exception>
16         public override void CreateDirectory(bool bReplace)
17         {
18             // 判断目录是否存在
19             if (this.Exist())
20             {
21                 if (bReplace)
22                 {
23                     // 若允许覆盖则先删除原有的虚拟目录
24                     this.DeleteDirectory();
25                 }
26                 else
27                 {
28                     // 若不允许覆盖直接抛出目录已存在的异常
29                     DirectoryException.Throw("directory already exist");
30                 }
31             }
32 
33             try
34             {
35                 // 获取上级目录的DirectoryEntry对象
36                 DirectoryEntry rootEntry = SystemDirectory.GetParentEntry(this);
37                 // 创建虚拟目录
38                 DirectoryEntry entry = rootEntry.Children.Add(this.m_strAlias, "IIsWebVirtualDir");
39                 entry.Invoke("AppCreate", true);
40                 entry.CommitChanges();
41                 rootEntry.CommitChanges();
42 
43                 // 更新虚拟目录属性
44                 SystemDirectory.UpdateEntry(entry, this.Property);
45             }
46             catch (System.Exception ex)
47             {
48                 DirectoryException.Throw(ex.Message);
49             }
50         }

DirectoryEntry的commitChanges方法用于提交DirectoryEntry的操作。line41中的提交了以后,该虚拟目录才能建立,然后在进行更新虚拟目录的属性的操作。若没有commitChanges就进行更新操作,会抛出找不到虚拟目录的异常,有兴趣的朋友可以试试。

2、删除虚拟目录:
删除虚拟目录比较简单,只需调用虚拟目录的父节点的DirectoryEntry对象的Delete操作就可以了,需要注意的是Delete对象需要两个参数:子节点的Alias和子节点的类型(虚拟目录节点的类型为IIsWebVirtualDir)。

 1 /// <summary>
 2         /// 删除iis虚拟目录
 3         /// </summary>
 4         /// <exception cref="CreateIIsDirectory.DirectoryException">虚拟目录操作异常</exception>
 5         public override void DeleteDirectory()
 6         {
 7             // 判断目录是否存在
 8             if (! this.Exist())
 9             {
10                 // 若待删除的虚拟目录不存在,则抛出异常
11                 DirectoryException.Throw("directory does not exist");
12             }
13 
14             try
15             {
16                 // 获取上级目录的DirectoryEntry对象
17                 DirectoryEntry rootEntry = SystemDirectory.GetParentEntry(this);
18                 // 删除参数
19                 object[] objParams = new object[2];;
20                 objParams[0] = "IIsWebVirtualDir";
21                 objParams[1] = this.m_strAlias;
22                 // 删除虚拟目录
23                 rootEntry.Invoke("Delete", objParams);
24                 rootEntry.CommitChanges();
25             }
26             catch (System.Exception ex)
27             {
28                 DirectoryException.Throw(ex.Message);
29             }
30             
31         }

3、判断虚拟目录是否存在:
通过调用父节点的DirectoryEntry对象的DirectoryEntry::Children.Find来查找子结点是否存在,但非常奇怪的当子节点不存在的时候会抛出异常,我更期望的是返回子节点的null引用。

 1 /// <summary>
 2         /// 判断iis虚拟目录是否存在
 3         /// </summary>
 4         /// <returns>目录是否存在</returns>
 5         public override bool Exist()
 6         {
 7             bool bExist = false;
 8             
 9             try
10             {
11                 DirectoryEntry rootEntry = SystemDirectory.GetParentEntry(this);
12                 DirectoryEntry entry = rootEntry.Children.Find(this.Alias, "IIsWebVirtualDir");
13                 bExist = (entry != null);
14             }
15             catch{}
16 
17             return bExist;
18         }

好了,现在Asp.net网站ClickOnce自动部署的第一个问题就解决了。自动部署程序只要把安装目标目录中asp.net网站对应的文件夹设定为虚拟目录就可以了。

下一篇文章将介绍如何实现sqlserver数据库的自动部署,解决数据库的异地安装问题,并且还会简单介绍如何通过SQLDMO和bcp等工具实现sqlserver数据库的备份和恢复,数据库数据导入和导出。

^_^,最近有点晕,web2.0 、 搜索引擎、代码生成器和内容管理都在搞,过段时间打算写一个如何编写C#代码生成器的的专题,基于o/r mapping和asp.net 2.0的,不知道朋友们是否会喜欢。

Asp.net网站的ClickOnce自动部署(3)-虚拟目录的配置相关推荐

  1. Asp.net网站的ClickOnce自动部署(2)-虚拟目录的配置

    第一步先讲虚拟目录的配置,虚拟目录的配置简单来说就是创建虚拟目录.用手工的方式实现非常简单,直接设定"Web sharing"就可以了,让我们看看怎么通过编程的方式实现,本文将介绍 ...

  2. 编译ASP.NET网站项目,以及部署网站到本地localhost服务器上实现独立运行

    1.准备步骤 操作系统:windows 10 IDE:visual studio 2017 我们创建了一个网站项目后,"解决方案资源管理器"中能看到我们编写好的项目文件 准备好源文 ...

  3. Macbook 本机 apache 虚拟主机和网站,多域名、多虚拟目录,并且允许列举所有文件和目录...

    20190613 很久不再使用 apache 服务器,最近试试我的本机上的 apache2,发现又不能用了! 我希望在本机调试 php 程序,所以需要 apache 支持 php 为了调试方便,我需要 ...

  4. 在iis服务上发布asp.net网站操作步骤,以及iis注册以及简单配置

    发布网站: 1.在控制面板->管理工具->(双击)Internet 信息服务(IIS)管理器,得到: 2.倘若在管理工具中没有找到Internet 信息服务(IIS)管理器,则控制面板-& ...

  5. 前后端分离WebStorm自动部署到tomcat服务器

    打开"设置"对话框, 在Build, Execution, Deployment下面的Deployment新增Deployment, 如下图所示 配置connections 配置M ...

  6. Windows Server 2008 IIS7.0 发布html和Asp.net网站

    第一步:安装并配置IIS 7.0 先要设置应用程序池(ApplicationPool)为Classic.NETAppPool,而不是默认的DefaultAppPool.可以设置.net FrameWo ...

  7. dsy76-OpenStack之自动部署

    OpenStack自动部署 学习目标 能够了解OpenStack是什么 能够掌握OpenStack核心组件 能够掌握OpenStack组件项目及其功能 能够掌握OpenStack自动部署方法 能够掌握 ...

  8. asp.net 获得域名,端口,虚拟目录[转]

    asp.net 获得域名,端口,虚拟目录 记性不好,好多次都被路径问题给拦住了.我现在想得到一个资源的全URL路径,因此首先想得到网站当前的域名,端口和虚拟目录.看下表 底下這張表就是各種跟 Brow ...

  9. 将远程计算机上的文件夹,如何将现有网站上虚拟目录创建到驻留在远程计算机上的文件夹...

    如何将现有网站上虚拟目录创建到驻留在远程计算机上的文件夹 09/27/2020 本文内容 本文介绍如何将现有网站上虚拟目录创建.测试和删除到驻留在远程计算机上的文件夹. 适用于:  Windows S ...

最新文章

  1. 关于 element 的 backToTop
  2. 攻防世界php2_攻防世界-php2
  3. 富人为什么会富,穷人为什么穷?看完你就懂
  4. 7-26 Windows消息队列 (25 分)(详解+思路+超时解决)
  5. 企业微信H5_网页jssdk调用 config和agentconfig的区别
  6. html有3d效果的网页,HTML5如何在网页中实现3D效果?
  7. (转)Spring Boot (十三): Spring Boot 小技巧
  8. 【java】判断某段字符串的编码方式,并按照新的编码方式输出
  9. 哈希表中处理冲突的方法
  10. lae界面开发工具入门之介绍三--布局篇
  11. 使用telnet发送email(内嵌图片,附件)
  12. 白城师范学院计算机系鲍金玲,企业绩效考核方法的比较与借鉴.pdf
  13. Android一些控件上显示的英文字母都被转为大写字母的原因分析及问题解决
  14. 到底该如何书写概要设计说明书
  15. SQliteCipher 数据库加密实践
  16. matlab 产生高斯噪声和高斯白噪声方法
  17. linux需要GPT初始化磁盘吗,PVE里面使用GPT初始化磁盘选项为灰色的解决办法
  18. trace方法引起的xss漏洞
  19. log4j日志文件乱码问题的解决方法
  20. python多线程好还是多协程好_深入浅析python中的多进程、多线程、协程

热门文章

  1. matlabapp窗口图像_如何在一个matlab窗口上合并两个图像?
  2. MySQL(二):MySQL性能优化
  3. 智能一代云平台(二十四):已安装的Nginx上安装echo插件
  4. 海外同行首次大规模声援996.ICU,微软和GitHub员工签署联名信,一夜4700星
  5. 景驰无人车披露最新技术进展,2年后开启国内规模化运营 | 视频
  6. 王炸!Waymo正式官宣无人车出行平台,瑟瑟发抖的不止Uber
  7. 又一例两块硬盘离线的数据恢复成功案例
  8. GEF入门实例_总结_04_Eclipse插件启动流程分析
  9. MaxCompute Studio使用心得系列3——可视化分析作业运行
  10. android之AlarmManager 全局定时器