提供程序托管和安全性

__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 属性中指定。

为提供程序设置托管模型

  1. 在定义提供程序的 MOF 文件中,创建 __Win32Provider 的实例。

  2. 在 Name 属性中为提供程序分配一个名称,并将提供程序 COM 对象的类标识符 (CLSID) 分配给 Clsid 属性。

    以下代码示例将名称分配给 Name 属性,并将提供程序 COM 对象的 CSLID 分配给 Clsid 属性。

    Instance of __Win32Provider as $NewProvider
    {
        Name = "MyProvider";
        Clsid = "{.......}";
    }
    
  3. 将适当的共享主机值分配给 HostingModel 属性。 共享主机值(例如“NetworkServiceHost”)在 MSFT_Providers 类的 HostingSpecification 属性中定义。

    以下代码示例将共享主机值分配给 HostingModel 属性。

    HostingModel = "NetworkServiceHost";
    

下面的代码示例演示如何在 NetworkServiceHost 中注册提供程序。

Instance of __Win32Provider as $NewProvider
{
    Name = "MyProvider";
    Clsid = "{.......}";
    HostingModel = "NetworkServiceHost";
}

如果有多个提供程序,可以通过注册提供程序将其分组到特定的服务主机中,使其驻留在特定实例中。

下面的代码示例也在 NetworkServiceHost 中注册提供程序。 MSFT_Providers 类定义了两个值的值,这两个值组合在一起创建 __Win32ProviderHostingModel 属性。 在示例中,“NetworkServiceHost”值来自 MSFT_Providers 的 HostingSpecification 属性,“LocalServiceHost”值来自 HostingGroup 属性。

Instance of __Win32Provider as $NewProvider
{
    Name = "MyProvider";
    Clsid = "{.......}";
    HostingModel = "NetworkServiceHost:MySharedHost";
}

对于未分离且托管在 Wmiprvse 进程中的提供程序,存在特殊的开发问题。 有关详细信息,请参阅调试提供程序

如果要编写包含属性或类提供程序注册的提供程序,则并非所有线程模型都起作用。 有关详细信息,请参阅选择正确的注册

进程内提供程序的 HostingModel 值

对于在 Wmiprvse.exe 进程中运行的提供程序,以下列表列出了要在 __Win32Provider 实例中使用的提供程序托管模型值。

__Win32Provider.HostingModel 中的值 说明
SelfHost 提供程序开始使用本地服务器实现而不是进程内实现。 运行提供程序的进程的安全性上下文决定了提供程序安全性上下文。
LocalSystemHost 如果作为进程内实现,提供程序会加载到在 LocalSystem 上下文下运行的共享提供程序主机中。 从 Windows Vista 开始,如果未指定 WMI 提供程序的 HostingModel(__Win32Provider.HostingModel 属性),LocalSystemHost 不再是默认托管模型。 有关详细信息,请参阅托管模型的安全性
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 值

以下列表列出了分离的提供程序的提供程序托管模型值。

Decoupled:Com

该提供程序是一个托管在单独进程中的分离的提供程序,该进程是一个 WMI 的客户端。

以下示例显示了将 HostingModel 属性设置为 FALSE 的 FoldIdentity 说明符,该说明符允许提供程序模拟客户端。

Decoupled:Com:FoldIdentity(FALSE)

如果未指定 FoldIdentity,则 FoldIdentity 值默认设置为 TRUE。 出于安全原因,建议不要指定 FoldIdentity(FALSE),因为模拟委托的流氓应用可能会影响整个域。

以下示例显示了按推荐方式设置的 HostingModel 属性,这种方式相当于设置 FoldIdentity(TRUE)。

Decoupled:Com

Decoupled:Noncom

仅限内部使用。 不支持。

托管模型的安全性

在大多数情况下,LocalSystem 是不必要的,NetworkServiceHost 上下文更合适。 大多数 WMI 提供程序必须模拟客户端安全性上下文,以代表 WMI 客户端执行请求的操作。 从 Windows Vista 开始,缺少托管模型定义并如同在 LocalSystem 下运行一样执行的 WMI 提供程序将无法正常运行。 要纠正这种情况,请更改预期的托管模型,并确保 WMI 提供程序代码通过模拟 WMI 客户端在客户端安全性上下文中执行操作。 LocalSystem 很少是必需项。 如果提供程序必须具有该级别的权限,请在 MOF 文件中使用以下语句指定托管模型。

HostingModel=LocalSystemHost

选择正确的注册

访问 WMI 命名空间

保护 WMI 命名空间

提供程序配置和故障排除类

MSFT_Providers

维护 WMI 安全性