自動化部署、CI/CD 流水線、多租戶 SaaS 平台、動態建立客戶專屬站點——這些場景都需要以程式碼控制 IIS。.NET 透過 System.DirectoryServices 操作 IIS Metabase(IIS 6)或 Configuration System(IIS 7+),本文提供建立、刪除、查詢網站的完整實作代碼。
System.DirectoryServices.dll,專案需以 **Administrator 權限** 執行。| 路徑 | 說明 |
|---|---|
IIS://localhost/W3SVC | 網站容器根節點 |
IIS://localhost/W3SVC/{SiteId} | 特定網站節點 |
IIS://localhost/W3SVC/{SiteId}/ROOT | 網站根虛擬目錄 |
關鍵 Schema 類別:IISWebServer(網站)、IISWebVirtualDir(虛擬目錄)。
public string GetNewWebSiteId() {
var ids = new List();
using (var root = new DirectoryEntry("IIS://localhost/W3SVC")) {
foreach (DirectoryEntry child in root.Children) {
if (child.SchemaClassName == "IISWebServer" && int.TryParse(child.Name, out int id))
ids.Add(id);
}
}
ids.Sort();
int next = 1;
foreach (int id in ids) {
if (id == next) next++;
else break;
}
return next.ToString();
}
public string GetWebSiteIdByName(string siteName) {
using (var root = new DirectoryEntry("IIS://localhost/W3SVC")) {
foreach (DirectoryEntry site in root.Children) {
if (site.SchemaClassName != "IISWebServer") continue;
// 比對 ServerComment(網站描述)
if (site.Properties["ServerComment"]?.Value?.ToString() == siteName)
return site.Name;
// 比對 ServerBindings(IP:Port:HostHeader)
if (site.Properties["ServerBindings"]?.Value is string bindings && bindings.Contains(siteName))
return site.Name;
}
}
return string.Empty;
}
public void CreateWebSite(string siteName, string ip, string port, string hostHeader, string physicalPath) {
string siteId = GetNewWebSiteId();
string bindString = $"{ip}:{port}:{hostHeader}";
using (var root = new DirectoryEntry("IIS://localhost/W3SVC")) {
// 1. 建立 IISWebServer 節點
using (var site = root.Children.Add(siteId, "IISWebServer")) {
site.Properties["ServerBindings"].Value = bindString;
site.Properties["ServerComment"].Value = siteName;
site.CommitChanges(); // 必須先 Commit 才能建立子節點
// 2. 建立根虛擬目錄
using (var vdir = site.Children.Add("ROOT", "IISWebVirtualDir")) {
vdir.Properties["Path"].Value = physicalPath;
vdir.CommitChanges();
}
}
}
Console.WriteLine($"網站 [{siteName}] 建立完成,ID={siteId}, 綁定={bindString}, 路徑={physicalPath}");
}
public void DeleteWebSite(string siteName) {
string siteId = GetWebSiteIdByName(siteName);
if (string.IsNullOrEmpty(siteId)) {
Console.WriteLine($"找不到網站:{siteName}");
return;
}
using (var root = new DirectoryEntry("IIS://localhost/W3SVC"))
using (var site = new DirectoryEntry($"IIS://localhost/W3SVC/{siteId}")) {
root.Children.Remove(site);
root.CommitChanges();
}
Console.WriteLine($"網站 [{siteName}] (ID={siteId}) 已刪除");
}
public List ListAllWebSites() {
var list = new List();
using (var root = new DirectoryEntry("IIS://localhost/W3SVC")) {
foreach (DirectoryEntry site in root.Children) {
if (site.SchemaClassName != "IISWebServer") continue;
string id = site.Name;
string comment = site.Properties["ServerComment"]?.Value?.ToString() ?? "";
string bindings = site.Properties["ServerBindings"]?.Value?.ToString() ?? "";
// 解析 IP:Port:HostHeader
string ip = "", port = "", host = "";
if (!string.IsNullOrEmpty(bindings)) {
var parts = bindings.Split(':');
if (parts.Length >= 3) { ip = parts[0]; port = parts[1]; host = parts[2]; }
}
// 取得物理路徑
string physPath = "";
foreach (DirectoryEntry vdir in site.Children) {
if (vdir.SchemaClassName == "IISWebVirtualDir" && vdir.Name == "ROOT") {
physPath = vdir.Properties["Path"]?.Value?.ToString() ?? "";
break;
}
}
list.Add(new WebSiteInfo {
Id = id, Name = comment, Ip = ip, Port = port, HostHeader = host, PhysicalPath = physPath
});
}
}
return list;
}
public class WebSiteInfo {
public string Id { get; set; }
public string Name { get; set; }
public string Ip { get; set; }
public string Port { get; set; }
public string HostHeader { get; set; }
public string PhysicalPath { get; set; }
}
IIS://localhost/W3SVC/AppPools,Schema 為 IIsApplicationPool。CommitChanges 會拋出 UnauthorizedAccessException。ServerManager 類別(需引用 Microsoft.Web.Administration.dll),API 更現代、強型別、支援 applicationHost.config 直接操作。ServerBindings,避免 IP:Port:HostHeader 重複導致網站無法啟動。掌握 DirectoryEntry 操作 IIS Metabase 的核心模式——**連線根節點 → 遍歷/新增/移除子節點 → 設定屬性 → CommitChanges**——即可實現網站全生命週期自動化管理。配合 ServerManager 現代 API,構建穩健的自動化部署與多租戶平台基礎設施。