構建 IIS 管理儀表板的第一步:將伺服器上所有網站的 ID、名稱、IP、Port、Host Header、物理路徑以表格呈現。本文提供從 DirectoryServices 讀取、組裝資料物件、綁定 DataGridView 的完整實作。
public class WebSiteInfo {
public string Id { get; set; }
public string Name { get; set; } // ServerComment
public string Ip { get; set; }
public string Port { get; set; }
public string HostHeader { get; set; }
public string PhysicalPath { get; set; }
public string BindingsRaw { get; set; } // 原始 ServerBindings,供除錯
}
public List GetAllWebSites() {
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 name = site.Properties["ServerComment"]?.Value?.ToString() ?? "";
string bindingsRaw = site.Properties["ServerBindings"]?.Value?.ToString() ?? "";
// 解析綁定(可能多行,每行一組 IP:Port:HostHeader)
string ip = "", port = "", host = "";
if (!string.IsNullOrEmpty(bindingsRaw)) {
var lines = bindingsRaw.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
// 取第一組作為主要顯示,完整資訊保留在 BindingsRaw
var first = lines[0].Split(':');
if (first.Length >= 3) { ip = first[0]; port = first[1]; host = first[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 = name,
Ip = ip,
Port = port,
HostHeader = host,
PhysicalPath = physPath,
BindingsRaw = bindingsRaw
});
}
}
return list;
}
private void BindSitesToGrid() {
var sites = GetAllWebSites();
dgvSites.AutoGenerateColumns = false;
dgvSites.DataSource = sites;
// 定義欄位(設計時或執行時皆可)
if (dgvSites.Columns.Count == 0) {
dgvSites.Columns.AddRange(new DataGridViewColumn[] {
new DataGridViewTextBoxColumn { DataPropertyName = "Id", HeaderText = "站點 ID", Width = 60 },
new DataGridViewTextBoxColumn { DataPropertyName = "Name", HeaderText = "網站名稱", Width = 180 },
new DataGridViewTextBoxColumn { DataPropertyName = "Ip", HeaderText = "IP 位址", Width = 120 },
new DataGridViewTextBoxColumn { DataPropertyName = "Port", HeaderText = "埠號", Width = 60 },
new DataGridViewTextBoxColumn { DataPropertyName = "HostHeader", HeaderText = "主機標頭", Width = 150 },
new DataGridViewTextBoxColumn { DataPropertyName = "PhysicalPath", HeaderText = "物理路徑", Width = 300 },
});
}
// 可選:雙擊列查看完整綁定資訊
dgvSites.CellDoubleClick += (s, e) => {
if (e.RowIndex >= 0) {
var site = sites[e.RowIndex];
MessageBox.Show($"完整綁定資訊:\n{site.BindingsRaw}", $"站點 [{site.Name}] 詳細綁定");
}
};
}
DataGrid.ItemsSource = sites; 配合 AutoGenerateColumns="True" 或自訂 DataGridTextColumn。View(sites),View 使用 @model List 配合 `| 功能 | 實作要點 |
|---|---|
| 網站狀態顯示(啟動/停止) | 讀取 ServerState 屬性(1=啟動, 2=停止, 4=暫停),轉換為顯示文字/圖示 |
| 應用程式池關聯 | IIS 7+ 讀取 AppPoolId;IIS 6 需查 IIsWebServer/AppPoolId |
| 依 IP/HostHeader 篩選 | LINQ: sites.Where(s => s.Ip == "192.168.1.10" || s.HostHeader.Contains("api")) |
| 右鍵選單操作(啟動/停止/刪除) | ContextMenuStrip + site.Invoke("Start") / Stop() / 刪除節點 |
| 匯出 CSV/Excel | 使用 CsvHelper 或 EPPlus 將 List 導出 |
ServerBindings 可能包含多行(每行一組綁定),顯示時建議只取第一組,完整資訊保留原始字串或另開視窗檢視。DirectoryEntry 操作於 try-catch,捕獲 UnauthorizedAccessException、COMException 並友善提示。using Microsoft.Web.Administration; 提供強型別 Site、Binding、Application 物件,代碼更簡潔、編譯期檢查、IntelliSense 完整支援。以 DirectoryEntry 遍歷 IIS://localhost/W3SVC 子節點,解析 ServerComment、ServerBindings、ROOT/Path 組裝 WebSiteInfo 列表,再綁定 DataGridView,即可快速構建 IIS 網站清單管理介面。掌握此模式,進階功能(狀態監控、操作選單、匯出報表)皆可輕鬆擴展。