powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / попрос по службам windows
33 сообщений из 33, показаны все 2 страниц
попрос по службам windows
    #38135679
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Есть 2 вопроса по службам windows.
при запуске службы через exe файл, выскакивает окошко "сбой при запуске службы windows" "Невозможно запустить службу из командной строки или отладчика..." - все правильно. но вопрос в том как перехватить это окошко и вывести свое. или просто как определить как запущено приложение как служба или как процесс?

и второй вопрос. например служба Radmin запускает дополнительный процесс "radmin component" которая показывает иконку в трее и предоставляет консоль для управления службой. так же Radmin следит чтобы этот процесс всегда работал, и если его убить руками то он тут же снова запустится.
как организовать подобное поведение? (хотя бы в какую сторону копать)
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135709
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123как определить как запущено приложение как служба или как процесс? Environment.UserInteractive
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135770
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей Кnoob123как определить как запущено приложение как служба или как процесс? Environment.UserInteractive

не всегда верно. если у службы поставить флаг "разрешить взаимодействие с рабочим столом" то Environment.UserInteractive так же будет true
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135874
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123,

а что вы хотите-то я не понимаю. Вариантов можно много придумать, например ключ запуска "service,console..."
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135914
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123,

по поводу второй части вопроса рассмотрите вариант, внутри сервиса хочтится wcf сервис, который позволяет управлять вашим сервисом, снимать с него специфические показатели и т. п..

клиент wcf отдельно пишите, общаетесь через pipe, или tcp /ip
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135924
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord British,

опечатка забавная у тебя). Кстати а разве в Вин сервисе нет метода для передачи каких-то аргументов?
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135925
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123или просто как определить как запущено приложение как служба или как процесс?
служба является процессом.
Если Environment.UserInteractive - не устраивает - придётся доставать бубен и шаманить(точно нужна интерактивная служба?)


noob123следит чтобы этот процесс всегда работал, и если его убить руками то он тут же снова запустится.
как организовать подобное поведение? (хотя бы в какую сторону копать)
Обрабатывать завершение дочернего процесса(событие Exited) и при необходимости перезапускать его
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135927
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanКстати а разве в Вин сервисе нет метода для передачи каких-то аргументов?
конечно есть
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135931
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

ну кроме Start,Stop и тд? Хотя WCF наверное лучший выход,но требует лишних телодвижений
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135932
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123как перехватить это окошко и вывести свое. или просто как определить как запущено приложение как служба или как процесс?
А это и не нужно делать, журнал событий для кого сделан?
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135952
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan,

опечатка с трубы пишу, по поводу не убиваемого процесса, гугли на сайте wasm.ru, там были исходники, но если памяти не изменяет, то оно один хрен может быть снято под админом с помощью debug api
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135958
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это было автору
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135969
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
отвечаю сразу всем.
как сделать взаимодействие между службой и приложением я знаю.

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

МСУnoob123как перехватить это окошко и вывести свое. или просто как определить как запущено приложение как служба или как процесс?
А это и не нужно делать, журнал событий для кого сделан?

тебе не нужно, а кому то может и нужно. например мне.
если запустить тот же радмин (rserver3.exe) выскочит MessageBox с текстом: "Программа будет работать только как системная служба". все четко и красиво. а если запустить приложение мое, то вылезает большое окно "Невозможно запустить службу из командной строки или отладчика..." которое пугает пользователя, и мне нафиг не нужно.
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135977
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123если запустить тот же радмин (rserver3.exe) выскочит MessageBox с текстом: "Программа будет работать только как системная служба". все четко и красиво. а если запустить приложение мое, то вылезает большое окно "Невозможно запустить службу из командной строки или отладчика..." которое пугает пользователя, и мне нафиг не нужно.Можно написать программу, которая работает и как служба, и как приложение, в зависимости от того, как она запущена.
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135978
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123выскочит MessageBox с текстом: "Программа будет работать только как системная служба".

ну так же сказали:
if (Environment.UserInteractive) {Console.WriteLine("Нужна служба"); Console.ReadLine(); return; }
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135990
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей Кnoob123если запустить тот же радмин (rserver3.exe) выскочит MessageBox с текстом: "Программа будет работать только как системная служба". все четко и красиво. а если запустить приложение мое, то вылезает большое окно "Невозможно запустить службу из командной строки или отладчика..." которое пугает пользователя, и мне нафиг не нужно.Можно написать программу, которая работает и как служба, и как приложение, в зависимости от того, как она запущена.

