2012-04-17 3 views
2

Итак, я создал службу Windows с использованием C# и создал для нее инсталлятор в Visual Studio. Он настроен на запуск вручную, так как я не хочу, чтобы он работал все время. Затем у меня есть другое приложение (C# WPF), у которого должна быть опция включения и выключения службы (сама служба создает веб-службу, которая, в свою очередь, обращается к моему приложению WPF). Это отлично работает в Windows XP, но, тестируя его на компьютере с Windows 7, он не запускается. Удивительно, но это порождает исключение и крушение, оно просто ничего не делает. Я считаю, что это проблема с разрешениями. Если я перейду на панель управления службами, используя ту же учетную запись Windows 7, я не смогу запустить или остановить службу.Как установить разрешения для службы Windows

Итак, мой вопрос: есть ли способ установить мой сервис, чтобы обычные учетные записи пользователей могли запускать и останавливать его? И есть ли способ установить мой установщик для этого автоматически.

Я не хочу, чтобы мое приложение WPF запускалось как администратор!

+2

http://serverfault.com/questions/187302/how-do-i-grant-start-stop-restart-permissions-on-a-service-to-an-arbitrary-user –

+1

У него есть все время. Но дайте услуге свой собственный флаг Running, который вы можете контролировать через некоторый IPC, например. именованные каналы, сокеты, WCF. Служба работает на холостом ходу, когда Running is false. –

+0

Если это не похоже на сервис, возможно, это не сервис :) - может быть, вам стоит подумать об альтернативах. – NSGaga

ответ

2

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

Итак, если мы не можем позволить пользователю запускать и останавливать службу, мы, вероятно, должны позволить службе работать все время. Поскольку вы не хотите, чтобы служба была активной все время, я предлагаю вам предоставить свой собственный внутренний флаг Running. Когда это значение установлено true, служба активна и занята вещами, в противном случае служба остается бездействующей. Вы можете использовать предпочтительный механизм IPC (сокеты, именованные каналы, WCF и т. Д.).), чтобы позволить пользователю переключать этот переключатель.

1

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

Обычные пользователи не могут запускать и останавливать службы.

EDIT: чтение ссылки в комментарии выше, это звучит для меня, поскольку это полная способность для пользователей запускать и останавливать службы. Я думаю, здесь речь идет о том, как это сделать для конкретной службы.

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

Также при чтении комментариев и других ответов мне остается задаться вопросом, может ли служба использоваться любым пользователем, который может запускать приложение. То есть, если пользователь A заходит на рабочую станцию ​​и запускает это приложение (и, следовательно, службу), блокирует его и уходит, что происходит, когда используется B, и пытается запустить ту же службу? Может ли служба поддерживать несколько пользователей одновременно, или начнутся забавные вещи, если служба будет запущена приложением, запущенным несколько раз.

Это действительно звучит так, как хотелось бы, чтобы фон запускался при запуске приложения. Эта нить (или потоки) будет выполнять работу службы и по своему характеру закончится, когда приложение закончится. Конечно, более подробная информация в этом вопросе поможет дать лучший ответ.

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

+0

Grrr! Мы только сейчас собираемся обновиться до Windows 7 (в любое время, которое было сообщением около прошлого года). Так что это будут годы, прежде чем мы увидим Windows 8! –

+0

@MattBurland Извините, но это реальность. Отвечает ли это на ваш вопрос? Если да, согласились бы вы? – Andy

+0

Первый комментарий к вопросу предполагает, что этот ответ неверен. Какое из этих противоречивых взглядов верно? –

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