Hospedagem e segurança do provedor

A propriedade HostingModel na instância __Win32Provider que representa seu provedor especifica o modelo de hospedagem do provedor. Definir essa propriedade faz com que o provedor seja carregado em um processo de host compartilhado que tem um nível de privilégio especificado.

Processo de host de provedor compartilhado

O WMI reside em um host de serviço compartilhado com vários outros serviços. Para evitar interromper todos os serviços durante a falha de um provedor, os provedores são carregados em um processo host separado chamado "Wmiprvse.exe". Pode haver mais de um processo com esse nome em execução. Cada um deles pode ser executado em uma conta diferente com diferentes níveis de segurança. Esteja ciente de que, do Windows Vista em diante, é possível usar o comando winmgmt para executar o WMI em um processo separado por si só usando uma porta fixa. Para obter mais informações, confira Conectar-se remotamente ao WMI do Vista em diante.

O host compartilhado pode ser executado em uma das seguintes contas do sistema em um processo host Wmiprvse.exe:

Um provedor também pode ser um servidor COM local (.exe) ou auto-hospedado, o que não requer um host de provedor WMI.

Como definir o modelo de hospedagem

Como LocalSystem é uma conta privilegiada, é recomendável definir HostingModel como NetworkServiceHost quando um provedor estiver em execução em um processo Wmiprvse.exe. A conta NetworkServiceHost é para serviços que não exigem privilégios extensos, mas precisam se comunicar remotamente com outros sistemas.

Se você não definir um valor para a propriedade HostingModel, o WMI definirá um valor padrão de NetworkServiceHostOrSelfHost. Se o valor da HostingModel estiver definido como LocalSystemHost, o WMI usará o rastreamento para gerar eventos 5603 e 5604 no Log de Eventos do Windows. Como a conta LocalSystem local é altamente privilegiada, essa configuração não é recomendada. Você pode ver esses eventos no Visualizador de Eventos. Para obter mais informações, confira Rastreamento da atividade do WMI.

Defina a propriedade HostingModel para provedores desacoplados como "Decoupled:Com". Os provedores criados pela adição de classes de instrumentação da Microsoft.Management.Infrastructure no .NET Framework são provedores desacoplados. (Não há mais suporte para System.Management.Instrumentation). Para obter mais informações sobre como criar um provedor desacoplado, consulte Como incorporar um provedor em um aplicativo.

O modelo de hospedagem é especificado na propriedade HostingModel na instância __Win32Provider que representa seu provedor.

Para definir o modelo de hospedagem para um provedor

  1. No arquivo MOF que define o provedor, crie uma instância de __Win32Provider.

  2. Atribua um nome ao provedor na propriedade Name e atribua o CLSID (identificador de classe) do objeto COM do provedor à propriedade Clsid.

    O exemplo de código a seguir atribui um nome à propriedade Name e ao CSLID do objeto COM do provedor à propriedade Clsid.

    Instance of __Win32Provider as $NewProvider
    {
        Name = "MyProvider";
        Clsid = "{.......}";
    }
    
  3. Atribua o valor de host compartilhado apropriado à propriedade HostingModel. Valores de host compartilhados, como "NetworkServiceHost", são definidos na propriedade HostingSpecification da classe MSFT_Providers.

    O exemplo de código a seguir atribui um valor de host compartilhado à propriedade HostingModel.

    HostingModel = "NetworkServiceHost";
    

O exemplo de código a seguir mostra como registrar um provedor no NetworkServiceHost.

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

Se você tiver vários provedores, poderá agrupá-los em um host de serviço específico registrando o provedor para que ele resida na instância específica.

O exemplo de código a seguir também registra um provedor no NetworkServiceHost. A classe MSFT_Providers define valores para os dois valores que se combinam para criar a propriedade __Win32ProviderHostingModel. No exemplo, o valor "NetworkServiceHost" vem da propriedade HostingSpecification de MSFT_Providers e o "LocalServiceHost" vem da propriedade HostingGroup.

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

Há problemas específicos no desenvolvimento para provedores que não são desacoplados e são hospedados no processo Wmiprvse. Para obter mais informações, confira Depuração de provedores.

Se você estiver escrevendo um provedor que contém registro de provedor de propriedade ou classe, nem todos os modelos de threading funcionarão. Para obter mais informações, consulte Como escolher o registro correto.

Valores de HostingModel para provedores In-Process

