Есть приложение, которое можно запускать как консольное приложение, а можно и как службу-Windows.
Можно ли из кода узнать процесс запущен как служба или нет?
Проблема состоит в том что ниже описанная строчка "ругается" если выполняется из-под консоли.
Хотелось бы чтобы до вызова можно было определить из под чего происходит запуск. Например если из под консоли, то тогда вывести хелп в консоль или какие-либо рекомендации.
Появилась идея проверить имя пользователя. Если SYSTEM то служба, но... запуск можно настроить от любой учетной записи, поэтому не подходит.
Здравствуйте, SanyaVB, Вы писали:
SVB>Можно ли из кода узнать процесс запущен как служба или нет?
Обычно это передают в виде параметра командной строки.
Т.е., например, если указан ключь /service — значит идет запуск как службы.
А ключь этот прописывает установщик при регистрации службы.
Здравствуйте, SanyaVB, Вы писали:
SVB>Есть приложение, которое можно запускать как консольное приложение, а можно и как службу-Windows. SVB>Можно ли из кода узнать процесс запущен как служба или нет?
А зачем?
SVB>Проблема состоит в том что ниже описанная строчка "ругается" если выполняется из-под консоли. 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;
}
}
Мне обычно хватало проверки на Environment.UserInteractive.
Если запущено как служба будет false (если конечно служба не сконфигурена на взаимодействие с пользователем, что бывает очень редко).
Здравствуйте, SanyaVB, Вы писали:
SVB>Есть приложение, которое можно запускать как консольное приложение, а можно и как службу-Windows. SVB>Можно ли из кода узнать процесс запущен как служба или нет? SVB>Проблема состоит в том что ниже описанная строчка "ругается" если выполняется из-под консоли. 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);
}
}
Здравствуйте, Vladek, Вы писали:
V>Здравствуйте, SanyaVB, Вы писали:
SVB>>Есть приложение, которое можно запускать как консольное приложение, а можно и как службу-Windows. SVB>>Можно ли из кода узнать процесс запущен как служба или нет? SVB>>Проблема состоит в том что ниже описанная строчка "ругается" если выполняется из-под консоли. SVB>>
SVB>>Хотелось бы чтобы до вызова можно было определить из под чего происходит запуск. Например если из под консоли, то тогда вывести хелп в консоль или какие-либо рекомендации.
V>Добавь в Service1 метод для запуска в консольном приложении и никаких проблем не будет:
Здравствуйте, RushDevion, Вы писали:
RD>Мне обычно хватало проверки на Environment.UserInteractive. RD>Если запущено как служба будет false (если конечно служба не сконфигурена на взаимодействие с пользователем, что бывает очень редко).
Я решил немного по другому... Служба запускается вроде бы в нулевой сессии. т.е. я проверяю ИД сессию на нуль. Верно ли это?
Здравствуйте, 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.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, SanyaVB, Вы писали:
SVB>Есть приложение, которое можно запускать как консольное приложение, а можно и как службу-Windows. SVB>Можно ли из кода узнать процесс запущен как служба или нет?
Запускайте всегда как консольное приложение. А работу в виде службы можно настроить через nssm или что-то подобное.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, SanyaVB, Вы писали:
SVB>Хотелось бы чтобы до вызова можно было определить из под чего происходит запуск. Например если из под консоли, то тогда вывести хелп в консоль или какие-либо рекомендации.
И для параноиков (также см комментарии в других ответах). Вот это, насколько помню, не работает, если одновременно запустить и сервис, и обычное приложение.
Здравствуйте, Vladek, Вы писали:
V>Здравствуйте, SanyaVB, Вы писали:
V>>>Добавь в Service1 метод для запуска в консольном приложении и никаких проблем не будет:
SVB>>Будут проблемы
V>Какие?
Например ту которую я описал в первом сообщение.
>>Хотелось бы чтобы до вызова можно было определить из под чего происходит запуск. Например если из под консоли, то тогда вывести хелп в консоль или какие-либо рекомендации.
В вашем варианте решения в коде жестко прописано
this.isConsole = true; // ход конём
Ну можно разумеется этот флаг вынести в аргументы. Но... вопрос заключается как можно без них обойтись.
Здравствуйте, SanyaVB, Вы писали:
SVB>>>Будут проблемы
V>>Какие?
SVB>Например ту которую я описал в первом сообщение.
>>>Хотелось бы чтобы до вызова можно было определить из под чего происходит запуск. Например если из под консоли, то тогда вывести хелп в консоль или какие-либо рекомендации.
Но консольный вариант используется для только отладки. Служба по определению не взаимодействует с пользователем (это программа без пользовательского интерфейса) и в консольном варианте запускается с целью подключения отладчика. Конечному пользователю этот вариант вообще не нужен.
Лучше иметь два отдельных проекта — один для службы, второй для консоли (он будет просто тонкой обёрткой, как описано в моём первом посте). Консоль, естественно, конечному пользователю не поставляется. Ну а приспичит — принесёте с собой.
Здравствуйте, Vladek, Вы писали:
V>Здравствуйте, SanyaVB, Вы писали:
SVB>>>>Будут проблемы
V>>>Какие?
SVB>>Например ту которую я описал в первом сообщение.
>>>>Хотелось бы чтобы до вызова можно было определить из под чего происходит запуск. Например если из под консоли, то тогда вывести хелп в консоль или какие-либо рекомендации.
V>Но консольный вариант используется для только отладки. Служба по определению не взаимодействует с пользователем (это программа без пользовательского интерфейса) и в консольном варианте запускается с целью подключения отладчика. Конечному пользователю этот вариант вообще не нужен.
V>Лучше иметь два отдельных проекта — один для службы, второй для консоли (он будет просто тонкой обёрткой, как описано в моём первом посте). Консоль, естественно, конечному пользователю не поставляется. Ну а приспичит — принесёте с собой.
Иногда удобно иметь один исполняемый файл. Например при передачи ему определенных аргументов, можно установить, удалить, запустить, остановить и т.д. службу. Также Так же в консольном виде можно управлять службой и диагностировать. Получается как бы один файл является как клиентом так и службой.
Кстати в JIRA, Bamboo и в остальных продуктах Atlassian так и сделано
Здравствуйте, SanyaVB, Вы писали:
SVB>Я решил немного по другому... Служба запускается вроде бы в нулевой сессии. т.е. я проверяю ИД сессию на нуль. Верно ли это?
По-моему, это самый нормальный способ (для Vista и выше).