2016-10-29 5 views
0

Извинитесь раньше времени, если я не правильно отпечатал свой код, это мой первый пост. Поэтому моей конечной целью является создание службы Windows, которая отслеживает события, когда запускается процесс notepad.exe и в ответ запускается файл mspaint.exe. Это мой первый опыт работы с Windows Services, но я смог заставить этот код работать как консольное приложение и как служба Windows в режиме отладки. Тем не менее, всякий раз, когда я пытаюсь установить его и тестировать в качестве выпуска, он устанавливается отлично и запускается без проблем, но когда я запускаю notepad.exe, ничего не происходит.ManagementEventWatcher на службе Windows работает в отладке, но не на установке

**MyNewService.cs** 
public MyNewService() 
{ 
InitializeComponent(); 
System.IO.File.Create(AppDomain.CurrentDomain.BaseDirectory +"Initialized.txt"); 
} 
public void OnDebug() 
{ 
OnStart(null); 
} 
protected override void OnStart(string[] args) 
{ 
WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1), "TargetInstance isa \"Win32_Process\""); 
ManagementEventWatcher watcher = new ManagementEventWatcher(query); 
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived); 
watcher.Start(); 
} 
protected override void OnStop() 
{ 
System.IO.File.Create(AppDomain.CurrentDomain.BaseDirectory + "OnStop.txt"); 
} 

static void watcher_EventArrived(object sender, EventArrivedEventArgs e) 
{ 
string instanceName = ((ManagementBaseObject)e.NewEvent["TargetInstance"])["Name"].ToString(); 
if (instanceName.ToLower() == "notepad.exe") 
{ 
Process.Start("mspaint.exe"); 
} 
} 
} 
**Main Program** 
static class Program 
{ 
/// <summary> 
/// The main entry point for the application. 
/// </summary> 
static void Main(string[] args) 
{ 
#if DEBUG 
MyNewService myService = new MyNewService(); 
myService.OnDebug(); 
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite); 
#else 
ServiceBase[] ServicesToRun; 
ServicesToRun = new ServiceBase[] 
{ 
new MyNewService() 
}; 
ServiceBase.Run(ServicesToRun); 
#endif 
} 
} 

ответ

0

РЕШИТЬ:

Установлено, что служба делает на самом деле работы. Проблема заключалась в том, что он запускается как локальная система после установки, которая только выполняет фоновые службы и не имеет доступа к видимому рабочему столу. Он запускал paint.exe в невидимом режиме. Смотрите ссылку ниже:

https://www.reddit.com/r/csharp/comments/5a5uof/advice_managementeventwatcher_on_a_windows/

+0

Хм, нет, это не объясняет, почему он работал, когда вы использовали отладки сборки службы. Возможно, ваш вопрос был не очень точным, исправьте его. –

+0

Я использовал установщик услуг, который установил и запустил службу в локальной системе. Отладка выполнялась в среде IDE, а не в локальной системе. Debug и Build сделали то же самое, только сборка сделала это в фоновом режиме. Это было подтверждено диспетчером задач мониторинга с помощью флажка «Показать всех пользователей». Это было разработано, чтобы поместить стороннее программное обеспечение в режим обслуживания через командную строку при исправлении. Поскольку нам не нужно было видеть командную подсказку, она действительно работала по мере необходимости. Этот код находится в крупномасштабной производственной среде с ноября и не испытывает никаких проблем. –