[.NET] 使用C#建立IIS站台以及應用程式集區

最近有個小想法,想要自己作一個Website的Installer
所以在透過程式碼建立IIS站台以及應用程式集區上,就是這個Installer必備的功能了

要透過C#建立IIS站台以及應用程式集區很簡單
程式碼很少也很單純,照著下面的步驟說明以及程式碼進行實作就可以了

1.加入[Microsoft.Web.Administration]的參考

2.建立應用程式集區的程式碼,請透過下面的方式進行建立

// 定義iisManager物件
ServerManager iisManager = new ServerManager();

// 設定AppPool
if (!IsApplicationPoolExists([應用程式集區的名稱]))
{
    ApplicationPool objPool = iisManager.ApplicationPools.Add([應用程式集區的名稱]);
    // Runtime的版本有分兩種,v2.0與v4.0
    objPool.ManagedRuntimeVersion = [應用程式集區Runtime版本];
    iisManager.CommitChanges();
}

/// <summary>
/// 確認應用程式集區是否存在
/// </summary>
/// <param name="strAppPool">應用程式集區</param>
/// <returns></returns>
public bool IsApplicationPoolExists(string strAppPool) => iisManager.ApplicationPools.Where(x => x.Name == strAppPool).Any();

3.建立Website站台的方式,程式碼就比較多一點,不過還是很好理解的

// 定義iisManager物件
ServerManager iisManager = new ServerManager();

// 確認IIS站台是否有相同名稱或是相同的Port
string strWebsite = [站台名稱];
string strAppPool = [應用程式集區名稱]; 
string strHostName = [Host名稱 (option)];
string strIP = [使用IP (option)];
string strBindingInfo = strIP + $":{txtPort.Value}:" + strHostName;

// 確認站台是否存在
if (!IsWebsiteExists(strWebsite))
{
    Site mySite = iisManager.Sites.Add(strWebsite, "http", strBindingInfo, [站台對應的實體路徑]);
    mySite.ApplicationDefaults.ApplicationPoolName = strAppPool;
    iisManager.CommitChanges();
}


/// <summary>
/// 確認網站名稱是否存在
/// </summary>
/// <param name="strWebsite">站台名稱</param>
/// <returns></returns>
public bool IsWebsiteExists(string strWebsite)=> iisManager.Sites.Where(x => x.Name == strWebsite).Any();

由於這個應用程式在建立站台時需要Administrator的權限,所以在執行這個應用程式時就必須以系統管理員的角色啟動,所以必須要再專案中加入下面的內容

3.於專案中加入[應用程式資訊清單檔案],預設為app.manifest

4.開啟app.manifest,並將[requestedExecutionLevel]的Level更改為[requireAdministrator]

5.當執行應用程式的時候,會跳出更高權限認證的請求,這時候只要重新啟動Visual Studio就可以了正常執行了

透過C#撰寫管理IIS的程式碼,不用再像以前一樣必須去呼叫WMI的API,現在已經有很好用的類別庫可以使用,對於軟體佈署與更新就能夠有更大的自主性與彈性了

參考資料
[C#] [WinForm] 強迫使用系統管理員(administrator)開啟程式
Microsoft.Web.Administration Namespace
Create an application pool that uses .NET 4.0