Condividi tramite


Scrittura di un provider di associazioni per l'interoperabilità

Un provider di associazioni fornisce un meccanismo per registrare i profili e associarli ai profili implementati in diversi namespace.

I fornitori di associazione vengono utilizzati per esporre profili standard, come un profilo di alimentazione. Questo si ottiene scrivendo un fornitore di associazioni nel namespace root/interop che espone le istanze di associazione implementando una classe, derivata dalla CIM_RegisteredProfile. Il provider deve essere registrato sia nel namespace radice/interoperabilità che nel namespace radice/<implementato>, per supportare l'attraversamento tra namespace.

Strumentazione gestione Windows (WMI) carica il provider di associazione ogni volta che viene eseguita una query di associazione nel namespace root/interop.

Per implementare un fornitore di associazioni per l'interoperabilità

  1. Derivare una classe da CIM_RegisteredProfile e creare un'istanza statica di questa classe derivata nello spazio dei nomi root\interop. Come minimo, è necessario propagare le proprietà seguenti con valori validi:

    Anche se InstanceID definisce in modo univoco l'istanza del CIM_RegisteredProfile, la combinazione di RegisteredName, RegisteredOrganizatione RegisteredVersion deve identificare in modo univoco il profilo registrato nell'ambito dell'organizzazione. Per altre informazioni sulle singole proprietà, vedere CIM_RegisteredProfile.

    Nell'esempio di codice seguente viene descritta la sintassi per derivare la classe ProcessProfile da CIM_RegisteredProfile e popolare l'istanza statica.

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

    Nota

    Per i client Windows, la proprietà RegisteredOrganization deve essere impostata su 1 e la proprietà OtherRegisteredOrganization impostata su "Microsoft".

     

  2. Creare un provider che restituisca istanze di associazione di CIM_ElementConformsToProfile. Si tratta di un processo in due passaggi.

    1. Creare una classe derivata da CIM_ElementConformsToProfile nei namespace interop e implementazione. Poiché lo stesso profilo può essere implementato da fornitori diversi, il nome della classe deve essere univoco. La convenzione di denominazione consigliata è "<Organization>_<ProductName>_<ClassName>_<Version>". L'ConformantStandard o la proprietà ManagedElement deve specificare il qualificatore MSFT_TargetNamespace che contiene lo spazio dei nomi a cui appartiene questa classe.

      Nell'esempio di codice seguente viene descritta la sintassi per derivare la classe Microsoft_Process_ElementConformsToProfile_v1 da CIM_ElementConformsToProfile nello spazio dei nomi root\interop. In questo esempio, l'elemento gestito Win32_Process fa riferimento allo spazio dei nomi root\cimv2 usando il qualificatore 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;
      };
      

      Nell'esempio di codice seguente viene descritta la sintassi per derivare la classe Microsoft_Process_ElementConformsToProfile_v1 da CIM_ElementConformsToProfile nello spazio dei nomi root\cimv2. In questo esempio, lo standard conforme CIM_RegisteredProfile fa riferimento allo spazio dei nomi root\interop usando il qualificatore 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 il qualificatore MSFT_TargetNamespace non viene specificato nella proprietà che fa riferimento allo spazio dei nomi implementato, il filtro "Associators of" nella dichiarazione ResultClass non funzionerà. Ad esempio, se il qualificatore di MSFT_TargetNamespace non viene specificato, la riga di comando di Windows PowerShell seguente non restituirà un oggetto: get-wmiobject -query "associators of {ProcessProfile.InstanceID='Process'} where resultclass='Win32_Process'".

      Il qualificatore MSFT_TargetNamespace non può puntare a uno spazio dei nomi in un computer remoto. Ad esempio, il seguente namespace non è supportato: MSFT_TargetNamespace(\\\\<RemoteMachine>\\root\\interop).

    2. Scrivere un provider che restituisce istanze della classe derivata creata. Per altre informazioni, vedere Scrittura di un provider di istanze. Quando si accede a istanze dello spazio dei nomi incrociato, potrebbe essere necessario accedere ai livelli di sicurezza per il client. Per altre informazioni, vedere Sostituzione di un cliente.

      Il provider di associazioni deve implementare sia il IWbemServices.CreateInstanceEnumAsync che IWbemServices.GetObjectAsync. L'implementazione del metodo IWbemServices.ExecQueryAsync è facoltativa. Poiché è possibile accedere a questo provider sia nello spazio dei nomi root\interop che in quelli root\<implementati>, non ci dovrebbe essere alcuna dipendenza esplicita da uno spazio dei nomi nel provider.

  3. Registrare il provider di associazioni negli spazi dei nomi root\interop e root\<implementati>. Per ulteriori informazioni, consultare Registrazione di un provider di istanze.

    Nell'esempio di codice seguente viene descritta la sintassi per registrare il provider di associazioni nello spazio dei nomi 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;
    };
    

    Nell'esempio di codice seguente viene descritta la sintassi per registrare il provider di associazioni nello spazio dei nomi 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. Posizionare lo schema per CIM_ElementConformsToProfile nello spazio dei nomi implementato. Per i client Windows si tratta del file interop.mof che si trova nella cartella %systemroot%\system32\wbem.

  5. Implementare l'interfaccia IWbemProviderInit per il proprio provider.

    WMI usa IWbemProviderInit per caricare e inizializzare un provider. Il metodo IWbemProviderInit.Initialize deve essere implementato in modo da poter essere chiamato per due spazi dei nomi diversi. Per ulteriori informazioni, consultare Inizializzazione di un provider.

CIM_ElementConformsToProfile

CIM_RegisteredProfile

Sviluppo di un provider di istanze

Registrazione di un provider di istanze