Как стать автором
Обновить

О WMI замолвите слово…

Хотелось бы поделиться личным опытом использования WMI в .Net приложениях.
Для начала немного теории: WMI — Windows Management Instrumentation, набор интерфейсов для управления операционной системой. Так как данная технология позволяет управлять компонентами системы и приложениями удаленно, она полюбилась многим системным администраторам. В одном проекте заказчики выдвинули нам отдельное требование, что бы была реализована возможность мониторить работу серверной части приложения через WMI. И я хочу поделиться с вами способами этой самой реализации.



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

1. Добавлем референсы на следующие библиотеки:

— System.Configuration.Install
— System.Management
— System.Deployment

2. Пишем маленький класс, который и будет хранить информацию.

//Будем использовать инструментарий экземпляра
[InstrumentationClass(InstrumentationType.Instance)]
public class WMIServer
{
  /// <summary>
  /// Имя нашего приложения, необходимо для создания запроса на WQL
  /// </summary>
  public string Name;
  
  /// <summary>
  /// Время последей операции
  /// </summary>
  public string LastUpdateTime;
}


* This source code was highlighted with Source Code Highlighter.

3. Также для удобства пишем следующий класс:

/// <summary>
/// Класс-обертка для удобства :)
/// </summary>
public class WMIServerManager
{
  /// <summary>
  /// Собственно информация, публикуемая в WMI
  /// </summary>
  private WMIServer _wmiServer;

  /// <summary>
  /// Регистрируем наш объект в подсистеме WMI
  /// </summary>
  public void Register()
  {
    _wmiServer = new WMIServer();
    _wmiServer.Name = "WMI-Test-Server";
    _wmiServer.LastUpdateTime = DateTime.Now.ToLongTimeString();
    //Публикуем нашу информацию в WMI
    Instrumentation.Publish(_wmiServer);
  }

  /// <summary>
  /// Обновляем информацию
  /// </summary>
  public void Fire()
  {
    //Устанавливаем текущее время
    _wmiServer.LastUpdateTime = DateTime.Now.ToLongTimeString();
    //Обновляем информацию в WMI
    Instrumentation.Fire(_wmiServer);
  }
}


* This source code was highlighted with Source Code Highlighter.

4. Также, наша сборка должна быть зарегистирована. Класс представленный ниже нужен именно для этого. Что бы зарегистрировать сборку у нас есть 2 пути: использовать утилиту Installutil.exe, которая входит в SDK, или создать средствами VisualStudio установочный пакет вашей программы.

/// <summary>
/// Данный класс необходим для регистрации нашей сборки в подсистеме WMI
/// </summary>
[RunInstaller(true)]
public class MyInstaller : DefaultManagementProjectInstaller
{
}


* This source code was highlighted with Source Code Highlighter.

5. Также нам нужно указать, что наша сборка предоставляет инструментарий управления. Это делается с помощью следующего атрибута:

[assembly: Instrumented("root/default")]

* This source code was highlighted with Source Code Highlighter.

6. Мы подошли к самому интересному ;)

//Создаем наш класс-обертку
WMIServerManager manager = new WMIServerManager();
//Регистрируемся. Это можно сделать и в конструкторе нашего вспомогательного класса, но на вкус и цвет...
manager.Register();
while (_active)//Основной рабочий цикл нашего мега-приложения
{
  //Что то делаем
  DoAnything();
  //Отписываемся в WMI, что мы что то сделали :)
  manager.Fire();
}


* This source code was highlighted with Source Code Highlighter.

Вуаля, теперь мы можем удаленно, используя различный инструментарий, мониторить наше приложение.

Пример очень прост, и если вы заинтересовались данной темой, то советую изучить пространство имен System.Management.Instrumentation.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.