首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 列出所有 IIS 網站並綁定 DataGridView:一站式網站清單管理

     編輯:關於C語言

需求:管理介面一覽所有網站關鍵資訊

構建 IIS 管理儀表板的第一步:將伺服器上所有網站的 ID、名稱、IP、Port、Host Header、物理路徑以表格呈現。本文提供從 DirectoryServices 讀取、組裝資料物件、綁定 DataGridView 的完整實作。

資料模型:WebSiteInfo

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;
}

WinForms DataGridView 綁定與顯示優化

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}] 詳細綁定");
        }
    };
}

WPF / ASP.NET Core / Blazor 綁定提示

  • WPF:DataGrid.ItemsSource = sites; 配合 AutoGenerateColumns="True" 或自訂 DataGridTextColumn。
  • ASP.NET Core MVC:Controller 回傳 View(sites),View 使用 @model List 配合 `` 或 `` TagHelper。
  • Blazor:@foreach (var site in sites) {
  • ... } 或使用 MudBlazor DataGrid、Radzen Grid 等元件。

    進階功能擴展

    功能實作要點
    網站狀態顯示(啟動/停止)讀取 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 導出

    避坑指南

    1. 多重綁定解析:ServerBindings 可能包含多行(每行一組綁定),顯示時建議只取第一組,完整資訊保留原始字串或另開視窗檢視。
    2. 權限與例外處理:包裹 DirectoryEntry 操作於 try-catch,捕獲 UnauthorizedAccessException、COMException 並友善提示。
    3. 效能:避免重複連線:一次性讀取所有資料快取,UI 操作(排序、篩選、分頁)僅操作記憶體集合。
    4. IIS 7+ 強烈建議改用 ServerManager:using Microsoft.Web.Administration; 提供強型別 Site、Binding、Application 物件,代碼更簡潔、編譯期檢查、IntelliSense 完整支援。

    總結

    以 DirectoryEntry 遍歷 IIS://localhost/W3SVC 子節點,解析 ServerComment、ServerBindings、ROOT/Path 組裝 WebSiteInfo 列表,再綁定 DataGridView,即可快速構建 IIS 網站清單管理介面。掌握此模式,進階功能(狀態監控、操作選單、匯出報表)皆可輕鬆擴展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved