Как надежно зафиксировать события входа в систему, выхода из системы, блокировки и разблокировки Windows из службы? - PullRequest
5 голосов
/ 06 октября 2009
using Microsoft.Win32; 

public class App 
{ 
  static void Main() 
  { 
    SystemEvents.SessionSwitch += SystemEvents_SessionSwitch; 
    Console.ReadLine();  
    SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch; 
  } 

  static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e) 
  { 
  if(e.Reason == SessionSwitchReason.SessionLock) 
  { 
    Console.WriteLine("locked at {0}", DateTime.Now); 
  } 
  if(e.Reason == SessionSwitchReason.SessionUnlock) 
  { 
    Console.WriteLine("unlocked at {0}", DateTime.Now); 
  } 
} 

Я создал службу Windows. Когда я перезагружаю систему и захожу, выхожу из системы, блокирую или разблокирую сеанс. это не будет захватывать событие. Служба работает, но она не будет работать должным образом.

Когда я перезапускаю сервис, он будет захватывать все события, как ожидалось. Как мне устранить неполадки / исправить это?

Ответы [ 2 ]

6 голосов
/ 07 октября 2009

Сделайте свой сервис зависимым от TermService (сервис терминальных услуг). Под прикрытием класс SystemEvents основан на функции Win32 WTSRegisterSessionNotification, которая задокументирована как , чтобы завершиться сбоем, если служба служб терминалов не была запущена к моменту ее вызова. При добавлении зависимости от TermService к вашему сервису этого не произойдет. Вы также можете подключиться к глобальному событию Global \ TermSrvReadyEvent, используя метод, подобный this , и подождать, пока зарегистрируется обработчик SystemEvent, до тех пор, пока не сработает событие TS "ready".

0 голосов
/ 22 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...