2010-02-11 4 views
2

У меня есть служба Windows и установщик MSI (проект установки). Проект установки имеет специальные действия для установки и удаления с помощью args of/install and/uninstall соответственно.Автоматический запуск службы Windows при установке

Я хотел бы, чтобы служба запускалась сразу после установки. Вся моя служба запускает процесс. Когда услуга остановлена, она делает process.Close();.

Я попытался сделать

var sc = new ServiceController("MyProcess"); 
sc.Start(); 

Процесс начинается, но сообщение журнала событий говорят служба начала не показывает. При остановке я получаю ошибку Error stopping process: System.InvalidOperationException: No process is associated with this object..

Если я не использую сервис-контроллер для запуска и использования Services.msc вместо этого, он работает как ожидается при остановке.

Есть ли способ начать процесс сразу, и мои методы запуска/остановки работают должным образом?

+1

Возможный дубликат [Автоматически запускать службу Windows при установке] (http://stackoverflow.com/questions/1036713/automatically-start-a-windows-service-on-install) – ChrisF

ответ

0

Я закончил с другим подходом, просто получив рабочий процесс, вместо того, чтобы пытаться удержать тот, который был запущен раньше. Остановка процесса тогда работает очень хорошо, и не имеет значения, что методы OnStart/OnStop работают «правильно», потому что мой внутренний процесс запускается/останавливается, как мне нужно.

1

Вы не говорите, какую операционную систему вы используете, но я помню, как это работает при разработке приложения-установщика в прошлом году. Я полагаю, что это ограничение безопасности в Windows 7, Server 2003/2008 и, возможно, Vista, поскольку программа установки не может запускать какую-либо прикладную программу, которую он устанавливает. Если вы установите службу для автоматического запуска, тогда она должна запускаться при следующей перезагрузке системы.

+0

Это на Windows 7. Если вы правы, это имеет смысл. –

+0

Хотя, он запускает сервис, просто не правильно. Мой код находится в методах OnStart и OnStop класса сервиса. –

0

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

Когда я установил службы через проект установки, я всегда запускаю службу из метода Commit класса установщика, таким образом, я знаю, что все установлено правильно. Я не уверен в этом на 100%, но вы не сможете запустить службу до тех пор, пока установка не будет выполнена. Похоже, что у вас настроены ваши настраиваемые действия, поэтому не должно быть никаких проблем с вызовом метода Commit (у вас есть Commit, включенное в пользовательские действия, правильно?) Вот пример метода Commit от одного из моих проектов:

public override void Commit(IDictionary savedState) 
{ 
    base.Commit(savedState); 

    try 
    { 
     var serviceController = new ServiceController("<Insert Service Name>"); 
     serviceController.Start(); 
    } 
    catch 
    { 
     MessageBox.Show(
      "There was an error starting the <Insert Service Name> Service. Please manually start it, or restart the computer."); 
    } 
} 

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

Мне любопытно, какую учетную запись вы используете в своем ServiceProcessInstaller? У этого пользователя есть права на компьютере, чтобы начать процесс? Есть ли у Процесса какие-либо конкретные требования UAC? Я подозреваю, что контроль доступа - это то, что не позволяет вашему процессу начать работу.

+0

Я использую учетную запись LocalSystem. При использовании ServiceController для запуска службы процесс, который я запускаю, запускается, но обычно в журнале событий обычно появляется сообщение о том, что служба успешно запущена. Я сохраняю экземпляр процесса, поэтому, когда вызывается OnStop, я могу выполнить 'process.Close()', но тогда процесс недействителен. –

+0

Я даже не могу запустить новый процесс. Вчера я работал хорошо, но я был в другой сети. Возможно, это вопрос UAC, как вы сказали. Если да, то что я могу сделать в установщике, чтобы позволить службе запустить этот процесс, который, по-видимому, нуждается в дополнительных правах? Процесс, который я запускаю, это mongod.exe, который является процессом MondoDB, поэтому он привязывается к порту как минимум. Я попытался отключить брандмауэр, но это не изменило ситуацию. –

+0

Кроме того, у меня есть попытка/улов вокруг начала процесса, событие регистрировалось в catch. Почему бы не потерпеть неудачу, если процесс не начался? Должно быть, он терпит неудачу. –

Смежные вопросы