Хотелось бы поделиться личным опытом использования WMI в .Net приложениях.
Для начала немного теории: WMI — Windows Management Instrumentation, набор интерфейсов для управления операционной системой. Так как данная технология позволяет управлять компонентами системы и приложениями удаленно, она полюбилась многим системным администраторам. В одном проекте заказчики выдвинули нам отдельное требование, что бы была реализована возможность мониторить работу серверной части приложения через WMI. И я хочу поделиться с вами способами этой самой реализации.
Итак, для простоты примера, мы хотим через WMI узнать, когда последний раз наше приложение производило индексацию данных(подставить любое действие).
1. Добавлем референсы на следующие библиотеки:
— System.Configuration.Install
— System.Management
— System.Deployment
2. Пишем маленький класс, который и будет хранить информацию.
Для начала немного теории: 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.