можно, только в том и вопрос, как определить "как она запущена".

Arm79noob123выскочит MessageBox с текстом: "Программа будет работать только как системная служба".

ну так же сказали:
if (Environment.UserInteractive) {Console.WriteLine("Нужна служба"); Console.ReadLine(); return; }

читай выше, вариант не катит. так как Environment.UserInteractive не зависит от того как запущено приложение. он может быть true даже в случае если приложение запущено как служба.
...
Рейтинг: 0 / 0
попрос по службам windows
    #38135999
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanИзопропил,

ну кроме Start,Stop и тд? Хотя WCF наверное лучший выход,но требует лишних телодвижений

SCM поддерживает посылку пользовательских сообщений (коды 128-256)
Если этого недостаточно - любая форма RPC подойдёт
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136003
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123,

тогда делайте специальный аргумент, я же вам говорил. Где запускаете службу передавайте аргумент ""service". И вперед -
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
If(args.Count>0 && args[0]=="service")
{
я служба
}
else
{
я не служба
}
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136004
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136007
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123Environment.UserInteractive не зависит от того как запущено приложение. он может быть true даже в случае если приложение запущено как служба

А у вас сервис интерактивный?
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136011
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123отвечаю сразу всем.
как сделать взаимодействие между службой и приложением я знаю.

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

МСУпропущено...

А это и не нужно делать, журнал событий для кого сделан?

тебе не нужно, а кому то может и нужно. например мне.
если запустить тот же радмин (rserver3.exe) выскочит MessageBox с текстом: "Программа будет работать только как системная служба". все четко и красиво. а если запустить приложение мое, то вылезает большое окно "Невозможно запустить службу из командной строки или отладчика..." которое пугает пользователя, и мне нафиг не нужно.

мониторить создание/завершение процесса можно через wmi. может и подойдет тебе. можно и других методов нагенерить
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136014
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интерактивная служба - это хороший, добрый косяк.
Должны быть веские основания для использования. Необходимость выплюнуть мессаджбокс - таким основанием не является.

Если топикстартер настаивает - нужно определить родительский процесс и если это services.exe - приложение запущено как сервис
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136020
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
netivannoob123,

тогда делайте специальный аргумент, я же вам говорил. Где запускаете службу передавайте аргумент ""service". И вперед -
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
If(args.Count>0 && args[0]=="service")
{
я служба
}
else
{
я не служба
}



хорошо. это решение костыль. потом кто-нить запустить службу myservice.exe /service , вылезет "я служба" и потом выпадет окно что нихрена не служба.

Arm79noob123Environment.UserInteractive не зависит от того как запущено приложение. он может быть true даже в случае если приложение запущено как служба

А у вас сервис интерактивный?

предположим что да. тоесть даже если сделать не интерактивным то всеравно, это решение получается не универсальным.
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136024
noob123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИзопропилИнтерактивная служба - это хороший, добрый косяк.
Должны быть веские основания для использования. Необходимость выплюнуть мессаджбокс - таким основанием не является.

Если топикстартер настаивает - нужно определить родительский процесс и если это services.exe - приложение запущено как сервис

попробую.
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136031
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123,

что значит интерактивная служба? Пользователю Формы с приветом кидать? ИЛи вы хотите форму для управления вашей службой? я запутался.
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136035
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123предположим что да
Как заметил ув. Изопропил, это очень плохо. Советую предполагать, что нет

noob123решение получается не универсальным
Универсального нет ничего в мире. Всегда есть решения более или менее удовлетворяющие заданным условиям. Если не заморачиваться с интерактивностью сервисов, а реально практически нет оснований делать его таким, то Environment.UserInteractive - это отличный выбор.

Лично у меня в основном все приложения - службы. но для удобства разработки я делаю их еще и консольными. И приложения работают одинаково вне зависимости от типа запуска:

