Scrittura di un provider di associazione per l'interoperabilità

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

I provider di associazioni vengono usati per esporre profili standard, ad esempio un profilo di alimentazione. Questa operazione viene eseguita scrivendo un provider di associazioni nello spazio dei nomi radice/ interoperabilità che espone le istanze di associazione implementando una classe, derivata da CIM_RegisteredProfile. Il provider deve essere registrato sia nella radice che nell'interoperabilità e nello spazio dei nomi radice/<implementato> per supportare l'attraversamento tra spazi dei nomi.

Strumentazione gestione Windows carica il provider di associazione ogni volta che viene eseguita una query di associazione nello spazio dei nomi radice/interoperabilità.

Per implementare un provider 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 radice\interoperabilità. Almeno, le proprietà seguenti devono essere propagate con valori validi:

    Anche se InstanceID definisce in modo univoco l'istanza del CIM_RegisteredProfile, la combinazione di RegisteredName, RegisteredOrganization e 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 restituisce istanze di associazione di CIM_ElementConformsToProfile. Si tratta di un processo in due passaggi.

    1. Creare una classe derivata da CIM_ElementConformsToProfile negli spazi dei nomi di interoperabilità e implementazione. Poiché lo stesso profilo può essere implementato da diversi fornitori, il nome della classe deve essere univoco. La convenzione di denominazione consigliata è "Organization_ProductName_<ClassName>>_<Version>".<>< La proprietà ConformantStandard o ManagedElement deve specificare il qualificatore MSFT_TargetNamespace contenente 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 radice\interoperabilità. 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, il CIM_RegisteredProfile standard conforme fa riferimento allo spazio dei nomi radice\interoperabilità 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, l'istruzione ResultClass di "Associators of" non funzionerà. Ad esempio, se il qualificatore di Windows PowerShell MSFT_TargetNamespace non è specificato, la riga di comando 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, lo spazio dei nomi seguente 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 tra spazi dei nomi, potrebbe essere necessario accedere ai livelli di sicurezza per il client. Per altre informazioni, vedere Rappresentazione di un client.

      Il provider di associazione deve implementare entrambi i metodi IWbemServices.CreateInstanceEnumAsync e IWbemServices.GetObjectAsync . L'implementazione del metodo IWbemServices.ExecQueryAsync è facoltativa. Poiché questo provider può essere accessibile sia dagli spazi dei nomi radice\interoperabilità che dagli spazi dei nomi radice\<implementati> , non deve essere presente una dipendenza esplicita da uno spazio dei nomi all'interno del provider.

  3. Registrare il provider di associazione sia negli spazi dei nomi radice\interoperabilità sia negli spazi dei nomi radice\<implementati> . Per altre informazioni, vedere Registrazione di un provider di istanze.

    Nell'esempio di codice seguente viene descritta la sintassi per registrare il provider di associazione nello spazio dei nomi radice\interp.

    #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 associazione 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. Inserire lo schema per il CIM_ElementConformsToProfile nello spazio dei nomi implementato. Per i client Windows, questo è il file interop.mof che si trova nella cartella %systemroot%\system32\wbem.

  5. Implementare l'interfaccia IWbemProviderInit per il 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 altre informazioni, vedere Inizializzazione di un provider.

CIM_ElementConformsToProfile

CIM_RegisteredProfile

Scrittura di un provider di istanze

Registrazione di un provider di istanze