Это служба?
От: SanyaVB  
Дата: 20.07.16 15:44
Оценка:
Есть приложение, которое можно запускать как консольное приложение, а можно и как службу-Windows.
Можно ли из кода узнать процесс запущен как служба или нет?
Проблема состоит в том что ниже описанная строчка "ругается" если выполняется из-под консоли.
 ServiceBase.Run(new ServiceBase[]{new Service1()});

Хотелось бы чтобы до вызова можно было определить из под чего происходит запуск. Например если из под консоли, то тогда вывести хелп в консоль или какие-либо рекомендации.

Появилась идея проверить имя пользователя. Если SYSTEM то служба, но... запуск можно настроить от любой учетной записи, поэтому не подходит.
Re: Это служба?
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 20.07.16 16:00
Оценка:
Здравствуйте, SanyaVB, Вы писали:

SVB>Можно ли из кода узнать процесс запущен как служба или нет?

Обычно это передают в виде параметра командной строки.
Т.е., например, если указан ключь /service — значит идет запуск как службы.

А ключь этот прописывает установщик при регистрации службы.
Re: Это служба?
От: Lexey Россия  
Дата: 20.07.16 16:03
Оценка:
Здравствуйте, SanyaVB, Вы писали:

SVB>Есть приложение, которое можно запускать как консольное приложение, а можно и как службу-Windows.

SVB>Можно ли из кода узнать процесс запущен как служба или нет?

А зачем?

SVB>Проблема состоит в том что ниже описанная строчка "ругается" если выполняется из-под консоли.

SVB>
SVB> ServiceBase.Run(new ServiceBase[]{new Service1()});
SVB>


Используй Topshelf. У него из коробки есть возможность запускать сервис как из SCM, так и просто из консоли.

SVB>Появилась идея проверить имя пользователя. Если SYSTEM то служба, но... запуск можно настроить от любой учетной записи, поэтому не подходит.


Topshelf вот так делает:
        public bool IsRunningAsAService
        {
            get
            {
                try
                {
                    Process process = GetParent(Process.GetCurrentProcess());
                    if (process != null && process.ProcessName == "services")
                    {
                        _log.Debug("Started by the Windows services process");
                        return true;
                    }
                }
                catch (InvalidOperationException)
                {
                    // again, mono seems to fail with this, let's just return false okay?
                }
                return false;
            }
        }
"Будь достоин победы" (c) 8th Wizard's rule.
Re: Это служба?
От: RushDevion Россия  
Дата: 20.07.16 16:25
Оценка: +1
Мне обычно хватало проверки на Environment.UserInteractive.
Если запущено как служба будет false (если конечно служба не сконфигурена на взаимодействие с пользователем, что бывает очень редко).
Re: Это служба?
От: Vladek Россия Github
Дата: 20.07.16 18:34
Оценка: +1
Здравствуйте, SanyaVB, Вы писали:

SVB>Есть приложение, которое можно запускать как консольное приложение, а можно и как службу-Windows.

SVB>Можно ли из кода узнать процесс запущен как служба или нет?
SVB>Проблема состоит в том что ниже описанная строчка "ругается" если выполняется из-под консоли.
SVB>
SVB> ServiceBase.Run(new ServiceBase[]{new Service1()});
SVB>

SVB>Хотелось бы чтобы до вызова можно было определить из под чего происходит запуск. Например если из под консоли, то тогда вывести хелп в консоль или какие-либо рекомендации.

Добавь в Service1 метод для запуска в консольном приложении и никаких проблем не будет:

public void Run(string[] args)
{
    try
    {
        this.isConsole = true; // ход конём

        // Имитируем запуск службы
        OnStart(args);

        // Ждём отбоя от пользователя консоли
        using (var cancelRequest = new ManualResetEvent(initialState: false))
        {
            Console.CancelKeyPress += (sender, e) =>
            {
                cancelRequest.Set();
            };

            cancelRequest.WaitOne();
        }
    }
    finally
    {
        // Завершаем работу
        OnStop();
    }
}


Код консольного приложения будет намного проще:
public static void Main(string[] args)
{
    using (var service = new Service1())
    {
        service.Run(args);
    }
}
Re[2]: Это служба?
От: Mr.Delphist  
Дата: 28.07.16 12:50
Оценка:
Здравствуйте, Lexey, Вы писали:

L>Topshelf вот так делает:

L>
L>                    if (process != null && process.ProcessName == "services")
L>


А затем MS изменит (или локализует, что более вероятно в нынешних тенденциях) имя процесса — и привет.
Re[2]: Это служба?
От: SanyaVB  
Дата: 29.07.16 09:39
Оценка:
Здравствуйте, Vladek, Вы писали:

V>Здравствуйте, SanyaVB, Вы писали:


SVB>>Есть приложение, которое можно запускать как консольное приложение, а можно и как службу-Windows.

SVB>>Можно ли из кода узнать процесс запущен как служба или нет?
SVB>>Проблема состоит в том что ниже описанная строчка "ругается" если выполняется из-под консоли.
SVB>>
SVB>> ServiceBase.Run(new ServiceBase[]{new Service1()});
SVB>>

SVB>>Хотелось бы чтобы до вызова можно было определить из под чего происходит запуск. Например если из под консоли, то тогда вывести хелп в консоль или какие-либо рекомендации.

V>Добавь в Service1 метод для запуска в консольном приложении и никаких проблем не будет:


Будут проблемы
Re[2]: Это служба?
От: SanyaVB  
Дата: 29.07.16 09:43
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Мне обычно хватало проверки на Environment.UserInteractive.

