近期寫了個掃描IIS托管站點然後定期註冊到Consul的小工具,隨意網上拷貝了個幫助類,搞完本機測試沒問題,扔到伺服器發現碩大的一個異常。。 System.Runtime.InteropServices.COMException (0x80005000): 未知錯誤(0x80005000) 在 Sy ...
近期寫了個掃描IIS托管站點然後定期註冊到Consul的小工具,隨意網上拷貝了個幫助類,搞完本機測試沒問題,扔到伺服器發現碩大的一個異常。。
System.Runtime.InteropServices.COMException (0x80005000): 未知錯誤(0x80005000)
在 System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
在 System.DirectoryServices.DirectoryEntry.Bind()
在 System.DirectoryServices.DirectoryEntry.get_IsContainer()
在 System.DirectoryServices.DirectoryEntries.ChildEnumerator..ctor(DirectoryEntry container)
查了查資料發現是:
這段異常代碼表明 IIS://localhost/W3SVC/1 的ADSI provider不存在或者無法訪問。
打開IIS管理器你可以看到伺服器的localhost(即預設站點)是存在的並正在運行,且主站點ID確實是1。這說明問題是出現在 IIS://localhost的ADSI provider。
坦白點就是:而IIS 7預設並沒有安裝ADSI provider。
解決方案:“控制面板”->“程式和功能”->面板左側“打開或關閉windows功能”->“Web伺服器(IIS)”->“管理工具”->“IIS 6管理相容性”->“IIS 元資料庫相容性”。
代碼部分比較簡單:
using System.ServiceProcess; using System.DirectoryServices; public class IISManager { public static List<IISWebServiceInfo> GetLocalWebSeriviceInfo_IIS6() { DirectoryEntry rootfolder = new DirectoryEntry("IIS://localhost/W3SVC"); foreach (DirectoryEntry child in rootfolder.Children) { if (child.SchemaClassName == "IIsWebServer") { child.Properties["ServerComment"].Value.ToString();//服務名 child.Properties["ServerState"].Value;//服務狀態 child.Properties["ServerBindings"].Value;//綁定信息 } } } }
弊端比較明顯就是只支持IIS6及以下版本(安裝ADSI provider),太麻煩。。
IIS7.0及以上版本獲取服務信息可以使用Microsoft.Web.Administration,Nuget就能搜到
不得不說微軟還是比較拼的。。這是要跨平臺的節奏啊(Linux版IIS指日可待了嗎。。。)
代碼更簡單了:
using Microsoft.Web.Administration; class Program { static void Main(string[] args) { ServerManager sm = new ServerManager(); foreach (var s in sm.Sites) { Console.WriteLine("網站名稱:{0}", s.Name); Console.WriteLine("運行狀態:{0}", s.State.ToString()); foreach (var tmp in s.Bindings) { System.Console.WriteLine("\t類型:{0}", tmp.Protocol); System.Console.WriteLine("\tIP 地址:{0}", tmp.EndPoint.Address.ToString()); System.Console.WriteLine("\t埠:{0}", tmp.EndPoint.Port.ToString()); System.Console.WriteLine("\t主機名:{0}", tmp.Host); } } Console.ReadKey(); } }
當然,在windows操作系統獲取IIS信息是需要管理員許可權的