提供程序托管和安全性

表示提供程序的 __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 属性分配一个名称,并为 Clsid 属性分配提供程序 COM 对象的 CSLID。

    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 类定义了两个值的值,这两个值结合在一起创建了 __Win32Provider HostingModel 属性。 在本例中,“NetworkServiceHost”值来自 MSFT_ProvidersHostingSpecification 属性,“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 提供程序(__Win32Provider.HostingModel 属性)的 HostingModel 未指定,则 LocalSystemHost 不再是默认的托管模型。 有关详细信息,请参阅托管模型的安全性
LocalSystemHostOrSelfHost 该提供程序是自托管的,或加载到在 LocalSystem 帐户下运行的 Wmiprvse.exe 进程中。 由于 LocalSystem 是一个高特权帐户,因此会在安全 NT 事件日志中生成一个条目,以通知管理员有一个提供程序在此受信任状态下运行。
NetworkServiceHost 如果作为进程内实现,则将该提供程序加载到在 NetworkService 帐户下运行的 Wmiprvse.exe 进程中。 从 Windows Vista 开始,如果 WMI 提供程序(__Win32Provider.HostingModel 属性)的 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 属性的 FoldIdentity 说明符设置为 FALSE,它允许提供程序模拟客户端。

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 安全性