在Windows服务器运维和桌面应用开发中,经常需要通过代码自动化操作IIS,避免手动配置的繁琐和出错。C#作为Windows平台的主流开发语言,提供了多种操作IIS的能力,下面我们逐一解析。

操作IIS的两种核心方式
C#操作IIS主要有两种实现路径,开发者可以根据自身使用的.NET版本和IIS版本选择合适的方式:
- DirectoryEntry方式:基于System.DirectoryServices命名空间,通过ADSI(Active Directory Service Interfaces)访问IIS的元数据,兼容IIS 6及以上版本,是早期.NET开发常用的方式,但属于COM互操作,调用相对繁琐。
- Microsoft.Web.Administration方式:微软官方提供的托管类库,封装了IIS 7及以上版本的配置接口,调用更简洁,类型定义更清晰,是目前推荐的使用方式。
基于Microsoft.Web.Administration的实现
首先需要引入Microsoft.Web.Administration类库,如果是.NET Framework项目,可以在NuGet中搜索安装,如果是.NET Core/.NET 5+项目,需要安装对应的兼容包。下面以创建站点为例展示核心代码:
using Microsoft.Web.Administration;
using System;
public class IisManager
{
// 创建新的IIS站点
public static void CreateWebSite(string siteName, string physicalPath, string bindingIp, int bindingPort, string bindingHost)
{
// 创建ServerManager实例,用于管理IIS的所有配置
using (ServerManager serverManager = new ServerManager())
{
// 检查站点是否已存在
if (serverManager.Sites[siteName] != null)
{
Console.WriteLine($"站点{siteName}已存在,无需重复创建");
return;
}
// 创建新站点,指定站点名称、绑定信息和物理路径
Site newSite = serverManager.Sites.Add(siteName, bindingIp, bindingPort, bindingHost);
newSite.Applications[0].VirtualDirectories[0].PhysicalPath = physicalPath;
// 提交配置更改,保存到IIS
serverManager.CommitChanges();
Console.WriteLine($"站点{siteName}创建成功,路径为{physicalPath}");
}
}
// 启动指定站点
public static void StartWebSite(string siteName)
{
using (ServerManager serverManager = new ServerManager())
{
Site targetSite = serverManager.Sites[siteName];
if (targetSite == null)
{
Console.WriteLine($"未找到站点{siteName}");
return;
}
if (targetSite.State == ObjectState.Stopped)
{
targetSite.Start();
Console.WriteLine($"站点{siteName}已启动");
}
else
{
Console.WriteLine($"站点{siteName}当前状态为{targetSite.State},无需启动");
}
}
}
}基于DirectoryEntry的实现方式
如果需要兼容更老的IIS版本,或者项目无法使用Microsoft.Web.Administration类库,可以使用DirectoryEntry方式,核心是通过IIS的ADSI路径访问配置:
using System.DirectoryServices;
using System;
public class IisDirectoryEntryManager
{
// 使用DirectoryEntry创建站点
public static void CreateSiteByDirectoryEntry(string siteName, string physicalPath, int port)
{
try
{
// IIS站点的ADSI根路径
string iisRootPath = "IIS://localhost/W3SVC";
DirectoryEntry rootEntry = new DirectoryEntry(iisRootPath);
// 查找可用的站点ID,默认从1开始递增
int siteId = 1;
foreach (DirectoryEntry child in rootEntry.Children)
{
if (child.SchemaClassName == "IIsWebServer")
{
int currentId = int.Parse(child.Name);
if (currentId >= siteId)
{
siteId = currentId + 1;
}
}
}
// 创建新的站点节点
DirectoryEntry newSiteEntry = rootEntry.Children.Add(siteId.ToString(), "IIsWebServer");
newSiteEntry.Properties["ServerComment"].Value = siteName;
newSiteEntry.CommitChanges();
// 设置站点的绑定信息,格式为IP:端口:主机名
newSiteEntry.Properties["ServerBindings"].Value = $":{port}:";
// 创建站点的根虚拟目录
DirectoryEntry rootDirEntry = newSiteEntry.Children.Add("ROOT", "IIsWebVirtualDir");
rootDirEntry.Properties["Path"].Value = physicalPath;
rootDirEntry.Properties["AccessRead"].Value = true;
rootDirEntry.Properties["AccessScript"].Value = true;
rootDirEntry.CommitChanges();
newSiteEntry.CommitChanges();
Console.WriteLine($"通过DirectoryEntry创建站点{siteName}成功,站点ID为{siteId}");
}
catch (Exception ex)
{
Console.WriteLine($"创建站点失败:{ex.Message}");
}
}
}常见操作场景补充
应用程序池配置
使用Microsoft.Web.Administration修改应用程序池的.NET版本和托管模式:
using Microsoft.Web.Administration;
using System;
public class AppPoolManager
{
public static void SetAppPool(string poolName, string runtimeVersion, bool isIntegratedMode)
{
using (ServerManager serverManager = new ServerManager())
{
ApplicationPool pool = serverManager.ApplicationPools[poolName];
if (pool == null)
{
pool = serverManager.ApplicationPools.Add(poolName);
}
// 设置.NET运行时版本
pool.ManagedRuntimeVersion = runtimeVersion;
// 设置托管管道模式,true为集成模式,false为经典模式
pool.ManagedPipelineMode = isIntegratedMode ? ManagedPipelineMode.Integrated : ManagedPipelineMode.Classic;
serverManager.CommitChanges();
Console.WriteLine($"应用程序池{poolName}配置完成,运行时版本{runtimeVersion}");
}
}
}添加虚拟目录
为已有站点添加虚拟目录的代码示例:
using Microsoft.Web.Administration;
using System;
public class VirtualDirManager
{
public static void AddVirtualDirectory(string siteName, string virtualPath, string physicalPath)
{
using (ServerManager serverManager = new ServerManager())
{
Site targetSite = serverManager.Sites[siteName];
if (targetSite == null)
{
Console.WriteLine($"未找到站点{siteName}");
return;
}
// 获取站点的默认应用程序
Application defaultApp = targetSite.Applications["/"];
// 添加虚拟目录
defaultApp.VirtualDirectories.Add(virtualPath, physicalPath);
serverManager.CommitChanges();
Console.WriteLine($"为站点{siteName}添加虚拟目录{virtualPath},对应物理路径{physicalPath}");
}
}
}注意事项
操作IIS需要足够的权限,通常需要以管理员身份运行程序,或者在应用程序池中配置有权限的账户。另外,不同IIS版本支持的配置项存在差异,开发前需要确认目标服务器的IIS版本,选择合适的操作方式。如果使用Microsoft.Web.Administration类库,需要注意该类库在IIS 7以下版本中不可用,此时需要切换到DirectoryEntry方式实现。
C#IIS管理DirectoryEntryMicrosoft.Web.Administration站点配置修改时间:2026-05-29 04:29:36