使用 Windows Management Instrumentation 進行診斷
Windows Communication Foundation (WCF) 會透過 WCF Windows Management Instrumentation (WMI) 提供者,在執行階段公開服務的檢查資料。
啟用 WMI
WMI 是 Microsoft 對「Web 架構企業管理」(Web-Based Enterprise Management,WBEM) 標準的實作。如需 WMI SDK 的詳細資訊,請參閱 MSDN Library (https://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi\_start\_page.asp)。WBEM 是一套業界標準,說明應用程式如何將管理測試設備公開至外部管理工具。
WMI 提供者是一個元件,可透過 WBEM 相容介面,在執行階段公開測試設備。它是由一組含有屬性/值配對的 WMI 物件所組成。配對可以是數個簡單型別。管理工具可以在執行階段,透過介面連線到服務。WCF 會公開服務的屬性,例如位址、繫結、行為和接聽項。
內建的 WMI 提供者可以在應用程式的組態檔中啟動。此動作可以透過 system.ServiceModel element一節中 <diagnostics> Element的 wmiProviderEnabled 屬性完成,如下列範例組態所示。
<system.serviceModel>
…
<diagnostics wmiProviderEnabled="true" />
…
</system.serviceModel>
這個組態項目會公開 WMI 介面。現在,管理應用程式可以透過這個介面進行連線,並存取應用程式的管理測試設備。
存取 WMI 資料
您可以使用各種不同的方式來存取 WMI 資料。Microsoft 為指令碼、Visual Basic 應用程式、C++ 應用程式和 .NET Framework 都提供了 WMI API。如需詳細資訊,請參閱 Using WMI (本頁面可能為英文)。
注意: |
---|
如果您使用 .NET Framework 提供的方法,以程式設計方式存取 WMI 資料,您要注意,當連線建立時,這類方法可能會擲回例外狀況。連線不是在建構 ManagementObject 執行個體期間建立的,而是在第一次要求實際資料交換時建立。因此,您應該使用 try..catch 區塊攔截可能的例外狀況。 |
您可以在 WMI 中變更 System.ServiceModel 追蹤來源的追蹤和訊息記錄層級,以及訊息記錄選項。您可以存取 AppDomainInfo 執行個體來進行變更,這個執行個體會公開下列布林值屬性:LogMessagesAtServiceLevel、LogMessagesAtTransportLevel、LogMalformedMessages 和 TraceLevel。因此,如果您為訊息記錄設定一個追蹤接聽項,但在組態中將這些選項設定為 false,那麼您可以在稍後應用程式執行時,將選項變更為 true。這將會在執行階段有效地啟用訊息記錄。同樣地,如果您在組態檔中啟用訊息記錄,則您可以在執行階段使用 WMI 來停用訊息記錄。
您要注意,如果沒有為訊息記錄設定訊息記錄追蹤接聽項,或者組態檔中沒有指定 System.ServiceModel 追蹤接聽項來進行追蹤,則您所做的變更不會有任何作用,即使 WMI 接受這些變更也一樣。如需正確設定各接聽項的詳細資訊,請參閱設定訊息記錄和設定追蹤。組態所指定之所有其他追蹤來源的追蹤層級,會在應用程式啟動時生效,並且無法變更。
WCF 會公開指令執行的 GetOperationCounterInstanceName 方法。如果您提供了一個作業名稱,這個方法就會傳回一個效能計數器執行個體名稱。不過,它不會驗證您的輸入。因此,如果您提供的作業名稱不正確,就會傳回錯誤的計數器名稱。
如果連到目的服務的 WCF 用戶端不是在 Service 方法內建立的,Service 執行個體的 OutgoingChannel 屬性就不會將服務所開啟、用來連接到另一個服務的通道計算在內。
注意 WMI 只支援 TimeSpan 值到小數點後三位。例如,如果您的服務將其中一個屬性設定為 MaxValue,則透過 WMI 檢視時,小數點後三位之後的值將被截斷。
安全性
WCF WMI 提供者允許在環境中探索服務,所以,在授與存取權限時,應該特別小心謹慎。如果您將預設僅供系統管理員存取的限制放寬,可能導致信賴度較低的一方存取環境中的敏感性資料。特別是,如果您放寬遠端 WMI 存取的權限,可能導致氾濫攻擊。如果某個處理序湧入了大量 WMI 要求,可能會使它的效能降低。
此外,如果您放寬了 MOF 檔案的存取權限,信賴度較低的一方就可以操控 WMI 的行為,並改變 WMI 結構描述中載入的物件。例如,欄位可能會遭到移除,導致管理員無法看見重要資料,或是原本不會填入或造成例外狀況的欄位會加入至檔案。
根據預設,WCF WMI 提供者會授與系統管理員「執行方法」、「提供者寫入」和「啟用帳戶」的權限,並授與 ASP.NET、本機服務和網路服務「啟用帳戶」的權限。特別是,在非 Windows Vista 平台上,ASP.NET 帳戶具有 WMI ServiceModel 命名空間的讀取權限。如果您不想將這些權限授與特定使用者群組,則應該停用 WMI 提供者 (預設為停用) 或停用特定使用者群組的存取。
此外,當您嘗試透過組態啟用 WMI 時,可能因為使用者權限不足,而無法啟用 WMI。不過,事件記錄內不會寫入任何事件以記錄這項失敗。
若要修改使用者權限層級,請依照下列步驟執行。
- 按一下 [開始]、[執行],然後輸入 compmgmt.msc。
- 以滑鼠右鍵按一下 [服務及應用程式/WMI 控制項] 以選取 [內容]。
- 選取 [安全性] 索引標籤,並巡覽至 [Root/ServiceModel] 命名空間。按一下 [安全性] 按鈕。
- 選取您想控制存取的特定群組或使用者,並使用 [允許] 或 [拒絕] 核取方塊來設定權限。
存取遠端 WMI 物件執行個體
如果您需要在遠端電腦上存取 WCF WMI 執行個體,則您必須在用來存取的工具上啟用封包私密性。下列小節說明如何使用 WMI CIM Studio、Windows Management Instrumentation 測試器以及 .NET SDK 2.0 來完成這項工作。
WMI CIM Studio
如果您已安裝 WMI 系統管理工具 (本頁面可能為英文),就可以使用 WMI CIM Studio 來存取 WMI 執行個體。工具位於下列資料夾中
%windir%\Program Files\WMI Tools\
- 在 [連接至命名空間:] 視窗中輸入root\ServiceModel ,然後按一下 [確定]。
- 在 [WMI CIM Studio 登入] 視窗中,按一下 [選項 >>] 按鈕展開視窗。在 [驗證等級] 選取 [封包私密性],然後按一下 [確定]。
Windows Management Instrumentation 測試器
這個工具是由 Windows 進行安裝。若要執行此工具,請啟動命令主控台,方法是輸入cmd.exe (位於 [開始/執行] 對話方塊中),然後按一下 [確定]。接著在命令視窗中輸入wbemtest.exe 。[Windows Management Instrumentation 測試器] 工具隨即啟動。
- 按一下視窗右上角的 [連線] 按鈕。
- 在新視窗中輸入root\ServiceModel (針對 [命名空間] 欄位),並針對 [驗證等級] 選取 [封包私密性]。按一下 [連線]。
使用 Managed 程式碼
您也可以使用 System.Management 命名空間提供的類別,以程式設計方式存取遠端 WMI 執行個體。下列程式碼範例示範如何執行這項操作。
String wcfNamespace = String.Format(@"\\{0}\Root\ServiceModel",
this.serviceMachineName);
ConnectionOptions connection = new ConnectionOptions();
connection.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope scope = new ManagementScope(this.wcfNamespace, connection);