Program.cs
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                if (Environment.UserInteractive)
                {
                    Console.WindowWidth = 150;

                    try
                    {
                        using (var _initiator = new SocketInitiator())
                        {
                            _initiator.start();

                            Console.WriteLine("Нажмите enter для завершения");
                            Console.Read();

                            _initiator.stop();
                        }
                    }
                    catch (Exception _e)
                    {
                        Console.WriteLine("Нажмите enter для завершения");
                        Console.Read();
                    }
                }
                else
                {
                    ServiceBase.Run(new ServiceBase[] {new GateService()});
                }
            }
            else
            {
                #region Управление сервисом

                if (args[0] == "-help")
                {
                    Console.WriteLine("-help");
                    Console.WriteLine("-install SERVICE_NAME");
                    Console.WriteLine("-uninstall SERVICE_NAME");
                }

                if (args[0] == "-install")
                {
                    string _serviceName = args[1];
                    using (ProjectInstaller _projectInstaller = new ProjectInstaller {Context = new InstallContext()})
                    {
                        _projectInstaller.Context.Parameters.Add("assemblypath", Process.GetCurrentProcess().MainModule.FileName);
                        foreach (Installer _installer in _projectInstaller.Installers)
                            _installer.Context = _projectInstaller.Context;

                        _projectInstaller.ServiceInstaller.ServiceName =
                            _projectInstaller.ServiceInstaller.DisplayName =
                                _projectInstaller.EventLogInstaller.Source = _serviceName;

                        IDictionary _dictionary = new Hashtable();
                        try
                        {
                            _projectInstaller.Install(_dictionary);
                            _projectInstaller.Commit(_dictionary);
                        }
                        catch (Exception _ex)
                        {
                            _projectInstaller.Rollback(_dictionary);
                        }
                    }
                }

                if (args[0] == "-uninstall")
                {
                    string _serviceName = args[1];
                    using (ProjectInstaller _projectInstaller = new ProjectInstaller {Context = new InstallContext()})
                    {
                        _projectInstaller.Context.Parameters.Add("assemblypath", Process.GetCurrentProcess().MainModule.FileName);
                        foreach (Installer _installer in _projectInstaller.Installers)
                            _installer.Context = _projectInstaller.Context;

                        _projectInstaller.ServiceInstaller.ServiceName =
                            _projectInstaller.ServiceInstaller.DisplayName =
                                _projectInstaller.EventLogInstaller.Source = _serviceName;
                        try
                        {
                            _projectInstaller.Uninstall(null);

                            fLogger.Info(string.Format("Сервис {0} деинсталлирован", _serviceName));
                        }
                        catch (Exception _ex)
                        {
                        }
                    }
                }
                #endregion
            }
        }
    }

...
Рейтинг: 0 / 0
попрос по службам windows
    #38136040
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123,

во, можно так сделать:
создать приложение UI и там спрашивать - как вы хотите работать?) Если как слжуба цепляемся к win-службе и вперед.
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136047
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

+100 к такому решению. Аналогично. Только Help и Install не всегда делаю)
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136063
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob123тебе не нужно, а кому то может и нужно. например мне.
Это не аргумент, это бред сивой кобылы из детского сада.

noob123если запустить тот же радмин (rserver3.exe) выскочит MessageBox с текстом: "Программа будет работать только как системная служба". все четко и красиво. а если запустить приложение мое, то вылезает большое окно "Невозможно запустить службу из командной строки или отладчика..." которое пугает пользователя, и мне нафиг не нужно.
Это не UI приложение, это системная служба, доступ к которой есть только у локального администратора. Такими сообщениями никого не испугаешь, не говори глупостей.
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136091
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для информации - код 4-го фреймворка:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
	bool flag = NativeMethods.StartServiceCtrlDispatcher(intPtr);
	string text = "";
	if (!flag)
	{
		text = new Win32Exception().Message;
		string string3 = Res.GetString("CantStartFromCommandLine");
		if (Environment.UserInteractive)
		{
			string string4 = Res.GetString("CantStartFromCommandLineTitle");
			ServiceBase.LateBoundMessageBoxShow(string3, string4);
		}
		else
		{
			Console.WriteLine(string3);
		}
	}



Логичнее конечно exeption выбросить и пусть пользователь сам решает, как выводить диагностику,
но такова селява.
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136239
Фотография _=ДОБРЫНЯ=_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМожно написать программу, которая работает и как служба, и как приложение, в зависимости от того, как она запущена.

Как такое сделать?
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136307
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_=ДОБРЫНЯ=_Алексей КМожно написать программу, которая работает и как служба, и как приложение, в зависимости от того, как она запущена.

Как такое сделать?

Creating windows service using Topshelf
...
Рейтинг: 0 / 0
попрос по службам windows
    #38136621
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa Creating windows service using Topshelf

\src\Runtime\Windows\WindowsHostEnvironment.cs
IsRunningAsAService, GetParent - и есть определение способа запуска
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / попрос по службам windows
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]