RD>Если запущено как служба будет false (если конечно служба не сконфигурена на взаимодействие с пользователем, что бывает очень редко).
Я решил немного по другому... Служба запускается вроде бы в нулевой сессии. т.е. я проверяю ИД сессию на нуль. Верно ли это?
Re[3]: Это служба?
От: Vladek Россия Github
Дата: 29.07.16 20:48
Оценка:
Здравствуйте, SanyaVB, Вы писали:

V>>Добавь в Service1 метод для запуска в консольном приложении и никаких проблем не будет:


SVB>Будут проблемы


Какие?
Re[3]: Это служба?
От: TK Лес кывт.рф
Дата: 31.07.16 09:10
Оценка:
Здравствуйте, SanyaVB, Вы писали:

SVB>Здравствуйте, RushDevion, Вы писали:


RD>>Мне обычно хватало проверки на Environment.UserInteractive.

RD>>Если запущено как служба будет false (если конечно служба не сконфигурена на взаимодействие с пользователем, что бывает очень редко).
SVB>Я решил немного по другому... Служба запускается вроде бы в нулевой сессии. т.е. я проверяю ИД сессию на нуль. Верно ли это?

Проверяйте тогда на вхождение пользователя в указанную группу:
SECURITY_SERVICE_RID S-1-5-6
Accounts authorized to log on as a service. This is a group identifier added to the token of a process when it was logged as a service. The corresponding logon type is LOGON32_LOGON_SERVICE.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Это служба?
От: TK Лес кывт.рф
Дата: 31.07.16 09:15
Оценка:
Здравствуйте, SanyaVB, Вы писали:

SVB>Есть приложение, которое можно запускать как консольное приложение, а можно и как службу-Windows.

SVB>Можно ли из кода узнать процесс запущен как служба или нет?

Запускайте всегда как консольное приложение. А работу в виде службы можно настроить через nssm или что-то подобное.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Это служба?
От: Sinix  
Дата: 31.07.16 09:55
Оценка:
Здравствуйте, SanyaVB, Вы писали:

SVB>Хотелось бы чтобы до вызова можно было определить из под чего происходит запуск. Например если из под консоли, то тогда вывести хелп в консоль или какие-либо рекомендации.


Лучший ответ, кмк (читаем комментарии).

И для параноиков (также см комментарии в других ответах). Вот это, насколько помню, не работает, если одновременно запустить и сервис, и обычное приложение.
Re[4]: Это служба?
От: SanyaVB  
Дата: 03.08.16 07:22
Оценка:
Здравствуйте, Vladek, Вы писали:

V>Здравствуйте, SanyaVB, Вы писали:


V>>>Добавь в Service1 метод для запуска в консольном приложении и никаких проблем не будет:


SVB>>Будут проблемы


V>Какие?


Например ту которую я описал в первом сообщение.

>>Хотелось бы чтобы до вызова можно было определить из под чего происходит запуск. Например если из под консоли, то тогда вывести хелп в консоль или какие-либо рекомендации.


В вашем варианте решения в коде жестко прописано
this.isConsole = true; // ход конём

Ну можно разумеется этот флаг вынести в аргументы. Но... вопрос заключается как можно без них обойтись.
Re[5]: Это служба?
От: Vladek Россия Github
Дата: 03.08.16 07:57
Оценка:
Здравствуйте, SanyaVB, Вы писали:

SVB>>>Будут проблемы


V>>Какие?


SVB>Например ту которую я описал в первом сообщение.


>>>Хотелось бы чтобы до вызова можно было определить из под чего происходит запуск. Например если из под консоли, то тогда вывести хелп в консоль или какие-либо рекомендации.


Но консольный вариант используется для только отладки. Служба по определению не взаимодействует с пользователем (это программа без пользовательского интерфейса) и в консольном варианте запускается с целью подключения отладчика. Конечному пользователю этот вариант вообще не нужен.

Лучше иметь два отдельных проекта — один для службы, второй для консоли (он будет просто тонкой обёрткой, как описано в моём первом посте). Консоль, естественно, конечному пользователю не поставляется. Ну а приспичит — принесёте с собой.
Re[6]: Это служба?
От: SanyaVB  
Дата: 03.08.16 08:23
Оценка:
Здравствуйте, Vladek, Вы писали:

V>Здравствуйте, SanyaVB, Вы писали:


SVB>>>>Будут проблемы


V>>>Какие?


SVB>>Например ту которую я описал в первом сообщение.


>>>>Хотелось бы чтобы до вызова можно было определить из под чего происходит запуск. Например если из под консоли, то тогда вывести хелп в консоль или какие-либо рекомендации.


V>Но консольный вариант используется для только отладки. Служба по определению не взаимодействует с пользователем (это программа без пользовательского интерфейса) и в консольном варианте запускается с целью подключения отладчика. Конечному пользователю этот вариант вообще не нужен.


V>Лучше иметь два отдельных проекта — один для службы, второй для консоли (он будет просто тонкой обёрткой, как описано в моём первом посте). Консоль, естественно, конечному пользователю не поставляется. Ну а приспичит — принесёте с собой.


Иногда удобно иметь один исполняемый файл. Например при передачи ему определенных аргументов, можно установить, удалить, запустить, остановить и т.д. службу. Также Так же в консольном виде можно управлять службой и диагностировать. Получается как бы один файл является как клиентом так и службой.
Кстати в JIRA, Bamboo и в остальных продуктах Atlassian так и сделано
Re[3]: Это служба?
От: okman Беларусь https://searchinform.ru/
Дата: 03.08.16 08:43
Оценка:
Здравствуйте, SanyaVB, Вы писали:

SVB>Я решил немного по другому... Служба запускается вроде бы в нулевой сессии. т.е. я проверяю ИД сессию на нуль. Верно ли это?


По-моему, это самый нормальный способ (для Vista и выше).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.