提供程序托管和安全

表示提供程序的 _ _ 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 属性设置为 "已分离: Com"。 通过在 .NET Framework 中通过添加检测类创建的提供程序是 分离的提供 程序。 (不支持 ) 。有关 创建分离的访问接口的详细信息,请参阅 在应用程序中合并提供程序

托管模型是在表示提供程序的 _ _ Win32Provider 实例中的 HostingModel属性中指定的。

设置提供程序的宿主模型

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

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

    下面的代码 示例将 name 属性的 名称和 provider 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 _ 提供程序类定义组合用来创建 _ _ Win32Provider HostingModel 属性的两个值的值。 在此示例中,"NetworkServiceHost" 值来自 MSFT _ 提供程序HostingSpecification 属性,而 "LocalServiceHost" 来自 HostingGroup 属性。

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

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

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

In-Process 提供程序的 HostingModel 值

以下列表列出了在 _ _ Win32Provider实例中用于在 Wmiprvse.exe 进程中运行的提供程序的宿主模型值。

_ _ 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 进程。 NetworkServiceHostOrSelfHost_ _ Win32Provider 中的 HostingModel属性为 NULL 时的默认配置。 由于 NetworkServiceHostOrSelfHost 是默认值,因此早期版本的操作系统中的提供程序可以在 windows Vista、windows Server 2008 和更高版本的操作系统中继续工作。
LocalServiceHost 如果提供程序作为进程内实现,则加载到在 LocalService 帐户下运行的 Wmiprvse.exe 进程。 这是建议的服务托管模型,因为 LocalService 的权限有限。

分离的提供程序的 HostingModel 值

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

分离: Com

提供程序是在独立的进程中托管的分离式提供程序,它是 WMI 的客户端。

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

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

选择正确的注册

访问 WMI 命名空间

保护 WMI 命名空间

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

MSFT _ 提供程序

维护 WMI 安全性