嘗試用 `DirectoryEntry` (ADSI) 操作 IIS 7 失敗,錯誤 `0x80005000` (未知錯誤)。根因:IIS 7 不再預設安裝 Metabase 相容層。本文記錄排查歷程並引導遷移至現代 `Microsoft.Web.Administration` API。
var iis = new DirectoryEntry("IIS://localhost/W3SVC");
foreach (DirectoryEntry site in iis.Children)
{
if (site.SchemaClassName == "IISWebServer")
Console.WriteLine($"{site.Name} - {site.Properties["ServerComment"].Value}");
}
即使以管理員執行、關閉 UAC、安裝「IIS 6 管理相容性」功能,仍不穩定且屬舊技術棧。
IIS 7+ 以 `applicationHost.config` XML 為核心設定存儲,MWA (`%windir%\system32\inetsrv\Microsoft.Web.Administration.dll`) 為官方管理 API,支援:
ServerManager.CommitChanges())。
using Microsoft.Web.Administration;
using (var mgr = new ServerManager())
{
// 列舉網站
foreach (var site in mgr.Sites)
Console.WriteLine($"{site.Id} {site.Name} {site.State} {site.Bindings[0].BindingInformation}");
// 建立虛擬目錄
var site = mgr.Sites["Default Web Site"];
var app = site.Applications["/"];
app.VirtualDirectories.Add("/myvd", @"C:\MyContent");
mgr.CommitChanges();
// 建立應用程式池
var pool = mgr.ApplicationPools.Add("MyPool");
pool.ManagedRuntimeVersion = "v4.0";
pool.ManagedPipelineMode = ManagedPipelineMode.Integrated;
mgr.CommitChanges();
}
| ADSI/Metabase 概念 | MWA 對應類別 |
|---|---|
| IISWebServer | Site |
| IIsWebVirtualDir | VirtualDirectory (隸屬 Application) |
| IIsApplicationPool | ApplicationPool |
| AppIsolated/AccessFlags | ApplicationPool 設定 |
| KeyType/MetabasePath | ConfigurationElement / ConfigurationSection |
Prefer 32-bit = false (Any CPU)。實戰:以 MWA 批次建立多租戶網站、綁定 SSL 憑證、設定應用程式池身分識別、啟用動態壓縮與快取規則。