典型 WinForms/WebForms 管理工具:左側 ComboBox 列出網站名稱,使用者選中後,右側 TextBox 自動顯示 IP、Port、Host Header、物理路徑等屬性。本文提供完整的事件處理與資料存取代碼。
ServerComment)。private void cmbSites_SelectedIndexChanged(object sender, EventArgs e) {
string selectedName = cmbSites.SelectedItem?.ToString();
if (string.IsNullOrEmpty(selectedName)) return;
string siteId = GetWebSiteIdByName(selectedName);
if (string.IsNullOrEmpty(siteId)) {
MessageBox.Show("找不到對應網站");
return;
}
string sitePath = $"IIS://localhost/W3SVC/{siteId}";
using (var siteEntry = new DirectoryEntry(sitePath)) {
// 1. 解析 ServerBindings: "IP:Port:HostHeader"
string bindings = siteEntry.Properties["ServerBindings"]?.Value?.ToString() ?? "";
string ip = "", port = "", hostHeader = "";
if (!string.IsNullOrEmpty(bindings)) {
var parts = bindings.Split(':');
if (parts.Length >= 3) { ip = parts[0]; port = parts[1]; hostHeader = parts[2]; }
}
// 2. 遍歷子節點找 ROOT 虛擬目錄取得物理路徑
string physPath = "";
foreach (DirectoryEntry child in siteEntry.Children) {
if (child.SchemaClassName == "IISWebVirtualDir" && child.Name == "ROOT") {
physPath = child.Properties["Path"]?.Value?.ToString() ?? "";
break;
}
}
// 3. 回填 UI
txtIp.Text = ip;
txtPort.Text = port;
txtHostHeader.Text = hostHeader;
txtPhysicalPath.Text = physPath;
}
}
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(網站描述名稱)
string comment = site.Properties["ServerComment"]?.Value?.ToString() ?? "";
if (string.Equals(comment, siteName, StringComparison.OrdinalIgnoreCase))
return site.Name;
// 比對 ServerBindings 中的 HostHeader
string bindings = site.Properties["ServerBindings"]?.Value?.ToString() ?? "";
if (!string.IsNullOrEmpty(bindings)) {
var parts = bindings.Split(':');
if (parts.Length >= 3 && string.Equals(parts[2], siteName, StringComparison.OrdinalIgnoreCase))
return site.Name;
}
}
}
return string.Empty;
}
private void LoadSitesToComboBox() {
cmbSites.Items.Clear();
using (var root = new DirectoryEntry("IIS://localhost/W3SVC")) {
foreach (DirectoryEntry site in root.Children) {
if (site.SchemaClassName == "IISWebServer") {
string name = site.Properties["ServerComment"]?.Value?.ToString() ?? site.Name;
cmbSites.Items.Add(name);
}
}
}
if (cmbSites.Items.Count > 0) cmbSites.SelectedIndex = 0;
}
| 屬性名稱 | 類型 | 說明 | 範例 |
|---|---|---|---|
| ServerComment | string | 網站描述名稱(管理員自訂) | "My Corporate Portal" |
| ServerBindings | string | 綁定資訊,格式 IP:Port:HostHeader | "192.168.1.10:80:www.example.com" |
| ServerState | int | 網站狀態:1=啟動, 2=停止, 4=暫停 | 1 |
| Path (於 ROOT 虛擬目錄) | string | 網站實體磁碟路徑 | "D:\WebSites\MySite" |
| AppPoolId (IIS 7+) | string | 所屬應用程式池名稱 | "MySiteAppPool" |
?.Value?.ToString() 防禦性編程。Split('\n') 逐行解析。StringComparison.OrdinalIgnoreCase。List,UI 直接繫結快取資料。serverManager.Sites["Name"].Bindings 提供強型別 Binding 物件集合,免去字串解析麻煩。掌握 DirectoryEntry 讀取 IIS 網站屬性的標準流程——**查 ID → 連節點 → 解析綁定 → 遍歷虛擬目錄**——即可快速構建 IIS 管理工具的核心資料存取層。配合防禦性編程與快取策略,打造穩健好用的管理介面。