Регистрация поставщика

Перед реализацией поставщика необходимо сначала зарегистрировать его с помощью WMI. Регистрация поставщика определяет тип поставщика и классы, поддерживаемые поставщиком. WMI может получить доступ только к зарегистрированным поставщикам.

Примечание

Дополнительные сведения о регистрации поставщика MI см. в разделе Практическое руководство. Регистрация поставщика MI.

 

Вы можете написать код поставщика перед регистрацией поставщика. Однако очень сложно выполнить отладку поставщика, который не зарегистрирован в WMI. Определение интерфейсов для поставщика также помогает определить назначение и структуру поставщика. Таким образом, регистрация поставщика помогает спроектировать поставщика.

Только администраторы могут зарегистрировать или удалить поставщика.

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

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

Для каждого типа регистрации используется один и тот же экземпляр __Win32Provider :

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

В следующем примере показан MOF-файл, который создает и регистрирует экземпляр поставщика системного реестра в пространстве имен root\cimv2. Он назначает поставщику $Reg псевдонима, чтобы избежать длинного пути, необходимого для регистрации экземпляра и метода. Дополнительные сведения см. в разделе Создание псевдонима.

// Place the Registry provider in the root\cimv2 namespace
#pragma namespace("\\\\.\\ROOT\\cimv2")

// Create an instance of __Win32Provider
instance of __Win32Provider as $Reg
{
Name = "RegProv";        
CLSID = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
HostingModel = "NetworkServiceHost:LocalServiceHost";
};

// Register as an instance provider by
// creating an instance
// of __InstanceProviderRegistration
instance of __InstanceProviderRegistration
{
 provider = $Reg;
 SupportsDelete = FALSE;
 SupportsEnumeration = TRUE;
 SupportsGet = TRUE;
 SupportsPut = TRUE;
};

// Register as a method provider by
// creating an instance
// of __MethodProviderRegistration
instance of __MethodProviderRegistration
{
 provider = $Reg;
};

// Define the StdRegProv class
[dynamic: ToInstance, provider("RegProv")]
class StdRegProv
{
[implemented, static] uint32 CreateKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName);
[implemented, static] uint32 DeleteKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName);
[implemented, static] uint32 EnumKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [OUT] string sNames[]);
[implemented, static] uint32 EnumValues(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [OUT] string sNames[], 
 [OUT] sint32 Types[]);
[implemented, static] uint32 DeleteValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName);
 [implemented, static] uint32 SetDWORDValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] uint32 uValue = 3);
[implemented, static] uint32 GetDWORDValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] uint32 uValue);
[implemented, static] uint32 SetStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue = "hello");
[implemented, static] uint32 GetStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [in] string sValueName, 
 [OUT] string sValue);
[implemented, static] uint32 SetMultiStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue[] = {"hello", "there"});
[implemented, static] uint32 GetMultiStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] string sValue[]);
[implemented, static] uint32 SetExpandedStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue = "%path%");
[implemented, static] uint32 GetExpandedStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] string sValue);
[implemented, static] uint32 SetBinaryValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [in] string sValueName, 
 [in] uint8 uValue[] = {1, 2});
[implemented, static] uint32 GetBinaryValue(
 {IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] uint8 uValue[]);
[implemented, static] uint32 CheckAccess(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] uint32 uRequired = 3, 
 [OUT] boolean bGranted);
};

Пример. Регистрация поставщика

В следующей процедуре описывается регистрация поставщика.

Регистрация поставщика

  1. Зарегистрируйте поставщика в качестве COM-сервера.

    При необходимости может потребоваться создать записи реестра. Этот процесс применяется ко всем COM-серверам и не связан с WMI. Дополнительные сведения см. в разделе COM документации по пакету средств разработки программного обеспечения (SDK) Microsoft Windows.

  2. Создайте MOF-файл, содержащий экземпляры __Win32Provider и экземпляр класса, прямо или косвенно производный от __ProviderRegistration, например __InstanceProviderRegistration. Только администраторы могут регистрировать или удалять поставщик, создавая экземпляры классов, производных от __Win32Provider или __ProviderRegistration.

  3. Задайте HostingModel в экземпляре __Win32Provider в соответствии со значениями в моделях размещения.

    Примечание

    Если поставщику не требуются высокие привилегии учетной записи LocalSystem, для свойства __Win32Provider.HostingModel должно быть задано значение NetworkServiceHost. Дополнительные сведения см. в разделе Размещение и безопасность поставщика.

     

    В следующем примере MOF из полного примера показан код, который создает экземпляр __Win32Provider.

    instance of __Win32Provider as $Reg
    {
    Name = "RegProv";        
    CLSID = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
    HostingModel = "NetworkServiceHost:LocalServiceHost";
    };
    
  4. Экземпляр класса, производного прямо или косвенно от __ProviderRegistration, чтобы описать логическую реализацию поставщика. Поставщик может быть зарегистрирован для нескольких различных типов функциональных возможностей. В приведенном выше примере regProv регистрируется как поставщик экземпляра и метода. Но если RegProv поддерживает эту функцию, она также может быть зарегистрирована как свойство или поставщик событий. В следующей таблице перечислены классы, которые регистрируют функциональные возможности поставщика.

    Классы регистрации поставщиков Описание
    __InstanceProviderRegistration Регистрирует поставщика экземпляров.
    __EventProviderRegistration Регистрирует поставщика событий.
    __EventConsumerProviderRegistration Регистрирует поставщика потребителя событий.
    __MethodProviderRegistration Регистрирует поставщика метода.
    __PropertyProviderRegistration Регистрирует поставщик свойств.

     

  5. Поместите MOF-файл в постоянный каталог.

    Как правило, файл следует поместить в каталог установки поставщика.

  6. Скомпилируйте MOF-файл с помощью mofcomp или интерфейса IMofCompiler .

    Дополнительные сведения см. в разделе Компиляция MOF-файлов.

    Windows 8 и Windows Server 2012. При установке поставщиков интерфейс mofcomp и IMofCompiler считают квалификаторы [Key] и [Static] истинными, если они присутствуют, независимо от их фактических значений. Другие квалификаторы обрабатываются как false, если они присутствуют, но не имеют явного значения true.

Разработка поставщика WMI

Настройка дескрипторов безопасности в среде имен

Защита поставщика