• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Windowsservice и *.exe

  • Автор темы f.7
  • Дата начала
F

f.7

Приветствую всех.
Вот значит столкнулся с такой траблой, мне необходимо запустить *.exe файл при старте WindowsService и закрыть его при остановке WindowsService. Ну после немногочисленых раздумий, я так подумал что мне надо просто написать 2 *.bat файла и просто их запускать при старте и при остановке
делаю значть так
Код:
protected override void OnStart(string[] args)
{
Process batch = new Process();
[b]batch.StartInfo.FileName = @"C:\bugtracker\imstart.cmd";[/b]			batch.StartInfo.Arguments = "";
batch.StartInfo.UseShellExecute = true;
batch.Start();
batch.WaitForExit(); 
}
выше приведенный пример у меня запускает бат файл(тоже самое и на остановке сервиса)
А вот саммое интересное, я пишу в бат файле команды на запуск ехе (допустим канкулятора), при старте сервиса он виснет и ничего не происходит, но когда я содержимое файла меняю на то чтобы он допустим создавал папку на диске все прекрастно работает.
Поясните пожалуйста что это за несправедливость и как с этим бороться?
 
F

f.7

Ответов тьма :) ,
всё вроде сделал, короче надо при создании сервиса прописать ему что он будет запускаться от LocalSystem, потом инсталировать сервис, потом в Control Panel>AdministrativeTols>Service, найти наш сервис, открыть свойства, перейти на вкладочку LogOn, выбираем Local System account, и чуть ниже ставим в квадратик галочку, нажимаем кнопочку Ок и запускаем наш сервис. Далее откидываемся на спинку стула и не скрывая радости любуемся на свё творение... :D
 
P

Pasha

Для: f.7
Это конечно просто мое скромное мнение, но не проще ли было запускать сам exe через тот же Process, а при остановке сервиса проверять HasExited и делать CloseMainWindow и/или Kill?
 
F

f.7

Для: Pasha
Твои мнения для меня всегда авторитетные, но просто надо не одну прогу запускать а несколько, и возможно будут меняться пути и всё такое, мне кажеться лучше запускать батник, прописал в батник всё что хошь, а сервис чисто его запускает, даж не надо ничего перекомпилять :)
 
6

62316e

А вот саммое интересное, я пишу в бат файле команды на запуск ехе (допустим канкулятора), при старте сервиса он виснет и ничего не происходит, но когда я содержимое файла меняю на то чтобы он допустим создавал папку на диске все прекрастно работает.
Поясните пожалуйста что это за несправедливость и как с этим бороться?
Я не силен в .НЕТ но зачем тебе batch.WaitForExit(); ?
 
F

f.7

<!--QuoteBegin-62316e+5:09:2007, 15:30 -->
<span class="vbquote">(62316e @ 5:09:2007, 15:30 )</span><!--QuoteEBegin-->Я не силен в .НЕТ но зачем тебе batch.WaitForExit(); ?
[snapback]77301" rel="nofollow" target="_blank[/snapback]​
[/quote]

дык я тож не силен ;) , нашел в инете - прописал - работает :rolleyes:
 
6

62316e

дык я тож не силен wink.gif , нашел в инете - прописал - работает rolleyes.gif
Мило. Попробуй значит так: убери WaitForExit(); и у тебя сразу должно все заработать, те если бы ты прошелся дебагером то ты бы увидел что он остановится на этой ф-и. Или сделать еще один поток и в нем запускать бат файл. Хотя я бы ни так ни так не делал. Я бы на твоем месте MSDN покусал.

Так. Сорри, забыл о постановке задачи. При старте сервиса надо делать: process.Start(). при остановке process.Stop(); // если там есть такой конечно? ))
 
P

Pasha

Для: 62316e
WaitForExit гарантирует что exe запустятся до выхода из OnStart. А про process.Start/Stop я уже писал выше, но похоже нужен именно батник.
 
K

karlito

Надеюсь помогу.
Во-первых, включи для твоего сервиса опцию "Разрешить взаимодействие с рабочим столом" - по-крайней мере будешь видеть, что происходит, когда окна открываешь. Калькулятор теперь на самом деле открывается, но ты его не видишь, а закрыть ты его тоже не можешь, поэтому всё и виснет
Запускай калькулятор в отдельном потоке. Короче, кусочек тебе живого похожего кода.
Код:
internal static void ShowFeedBackPage()
{
Thread thread = new Thread(new ThreadStart(ShowFeedBackPageHandler));
thread.ApartmentState = ApartmentState.STA;
thread.Start();
while(!thread.Join(100))
{
Application.DoEvents();				
}
}

internal static void ShowFeedBackPageHandler()
{
try
{
System.Diagnostics.Process.Start(FEEDBACKPAGE_URL);
}
catch(Exception ex)
{
Debug.Fail(ex.Message, ex.ToString());
}
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!