Поделиться через


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

Прежде чем реализовать вашего поставщика, необходимо сначала зарегистрировать его в 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 Регистрирует поставщика экземпляров.
    __РегистрацияПоставщикаСобытий Регистрирует поставщика событий .
    __EventConsumerProviderRegistration Регистрирует поставщика потребителей событий .
    __MethodProviderRegistration Регистрирует поставщика методов .
    __PropertyProviderRegistration Регистрирует поставщика свойств для свойства.

     

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

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

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

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

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

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

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

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