提供者裝載和安全性
表示提供者之 __Win32Provider 實例中的 HostingModel 屬性會指定提供者裝載模型。 設定此屬性會導致提供者載入具有指定許可權層級的共用主機進程。
共用提供者主機進程
WMI 位於與其他數個服務的共用服務主機中。 為了避免在提供者失敗時停止所有服務,提供者會載入名為 「Wmiprvse.exe」 的個別主機進程。 可以執行具有此名稱的多個進程。 每個帳戶都可以在不同的帳戶下執行,且具有不同安全性。 請注意,從 Windows Vista 開始,請使用 winmgmt 命令,單獨使用固定埠在個別進程中執行 WMI。 如需詳細資訊,請參閱 從 Vista 遠端連線到 WMI。
共用主機可以在Wmiprvse.exe主機程式中的下列其中一個系統帳戶下執行:
提供者也可以是本機 COM 伺服器(.exe),或自我裝載,不需要 WMI 提供者主機。
設定裝載模型
由於 LocalSystem 是特殊許可權帳戶,因此建議您在提供者在Wmiprvse.exe進程中執行時,將 HostingModel 設定為 NetworkServiceHost。 NetworkServiceHost 帳戶適用於不需要廣泛許可權的服務,但確實需要與其他系統進行遠端通訊。
如果您未設定 HostingModel 屬性的值,WMI 會設定 NetworkServiceHostOrSelfHost 的預設值。 如果 HostingModel 值設定為 LocalSystemHost,WMI 會使用追蹤在 Windows 事件記錄檔中產生事件 5603 和 5604。 由於本機 LocalSystem 帳戶具有高度許可權,因此不建議使用此設定。 您可以在 事件檢視器 中檢視這些事件。 如需詳細資訊,請參閱 追蹤 WMI 活動。
將分離提供者的 HostingModel 屬性設定為 「Decoupled:Com」。。 從 .NET Framework 中的 Microsoft.Management.Infrastructure 新增檢測類別所建立的提供者會分離提供者。 (不再支援 System.Management.Instrumentation 。)如需建立分離提供者的詳細資訊,請參閱 在應用程式中納入提供者。
主控模型是在代表您提供者之 __Win32Provider 實例的 HostingModel 屬性中指定。
設定提供者的裝載模型
在定義提供者的MOF檔案中,建立 __Win32Provider的實例。
將名稱指派給 Name 屬性中的提供者,並將提供者 COM 物件的類別識別碼 (CLSID) 指派給 Clsid 屬性。
下列程式代碼範例會將名稱指派給 Name 屬性,並將提供者 COM 物件的 CSLID 指派給 Clsid 屬性。
Instance of __Win32Provider as $NewProvider { Name = "MyProvider"; Clsid = "{.......}"; }
將適當的共享主機值指派給 HostingModel 屬性。 共用主機值,例如 「NetworkServiceHost」 定義於 MSFT_Providers 類別的 HostingSpecification 屬性中。
下列程式代碼範例會將共用主機值指派給 HostingModel 屬性。
HostingModel = "NetworkServiceHost";
下列程式代碼範例示範如何在 NetworkServiceHost 中註冊提供者。
Instance of __Win32Provider as $NewProvider
{
Name = "MyProvider";
Clsid = "{.......}";
HostingModel = "NetworkServiceHost";
}
如果您有多個提供者,您可以藉由註冊提供者將其分組為特定服務主機,使其位於特定實例中。
下列程式代碼範例也會在 NetworkServiceHost 中註冊提供者。 MSFT_Providers 類別會定義兩個值的值,這些值結合以建立__Win32Provider HostingModel 屬性。 在範例中,“NetworkServiceHost” 值來自MSFT_Providers的 HostingSpecification 属性,而 “LocalServiceHost” 則來自 HostingGroup 屬性。
Instance of __Win32Provider as $NewProvider
{
Name = "MyProvider";
Clsid = "{.......}";
HostingModel = "NetworkServiceHost:MySharedHost";
}
未分離且裝載於 Wmiprvse 程式中的提供者有特殊開發問題。 如需詳細資訊,請參閱 偵錯提供者。
如果您要撰寫包含屬性或類別提供者註冊的提供者,並非所有線程模型都能運作。 如需詳細資訊,請參閱 選擇正確的註冊。
In-Process 提供者的 HostingModel 值
下列清單列出在Wmiprvse.exe進程中執行的提供者,在 __Win32Provider 實例中使用的提供者模型值。
__Win32Provider.HostingModel 中的 值 | 描述 |
---|---|
SelfHost | 提供者會開始使用本地伺服器實作,而不是進程內。 提供者執行之進程的安全性內容會決定提供者安全性內容。 |
LocalSystemHost | 提供者,如果實作為同進程,則會載入到在LocalSystem內容下執行的共用提供者主機。 從 Windows Vista 開始,如果 WMI 提供者的 HostingModel (__Win32Provider,LocalSystemHost 不再是預設裝載模型。HostingModel 屬性未指定。 如需詳細資訊,請參閱 裝載模型的安全性。 |
LocalSystemHostOrSelfHost | 提供者會自我裝載或載入至在LocalSystem帳戶下執行的Wmiprvse.exe進程。 由於 LocalSystem 是高度特殊許可權的帳戶,因此會在安全性 NT 事件記錄檔中產生專案,以通知系統管理員此信任狀態中執行的提供者。 |
NetworkServiceHost | 提供者,如果實作為同進程,則會載入到在 NetworkService 帳戶下執行的Wmiprvse.exe進程。 從 Windows Vista 開始,如果 WMI 提供者的 HostingModel (__Win32Provider,這是預設裝載模型。HostingModel 屬性未指定。 如需詳細資訊,請參閱 裝載模型的安全性。 NetworkServiceHost 具有有限的許可權,因此可降低提高許可權攻擊的可能性。 如果提供者只在本機計算機內運作,則將 HostingModel 屬性設定為 LocalServiceHost。 |
NetworkServiceHostOrSelfHost | 提供者會自我裝載或載入到在 NetworkService 帳戶下執行的WmiPrvse.exe進程。 當 __Win32Provider 中的 HostingModel 屬性為 NULL 時,NetworkServiceHostOrSelfHost 是預設組態。 因為 NetworkServiceHostOrSelfHost 是預設值,舊版作業系統的提供者可以繼續在 Windows Vista、Windows Server 2008 和更新版本的操作系統中運作。 |
LocalServiceHost | 提供者,如果實作為同進程,則會載入至在LocalService帳戶下執行的Wmiprvse.exe進程。 這是服務的建議裝載模型,因為 LocalService 的許可權有限。 |
分離提供者的 HostingModel 值
下列清單列出分離提供者的提供者裝載模型值。
-
分離:Com
-
提供者是一個分離的提供者,裝載於另一個進程,而該進程是 WMI 的用戶端。
下列範例顯示 HostingModel 屬性的 FoldIdentity 規範設定為 FALSE,這可讓提供者模擬用戶端。
Decoupled:Com:FoldIdentity(FALSE)
如果未指定 FoldIdentity,則 FoldIdentity 值預設會設定為 TRUE 。 基於安全性考慮,建議您不要指定 FoldIdentity(FALSE),因為具有委派仿真的流氓應用程式可能會影響整個網域。
下列範例示範 以建議方式設定 HostingModel 屬性,相當於設定 FoldIdentity(TRUE)。
Decoupled:Com
-
分離:Noncom
-
僅限內部使用。 不支援。
裝載模型的安全性
在大部分情況下,LocalSystem 是不必要的,而且 NetworkServiceHost 內容更合適。 大部分的 WMI 提供者都必須模擬用戶端安全性內容,才能代表 WMI 用戶端執行要求的作業。 從 Windows Vista 開始,缺少裝載模型定義的 WMI 提供者會執行,就像在 LocalSystem 下執行一樣,將無法正常執行。 若要更正這種情況,請變更預期的裝載模型,並藉由模擬WMI用戶端,確保WMI提供者程式代碼在用戶端安全性內容中執行作業。 LocalSystem 很少是需求。 如果您的提供者必須具有該層級的許可權,請在MOF檔案中使用下列語句指定裝載模型。
HostingModel=LocalSystemHost