A lista a seguir mostra os valores de modelo de hospedagem do provedor a serem usados na instância __Win32Provider para provedores executados em um processo Wmiprvse.exe.

Valor no __Win32Provider.HostingModel Descrição
SelfHost O provedor começa usando a implementação do servidor local em vez da implementação no processo. O contexto de segurança do processo no qual o provedor é executado determina o contexto de segurança do provedor.
LocalSystemHost O provedor, se implementado como em processo, é carregado em um host de provedor compartilhado em execução no contexto LocalSystem. Começando com o Windows Vista, o LocalSystemHost não é mais o modelo de hospedagem padrão se o HostingModel de um provedor WMI (propriedade __Win32Provider.HostingModel) não é especificado. Para obter mais informações, confira Segurança de modelos de hospedagem.
LocalSystemHostOrSelfHost O provedor é auto-hospedado ou carregado no processo Wmiprvse.exe em execução na conta LocalSystem. Como a LocalSystem é uma conta altamente privilegiada, uma entrada é gerada no Log de Eventos NT de Segurança para notificar os administradores de um provedor em execução neste status de confiança.
NetworkServiceHost O provedor, se implementado como em processo, é carregado no processo Wmiprvse.exe em execução na conta NetworkService. Do Windows Vista em diante, esse é o modelo de hospedagem padrão se o HostingModel de um provedor WMI (propriedade __Win32Provider.HostingModel) não é especificado. Para obter mais informações, confira Segurança de modelos de hospedagem.
A NetworkServiceHost tem privilégios limitados e, portanto, reduz a possibilidade de um ataque de elevação de privilégios. Se o provedor opera apenas no computador local, defina a propriedade HostingModel como LocalServiceHost.
NetworkServiceHostOrSelfHost O provedor é auto-hospedado ou carregado no processo WmiPrvse.exe em execução na conta NetworkService. NetworkServiceHostOrSelfHost é a configuração padrão quando a propriedade HostingModel no __Win32Provider é NULL. Como NetworkServiceHostOrSelfHost é o padrão, os provedores de sistemas operacionais anteriores podem continuar a funcionar no Windows Vista, no Windows Server 2008 e em sistemas operacionais posteriores.
LocalServiceHost O provedor, se implementado como em processo, é carregado no processo Wmiprvse.exe em execução na conta LocalService. Esse é o modelo de hospedagem recomendado para serviços porque a LocalService tem privilégios limitados.

Valores de HostingModel para provedores desacoplados

A lista a seguir mostra os valores do modelo de hospedagem do provedor para provedores desacoplados.

Decoupled:Com

O provedor é um provedor desacoplado hospedado em um processo separado que é um cliente do WMI.

O exemplo a seguir mostra o especificador FoldIdentity para a propriedade HostingModel definida como FALSE, o que permite que o provedor represente o cliente.

Decoupled:Com:FoldIdentity(FALSE)

Se FoldIdentity não for especificado, o valor de FoldIdentity será definido como TRUE por padrão. Por motivos de segurança, é recomendável que você não especifique FoldIdentity(FALSE), pois um aplicativo invasor com representação de Delegado poderá afetar um domínio inteiro.

O exemplo a seguir mostra a propriedade HostingModel definida da maneira recomendada que é equivalente a definir FoldIdentity(TRUE).

Decoupled:Com

Decoupled:Noncom

Apenas para uso interno. Sem suporte.

Segurança de modelos de hospedagem

Para a maioria das situações, LocalSystem é desnecessária e o contexto NetworkServiceHost é mais apropriado. A maioria dos provedores WMI deve representar o contexto de segurança do cliente para executar as operações solicitadas em nome do cliente WMI. Do Windows Vista em diante, um provedor WMI que não tem uma definição de modelo de hospedagem e é executado como se estivesse em execução na LocalSystem não será executado corretamente. Para corrigir essa situação, altere o modelo de hospedagem esperado e confirme se o código do provedor WMI executa as operações no contexto de segurança do cliente representando o cliente WMI. LocalSystem raramente é um requisito. Se o provedor precisar ter esse nível de privilégio, especifique o modelo de hospedagem com a instrução a seguir no arquivo MOF.

HostingModel=LocalSystemHost

Como escolher o registro correto

Acesso a namespaces do WMI

Como proteger namespaces do WMI

Classes de configuração e solução de problemas do provedor

MSFT_Providers

Manutenção da segurança do WMI