Написание поставщика ассоциаций для взаимодействия

Поставщик ассоциаций предоставляет механизм регистрации профилей и связывания их с профилями, реализованными в разных пространствах имен.

Поставщики ассоциаций используются для предоставления стандартных профилей, таких как энергетический профиль. Это достигается путем написания поставщика ассоциаций в пространстве имен root/interop, который предоставляет экземпляры ассоциации путем реализации класса, производного от CIM_RegisteredProfile. Поставщик должен быть зарегистрирован как в корневом/interop пространстве имен, так и в корневом/<реализованном> пространстве имен для поддержки обхода между пространствами имен.

Инструментарий управления Windows (WMI) загружает поставщика ассоциаций всякий раз, когда запрос ассоциации выполняется в пространстве имен root/interop.

Реализация поставщика ассоциаций для взаимодействия

  1. Создайте производный класс на основе CIM_RegisteredProfile и создайте статический экземпляр этого производного класса в пространстве имен root\interop. Как минимум, следующие свойства должны распространяться с допустимыми значениями:

    Несмотря на то что InstanceID однозначно определяет экземпляр CIM_RegisteredProfile, сочетание RegisteredName, RegisteredOrganizationи RegisteredVersion должно однозначно идентифицировать зарегистрированный профиль в пределах организации. Дополнительные сведения об отдельных свойствах см. в CIM_RegisteredProfile.

    В следующем примере кода описывается синтаксис для получения класса ProcessProfile из CIM_RegisteredProfile и заполнения статического экземпляра.

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

    Заметка

    Для клиентов Windows свойство RegisteredOrganization должно иметь значение 1, а для свойства OtherRegisteredOrganization задано значение Microsoft.

     

  2. Создайте поставщика, который возвращает экземпляры ассоциаций CIM_ElementConformsToProfile. Это двухэтапный процесс.

    1. Создайте класс, производный от CIM_ElementConformsToProfile в пространствах имен взаимодействия и реализации. Так как один и тот же профиль может быть реализован различными поставщиками, имя класса должно быть уникальным. Рекомендуемое соглашение об именовании — "<организация>_<НазваниеПродукта>_<НазваниеКласса>_<Версия>". Свойство ConformantStandard или ManagedElement должно указать квалификатор MSFT_TargetNamespace, содержащий пространство имен, к которому принадлежит этот класс.

      В следующем примере кода описывается синтаксис для получения класса Microsoft_Process_ElementConformsToProfile_v1 из CIM_ElementConformsToProfile в пространстве имен root\interop. В этом примере управляемый объект Win32_Process ссылается на пространство имен root\cimv2 с помощью квалификатора 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;
      };
      

      В следующем примере кода описывается синтаксис для получения класса Microsoft_Process_ElementConformsToProfile_v1 из CIM_ElementConformsToProfile в пространстве имен root\cimv2. В этом примере стандарт, соответствующий CIM_RegisteredProfile, ссылается на пространство имен root\interop с помощью квалификатора 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;
      };
      

      Если квалификатор MSFT_TargetNamespace не указан в свойстве, ссылающемся на реализованное пространство имен, фильтр ResultClass в выражении "Associators of" не будет работать. Например, если квалификатор MSFT_TargetNamespace не указан, следующая командная строка Windows PowerShell не вернет объект: get-wmiobject -query "ассоциаторы {ProcessProfile.InstanceID='Process'}, где resultclass='Win32_Process'".

      Квалификатор MSFT_TargetNamespace не может указывать на пространство имен на удаленном компьютере. Например, следующее пространство имен не поддерживается: MSFT_TargetNamespace(\\\\<RemoteMachine>\\root\\interop).

    2. Напишите функцию, которая возвращает экземпляры создаваемого производного класса. Для получения дополнительной информации см. создание поставщика экземпляров. При доступе к экземплярам между пространствами имен может потребоваться доступ к уровням безопасности для клиента. Дополнительные сведения см. в статье олицетворение клиента.

      Поставщик ассоциаций должен реализовать методы IWbemServices.CreateInstanceEnumAsync и должен реализовать методы IWbemServices.GetObjectAsync. Реализация метода IWbemServices.ExecQueryAsync является необязательным. Так как к этому поставщику можно получить доступ как из root\interop, так и из root\<реализовано>, не должно быть явной зависимости от пространства имен внутри поставщика.

  3. Зарегистрируйте поставщика ассоциаций как в корневом пространстве имен \взаимодействий, так и в корневом\пространстве имен<, реализованных в>. Дополнительные сведения см. в разделе Регистрация поставщика экземпляров.

    В следующем примере кода описывается синтаксис для регистрации поставщика ассоциаций в пространстве имен 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;
    };
    

    В следующем примере кода описывается синтаксис для регистрации поставщика ассоциаций в пространстве имен 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. Поместите схему CIM_ElementConformsToProfile в реализованное пространство имён. Для клиентов Windows это файл interop.mof, расположенный в папке %systemroot%\system32\wbem.

  5. Реализуйте интерфейс IWbemProviderInit для поставщика.

    WMI использует IWbemProviderInit для загрузки и инициализации поставщика. Метод IWbemProviderInit.Initialize должен быть реализован таким образом, чтобы его можно было вызывать для двух разных пространств имен. Для получения дополнительной информации см. Инициализация провайдера.

CIM_ElementConformsToProfile

CIM_RegisteredProfile

Создание поставщика экземпляров

Регистрация поставщика экземпляров