Автоматический запуск службы Windows при установке - PullRequest
2 голосов
/ 12 февраля 2010

У меня есть служба Windows и установщик MSI (проект установки) для нее. Проект установки имеет настраиваемые действия для установки и удаления с аргументами / install и / uninstall соответственно.

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 12 февраля 2010

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

0 голосов
/ 12 февраля 2010

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

0 голосов
/ 12 февраля 2010

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

Когда я установил службы через проект установки, я всегда запускаю службу из метода 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? Я подозреваю, что контроль доступа - это то, что мешает запуску вашего процесса.

...