Compartilhar via


Escrever um provedor de associação para interoperabilidade

Um provedor de associação fornece um mecanismo para registrar perfis e associá-los a perfis implementados em namespaces diferentes.

Os provedores de associação são usados para expor perfis padrão, como um perfil de energia. Isso é feito escrevendo um provedor de associação no namespace root/interop que expõe instâncias de associação implementando uma classe derivada da CIM_RegisteredProfile. O provedor deve ser registrado nos namespaces root/interop e root/<implemented> para dar suporte à passagem entre namespaces.

O WMI (Instrumentação de Gerenciamento do Windows) carrega o provedor de associação sempre que uma consulta de associação for executada no namespace root/interop.

Para implementar um provedor de associação para interoperabilidade

  1. Derive uma classe de CIM_RegisteredProfile e crie uma instância estática dessa classe derivada no namespace root\interop. No mínimo, as seguintes propriedades devem ser propagadas com valores válidos:

    Embora InstanceID defina exclusivamente a instância do CIM_RegisteredProfile, a combinação de RegisteredName, RegisteredOrganization e RegisteredVersion deve identificar exclusivamente o perfil registrado dentro do escopo da organização. Para obter mais informações sobre as propriedades individuais, consulte CIM_RegisteredProfile.

    O exemplo de código a seguir descreve a sintaxe para derivar a classe ProcessProfile da CIM_RegisteredProfile e preencher a instância estática.

    class ProcessProfile : CIM_RegisteredProfile
    {
    };
    
    instance of ProcessProfile as $PP
    {
         InstanceID = "Process";
         RegisteredName = "Process";
         RegisteredOrganization = "1"; // Set to "Other"
         OtherRegisteredOrganization = "Microsoft";
         RegisteredVersion = "1.0";
    };
    

    Observação

    Para clientes Windows, a propriedade RegisteredOrganization deve ser definida como 1 e a propriedade OtherRegisteredOrganization deve ser definida como "Microsoft".

     

  2. Crie um provedor que retorna instâncias de associação de CIM_ElementConformsToProfile. Esse é um processo de duas etapas.

    1. Crie uma classe derivada de CIM_ElementConformsToProfile nos namespaces de interoperabilidade e implementação. Como o mesmo perfil pode ser implementado por diferentes fornecedores, o nome da classe deve ser exclusivo. A convenção de nomenclatura recomendada é "<Organização>_<NomeDoProduto>_<NomeDaClasse>_<Versão>". A propriedade ConformantStandard ou ManagedElement deve especificar o qualificador MSFT_TargetNamespace que contém o namespace ao qual essa classe pertence.

      O exemplo de código a seguir descreve a sintaxe para derivar a classe Microsoft_Process_ElementConformsToProfile_v1 de CIM_ElementConformsToProfile no namespace root\interop. Neste exemplo, o elemento gerenciado Win32_Process faz referência ao namespace root\cimv2 usando o qualificador MSFT_TargetNamespace.

      #pragma namespace("\\\\.\\root\\interop")
      [Provider("ProcessAssociation"),Dynamic]
      Class Microsoft_Process_ElementConformsToProfile_v1: CIM_ElementConformsToProfile
      {
           CIM_RegisteredProfile ref ConformantStandard = $PP;
           [MSFT_TargetNamespace("root\\cimv2")]Win32_process ref ManagedElement = null;
      };
      

      O exemplo de código a seguir descreve a sintaxe para derivar a classe Microsoft_Process_ElementConformsToProfile_v1 de CIM_ElementConformsToProfile no namespace root\cimv2. Neste exemplo, o padrão CIM_RegisteredProfile compatível faz referência ao namespace root\interop usando o qualificador MSFT_TargetNamespace.

      #pragma namespace("\\\\.\\root\\cimv2")
      [Provider("ProcessAssociation"),Dynamic]
      Class Microsoft_Process_ElementConformsToProfile_v1: CIM_ElementConformsToProfile
      {
           [MSFT_TargetNamespace("root\\interop")] CIM_RegisteredProfile ref ConformantStandard = $PP;
           Win32_process ref ManagedElement = null;
      };
      

      Se o qualificador MSFT_TargetNamespace não for especificado na propriedade que está fazendo referência ao namespace implementado, o filtro ResultClass da instrução "Associators of" não funcionará. Por exemplo, se o qualificador MSFT_TargetNamespace não for especificado, a seguinte linha de comando do Windows PowerShell não retornará um objeto: get-wmiobject -query "associators of {ProcessProfile.InstanceID='Process'} where resultclass='Win32_Process'".

      O qualificador MSFT_TargetNamespace não pode apontar para um namespace em um computador remoto. Por exemplo, não há suporte para o namespace a seguir: MSFT_TargetNamespace(\\\\<RemoteMachine>\\root\\interop).

    2. Escreva um provedor que retorna instâncias da classe derivada criada. Para obter mais informações, consulte Escrever um provedor de instância. Ao acessar instâncias entre namespaces, talvez seja necessário acessar os níveis de segurança do cliente. Para obter mais informações, consulte Representar um cliente.

      O provedor de associação deve implementar os métodos IWbemServices.CreateInstanceEnumAsync e IWbemServices.GetObjectAsync. A implementação do método IWbemServices.ExecQueryAsync é opcional. Como esse provedor pode ser acessado nos namespaces root\interop e root\<implemented>, não deve haver uma dependência explícita em um namespace dentro do provedor.

  3. Registre o provedor de associação nos namespaces root\interop e root\<implemented>. Para obter mais informações, consulte Registrar um provedor de instância.

    O exemplo de código a seguir descreve a sintaxe para registrar o provedor de associação no namespace root\interop.

    #pragma namespace("\\\\.\\root\\interop")
    instance of __Win32Provider as $P
    {
        Name    = "ProcessAssociation" ;
        ClsId   = "{DA13393B-A2D5-4BAC-9BD2-30B092E9EBB8}";
    } ;
    
    instance of __InstanceProviderRegistration
    {
        Provider = $P;
        SupportsPut = false;
        SupportsGet = TRUE;
        SupportsDelete = false;
        SupportsEnumeration = TRUE;
    };
    

    O exemplo de código a seguir descreve a sintaxe para registrar o provedor de associação no namespace root\cimv2.

    #pragma namespace("\\\\.\\root\\cimv2")
    instance of __Win32Provider as $R
    {
        Name    = "ProcessAssociation" ;
        ClsId   = "{DA13393B-A2D5-4BAC-9BD2-30B092E9EBB8}";
    } ;
    
    instance of __InstanceProviderRegistration
    {
        Provider = $R;
        SupportsPut = false;
        SupportsGet = TRUE;
        SupportsDelete = false;
        SupportsEnumeration = TRUE;
    };
    
  4. Coloque o esquema do CIM_ElementConformsToProfile no namespace implementado. Para clientes Windows, esse é o arquivo interop.mof localizado na pasta %systemroot%\system32\wbem.

  5. Implemente a interface IWbemProviderInit em seu provedor.

    O WMI usa IWbemProviderInit para carregar e inicializar um provedor. O método IWbemProviderInit.Initialize deve ser implementado de forma a permitir que ele seja chamado para dois namespaces diferentes. Para obter mais informações, consulte Inicializar um provedor.

CIM_ElementConformsToProfile

CIM_RegisteredProfile

Escrever um provedor de instância

Registrar um provedor de instância