Я хочу превратить имеющуюся у меня программу в службу, чтобы я мог использовать ее, не регистрируя ее. По сути, он выполняет резервное копирование указанных папок в указанное место с помощью SSH. Однако проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как рассказать об этих предметах. Я знаю только, как запускать, останавливать и запускать пользовательскую команду только с целым числом с параметром.
Как я могу это сделать?
Служба Windows, а не веб-служба
редактировать: резервные копии папок не останутся согласованными и будут обновляться при каждом выполнении.





Можно ли использовать файл конфигурации для указания этих элементов?
Я понимаю. Это также исключит записи в реестре. Я согласен с ocdecio и Дэйвом, хотя, в первую очередь, вы должны иметь возможность отправлять строку в качестве аргумента службе.
Сохраните параметры запуска службы в реестре: а затем, когда реестр запустится, он должен прочитать свои параметры запуска из реестра.
Папки меняются в зависимости от использования. Извините, я забыл это сказать.
Любая служба может получать аргументы командной строки при запуске.
При запуске службы вы можете указать их, но только если служба запускается вручную. Для автоматического использования аргументы должны быть в реестре (как указывали другие) или в файле конфигурации.
Могу ли я запустить службу без предварительного входа пользователя в систему? I.E. удаленно?
А как насчет OnStart (String [] args)?
Вы можете управлять (запускать и останавливать) службу удаленно (если у вас есть права и доступ к сети): с помощью API, с помощью графического интерфейса пользователя O / S и / или с помощью команды net start из команды линия.
Вы также можете изменить записи в удаленном реестре, например если служба считывает параметры запуска из реестра.
У служб Windows есть исполняемые файлы, как и у любых других. Я считаю, что вы можете написать его, чтобы принимать параметры командной строки и указывать эти параметры в конфигурации службы Windows. Вы также можете сделать так, чтобы он прочитал файл конфигурации. Если вы используете .NET, в структуре есть классы файлов конфигурации.
Вы можете создать экземпляр своей службы и передать аргументы командной строки с помощью класса ServiceController.
using (ServiceController serviceController = new ServiceController(serviceName))
{
string[] args = new string[1];
args[0] = "arg1";
serviceController.Start(args);
}
После этого "arg1" будет доступен как обычные аргументы командной строки в main (), когда Windows запускает службу.
Почему бы просто не разместить службу WCF в службе Windows, чтобы получить такие «административные» функции? (Также возможно удаленное взаимодействие)
См. Мой ответ для комментария по этому поводу.
Я вижу, что вы (или кто-то) отклонили ответ Себастьяна Седлака, потому что он упомянул размещение службы WCF в службе Windows. Ваш ответ был
It's in nice bold lettering in the question. Not a Web Service, therefor WCF is out of the question
Я думаю, вы неправильно поняли, что он имел в виду. Он не говорил о Веб-сервис. Он говорил о размещении Служба WCFв вашего Служба Windows.
Это далеко не одно и то же. Вы можете разместить службу WCF в в любом приложении Windows (Forms / Console / Service). Смысл этого в том, что заявление становится доступным для связи через его внутреннюю службу WCF в том же мода, в котором вы можете общаться с веб-службой (вы можете разместить службы WCF также в IIS, кстати, что сделает их тогда «Веб-службы» в том смысле, который вы, кажется, имеете в виду).
В службе Windows это означает, что вы можете отправлять ей любую команду, а также получать от нее любую информацию, которую хотите, - во время ее работы.
Фактически, я сейчас работаю над проектом, который представляет собой службу Windows, с которой мне нужно иметь возможность связываться и передавать команды - и получать информацию от - во время выполнения. Например, я хочу иметь возможность указывать ему, где хранить определенные вещи, что регистрировать, чтобы он был сброшен / перезапущен - и опрашивать его для сообщений о состоянии. Я делаю это, размещая службу WCF внутри службы Windows. Эта служба WCF предоставляет набор методов, которые в моем случае включают получение команд и возврат информации о состоянии. Поэтому, когда Служба Windows работает, я могу связаться с ним (даже удаленно) через его встроенный Служба WCF и сказать ему, что делать.
Это очень легко реализовать, и в случае со службами Windows он может предоставить вам гораздо более богатый интерфейс для службы, чем с помощью основных стандартных команд.
тем не мение, вы указали, что хотите, чтобы ваша служба Windows получала настройки папок каждый раз, когда это запускается, что делает такую пассивную настройку менее идеальной (поскольку она не сможет ничего сделать, пока вы не передадите ей правильные папки).
Один из способов справиться с этим (с помощью размещенной службы WCF) - запустить службу Windows все время (то есть автоматический запуск). По умолчанию он находится в состоянии ожидания. Затем вы можете подать ему команду «начать обработку», передав ему нужные папки для работы (через вызов соответствующего метода службы WCF). Точно так же служба WCF будет предоставлять методы, дающие вам статус приложения (текущая папка, ход выполнения, занято / простаивает и т. д.). После завершения обработки он вернется в состояние ожидания, ожидая, пока ему будет предоставлен следующий набор папок.
Это упростит удаленное управление - вы даже можете сделать для него онлайн-панель администрирования, доступную из любого места.
Проблема в том, что, хотя передача параметров несложна, когда компьютер перезагружается и Windows пытается перезапустить службу, этих параметров нет. они существуют только тогда, когда кто-то запускает службу из командной строки.
Например. У меня есть служба Windows, в которой размещена служба WCF. Я хочу, чтобы пользователи могли указывать номер порта, отличный от номера по умолчанию, для службы WCF для прослушивания. Они делают это, запустив службу Windows следующим образом ... MyService -port: xxxxx
Что отлично работает, пока сервер не будет перезагружен, затем Windows перезапустит MyService (но без параметров), а служба wcf по умолчанию будет использовать исходный порт #
Что касается файла app.config - я уверен, что ваша служба будет читать и использовать эти файлы, поскольку я пишу все свои службы Windows таким образом;) Так что просто поместите все, что вам нужно, в app.config в разделе «application» (а не user) и всегда отредактируйте «yourname.exe.config» в папке, откуда вы «InstallUtil» службу.
RE: файл конфигурации.
Конечно, можно использовать файл конфигурации. И файл можно изменить во время работы службы.
Это было бы хорошим решением, если бы файл конфигурации действительно изменился. Все мои службы используют файл конфигурации XML, обернутый в класс для удобства повторного использования.
Оболочка имеет возможность отслеживать XML-файл с помощью fileMonitor на предмет изменений, при желании автоматически обновлять содержимое файла конфигурации и, наконец, вызывать событие для класса обслуживания. Затем служба имеет возможность «сбросить» себя по мере необходимости, чтобы включить новые значения в файл конфигурации XML.
При размещении конфигурации в реестре возникает несколько проблем:
Где XML-файл легко копировать, редактировать, делиться, просматривать и понимать. Добавьте несколько хороших блоков COMMENT и подробный XSD-файл, и он также станет источником хорошей документации.
Взгляните на XPath, чтобы облегчить навигацию и извлечение значений в XML-файле.
0,02 доллара США ... Дэйвид ...
Я так не думаю. Учитывая, что пользователь не войдет в систему, ему придется каждый раз указывать папки, потому что они могут / будут меняться.