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 tenha um nível especificado de privilégio.

Processo de Host de Provedor Compartilhado

O WMI reside em um host de serviço compartilhado com vários outros serviços. Para evitar a interrupção de todos os serviços quando um provedor falha, os provedores são carregados em um processo de host separado chamado "Wmiprvse.exe". Mais de um processo com esse nome pode estar em execução. Cada um pode ser executado em uma conta diferente com segurança variável. Lembre-se de que, a partir do Windows Vista, use o comando winmgmt para executar o WMI em um processo separado por si só usando uma porta fixa. Para obter mais informações, consulte Conectando-se ao WMI remotamente começando com o Vista.

O host compartilhado pode ser executado em uma das seguintes contas do sistema em um processo de 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.

Definindo o modelo de hospedagem

Como LocalSystem é uma conta privilegiada, é recomendável que você defina 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 extensivos, 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 HostingModel for definido como LocalSystemHost, o WMI usará o rastreamento para gerar os 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 exibir esses eventos no Visualizador de Eventos. Para obter mais informações, confira Rastreando atividade do WMI.

Defina a propriedade HostingModel para provedores desacoplados como "Decoupled:Com". Os provedores criados pela adição de classes de instrumentação de 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 Incorporando 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 de um provedor

  1. No arquivo MOF que define seu 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 o 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 de 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 em 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 seu provedor para que ele resida na instância específica.

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

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

Existem problemas especiais de desenvolvimento para provedores que não são desacoplados e são hospedados no processo Wmiprvse. Para obter mais informações, veja Provedores de depuração.

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

Valores de HostingModel para provedores em processo

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

Valor em __Win32Provider.HostingModel Descrição
SelfHost O provedor começa a usar a implementação do servidor local em vez de em 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 . A partir do Windows Vista, LocalSystemHost não será mais o modelo de hospedagem padrão se o HostingModel de um provedor WMI (__Win32Provider.HostingModel) não é especificado. Para saber mais, 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 LocalSystem é uma conta altamente privilegiada, uma entrada é gerada no Log de Eventos do NT de Segurança para notificar os administradores de um provedor em execução nesse status confiável.
NetworkServiceHost O provedor, se implementado como em processo, é carregado no processo Wmiprvse.exe em execução na conta NetworkService. A partir do Windows Vista, esse é o modelo de hospedagem padrão se o HostingModel de um provedor WMI (__Win32Provider.HostingModel) não é especificado. Para saber mais, confira Segurança de modelos de hospedagem.
NetworkServiceHost tem privilégios limitados e, portanto, reduz a possibilidade de um ataque de elevação de privilégio. Se o provedor operar 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 em __Win32Provider é NULL. Como NetworkServiceHostOrSelfHost é o padrão, os provedores de sistemas operacionais anteriores podem continuar a funcionar no Windows Vista, Windows Server 2008 e 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 o LocalService tem privilégios limitados.

Valores de HostingModel para provedores desacoplados

A lista a seguir lista 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 para o WMI.

O exemplo a seguir mostra o especificador FoldIdentity para a propriedade HostingModel definida como FALSE, 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 não autorizado com representação de Delegate pode afetar um domínio inteiro.

O exemplo a seguir mostra a propriedade HostingModel definida da maneira recomendada que é equivalente à configuração FoldIdentity(TRUE).

Decoupled:Com

Desacoplado:Noncom

Somente para uso Interno. Não há suporte.

Segurança de modelos de hospedagem

Para a maioria das situações, LocalSystem é desnecessário 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. A partir do Windows Vista, um provedor WMI que não tem uma definição de modelo de hospedagem e é executado como se estivesse sendo executado em LocalSystem não será executado corretamente. Para corrigir essa situação, altere o modelo de hospedagem esperado e verifique 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

Escolhendo o registro correto

Acesso a namespaces do WMI

Proteger namespaces do WMI

Configuração do provedor e classes de solução de problemas

MSFT_Providers

Mantendo a segurança do WMI