Получить причину завершения работы Windows Server в C # - PullRequest
1 голос
/ 22 августа 2009

Можно ли получить причину выключения в Windows Server 2008 сразу после того, как пользователь выберет причину в диалоговом окне? Для события завершения работы я использую SystemEvents.SessionEnding. Я хочу написать службу Windows, которая будет отправлять электронную почту об этом событии.

Или есть ли другой способ на сервере Windows отправлять электронные письма о событии shutdown / restart с получением причины, введенной пользователем? Кроме того, я хочу уведомить об изменении источника питания (электрическая линия / батарея), но это я уже решил Kernel32.dll> GetSystemPowerStatus.

Ответы [ 2 ]

5 голосов
/ 22 августа 2009

Вы можете узнать причину отключения, изучив EventLog.

Я собрал небольшую демонстрацию по Windows Forms, которую можно адаптировать к своей службе Windows.

Я добавил компонент EventLog в форму и настроил его правильно. Фрагмент ниже показывает код, сгенерированный в InitializeComponent () для настроек, которые я отправил через конструктор.


this.eventLog1.EnableRaisingEvents = true;
this.eventLog1.Log = "System";
this.eventLog1.Source = "USER32";
this.eventLog1.SynchronizingObject = this;
this.eventLog1.EntryWritten += new System.Diagnostics.EntryWrittenEventHandler(this.eventLog1_EntryWritten);

В обработчике событий у вас будет что-то вроде следующего:


private void eventLog1_EntryWritten(object sender, System.Diagnostics.EntryWrittenEventArgs e)
{
    EventLogEntry entry = e.Entry;
    if (e.Entry.EventID == 1074)
    {
        File.AppendAllText(@"c:\message.txt", entry.Message);
    }
}

Взгляните на свой журнал событий, чтобы увидеть соответствующие EventIds для фильтрации.

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

0 голосов
/ 22 августа 2009

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

...