以编程方式管理 IIS
通过 C# 和目录服务以编程方式管理 IIS 的基础库。
引言
本文讨论以编程方式管理 IIS。它提供了一个类库,该库表示 IIS 用于其各个方面的树形层次结构。该项目附带了一个 Windows 窗体应用程序,用于精确定位和提取任何所需数据。
背景
对我工作的公司来说,我们有几个应用程序,其中两个是 N 层应用程序,需要智能客户端、应用程序服务器和单个或多个数据库。我们将产品部署到现有客户那里很困难,需要数据库架构升级和网站重启。此外,创建新环境需要参数化。因此,为了创建部署和环境应用程序,需要 IIS 管理方面的专业知识。
在网上搜索后,我找到了一些方法,但没有一种能够为该问题提供面向对象的解决方案。此外,关于这方面的内容,特别是来自微软的知识库文章很少。例如,很难轻松找到查询中 IIS 的版本,并且即使提到了,也需要进行注册表或文件查询,这在远程管理 IIS 时没有帮助。
解释该库
类库是 DirectoryManager
。之所以这样命名,是因为过去处理过 Active Directory,我意识到 IIS 是同一事物的某个方面,但具有不同的数据。
理解该库需要非常深入地理解 System.DirectoryServices
。IIS 层次结构中每个节点的入口点是基类 Base.BaseEntry
,它是 DirectoryEntry
的包装器,并提供额外的功能。最重要的是包装了目录条目中的 Properties
集合。还提供了其他方法,例如提交更改。在任何情况下,DirectoryEntry
实例及其子项都通过 SourceEntry
和 Children
属性分别导出。
属性由 PropertyValue
和 PropertyValues
类表示。主要原因是目录条目的属性值系统需要对数据类型和强制类型转换有持续的了解,这使得代码难以维护和理解。
Sarafian.Framework.General.DirectoryManager.IIS
包含表示 IIS 层次结构的类,至少是我需要的那些。此层次结构的每个节点都找到其相应的子节点,但也了解其父节点。一切都是类型化的,如果缺少任何内容,都可以轻松添加。在许多情况下,已特别注意版本 6 和 7 之间的版本不兼容性,并且已进行测试。每个类节点都提供其成员函数,用于添加子节点。例如,表示 IIS 服务的 Service
类提供了添加和查询网站的功能。WebSite
类提供了启动、停止、重启以及检查状态的功能。
以下是层次结构中每个类所代表的内容。
Service
它表示 IIS 服务。它是 IIS 管理系统的入口点。该服务持有对单个或多个 AppPools
、Schema
、WebSite
和 Info
类的引用。
AppPools
保存AppPool
类的列表,这些类逻辑上描述了 IIS 的应用程序池功能。Schema
持有AppIsIsolated
引用,该引用除其他外,还知道 IIS 服务是否位于 NT 系统之下。Info
包含服务的版本信息。它们由MajorIISVersionNumber
和MinorIISVersionNumber
提供。WebSite
是实际的网站。IIS 上的每个网站都有一个SiteID
,它实际上并没有说明太多关于网站的信息,但对于查询和查找网站是必需的。我无法理解为什么,但实际的物理路径位于WebVirtualDir
中,它与VirtualDirectory
几乎相同。以下是一些重要的方法。ConvertToApplication
将虚拟目录转换为 IIS 的应用程序,而不仅仅是一个简单的文件夹,ApplyASPNETV2
将Asp.Net2
应用于其应用程序池。WebVirtualDir
实际上是网站的根目录。VirtualDirectory
表示网站上的虚拟目录。
WebVirtualDir
和 VirtualDirectory
都有一个 PhysicalPath
属性。
子节点的某些属性会传播到父节点,因为我认为它们应该放在那里。例如,WebSite
有一个 PhysicalPath
属性,但它实际上是对 WebVirtualDir
中 PhysicalPath
的引用。
使用代码
在 IISTreeView
中,服务创建如下:
this.service = new Service("LocalHost");
IIS 层次结构由树表示,当在树上选择一个节点时,会生成一个包含其属性的数据集并在右侧显示。由于 IIS 层次结构的所有节点都未创建为类型化类,因此存在一个 DirectoryEntryNode
,它处理一个简单的 DirectoryEntry
。基本上,这个项目可以帮助您查询可通过 System.DirectoryServices
访问的任何内容。
如果需要为新属性添加类型,则以相同的名称和相应的类型创建它。必须实现额外的功能来解析 IIS 中的数据。例如,WebSite
上的 Port
。
public int Port
{
get
{
try
{
return Convert.ToInt32(ServerBindings.Replace(":", ""));
}
catch (Exception)
{
}
return -1;
}
set { ServerBindings = String.Concat(":", value.ToString(), ":"); }
}
关注点
WebSite
的状态存在问题,并且每次调用都需要创建一个新的 DirectoryEntry
。所以,这是这样用的:
public WebSiteStates State
{
get
{
DirectoryEntry site = new DirectoryEntry(base.SourceEntry.Path);
return (WebSiteStates)Convert.ToInt32(site.Properties["ServerState"].Value);
}
}
每当树节点需要显示其所有子节点时,只需在构造函数中添加此项:
base.AddChildrenNodes();
上述结构可能需要更多代码,但它为微软的任何目录服务中发生的情况提供了类型化且更有意义的表示。这包括 Active Directory 服务,据我所知,还包括 Microsoft Exchange。微软对这些服务中数据的存储方式非常保密,因此树和网格方法提供了对服务的有用见解,可用于创建适当的类,并逐步构建或扩展库。
历史
这是库的第一个版本。目前它仅为 IIS 提供类型化功能。