Как определить запущена программа как сервис или как обычное
От: Qrdl  
Дата: 07.09.04 06:01
Оценка:
Как определить запущена программа как сервис или как обычное приложение без анализа командной строки
Re: Как определить запущена программа как сервис или как обы
От: Demon Россия  
Дата: 07.09.04 06:13
Оценка:
Здравствуйте, Qrdl, Вы писали:

Q>Как определить запущена программа как сервис или как обычное приложение без анализа командной строки


Не самое красивое решение, но первое, что пришло в голову:
если процесс запущен не как сервис, StartServiceCtrlDispatcher завершится с ошибкой 0х0427. Создай еще один поток, который будет проверять, как работает StartServiceCtrlDispatcher или завершился с ошибкой.

Второе, что пришло в голову:
проверяй под какой учетной записью работает процесс, обычно сервисы создают для работы под LocalSystem.
Re[2]: Как определить запущена программа как сервис или как
От: Denis Россия http://blogs.gotdotnet.ru/personal/Denis
Дата: 07.09.04 06:20
Оценка:
D>Второе, что пришло в голову:
D>проверяй под какой учетной записью работает процесс, обычно сервисы создают для работы под LocalSystem.
вот этим советом точно не надо пользоваться =)
Re: Как определить запущена программа как сервис или как обы
От: FruT Германия www.bevip.ru
Дата: 07.09.04 06:33
Оценка:
IMHO надо сдалать

OpenSCManager();
OpenService();
QueryServiceStatus(
  /*SC_HANDLE8*/ hService,
  /*LPSERVICE_STATUS*/ lpServiceStatus
);

И если lpServiceStatus->dwCurrentState == SERVICE_STOPPED значит ты запустился как обычная программа.
Правда это не актуально если твой сервис после останова продолжает что-то делать(IMHO это не корректно).
Искусственный интеллект — ничто по сравнению с естественной глупостью
http://www.bevip.ru
Re[3]: Как определить запущена программа как сервис или как
От: Demon Россия  
Дата: 07.09.04 06:52
Оценка:
Здравствуйте, Denis, Вы писали:

D>>Второе, что пришло в голову:

D>>проверяй под какой учетной записью работает процесс, обычно сервисы создают для работы под LocalSystem.
D>вот этим советом точно не надо пользоваться =)

Почему?
Если я пишу сервис, который должен работать под LocalSystem, то проблемы, которые огребет пользователь, запуская его под другой учетной записью, — его проблемы.

Но в целом согласен, через ж...
Re[4]: Как определить запущена программа как сервис или как
От: Denis Россия http://blogs.gotdotnet.ru/personal/Denis
Дата: 07.09.04 06:54
Оценка:
D>Почему?
D>Если я пишу сервис, который должен работать под LocalSystem, то проблемы, которые огребет пользователь, запуская его под другой учетной записью, — его проблемы.
хм, хороший подход к пользователю...
ладно оставим, вопрос отношения к пользователю в стороне, я и обычную прогу могу под ним(LS) запустить... как тогда отличать?
Re[2]: Как определить запущена программа как сервис или как
От: Demon Россия  
Дата: 07.09.04 06:57
Оценка:
Здравствуйте, FruT, Вы писали:

FT>IMHO надо сдалать


FT>
FT>OpenSCManager();
FT>OpenService();
FT>QueryServiceStatus(
FT>  /*SC_HANDLE8*/ hService,
FT>  /*LPSERVICE_STATUS*/ lpServiceStatus
FT>);
FT>

FT>И если lpServiceStatus->dwCurrentState == SERVICE_STOPPED значит ты запустился как обычная программа.
FT>Правда это не актуально если твой сервис после останова продолжает что-то делать(IMHO это не корректно).

Не годится.
1. Вполне может быть, что сервис работает, и запускается еще приложение.
2. Проверять это можно только после того, как сделаем SetServiceStatus( SERVICE_RUNNING )
Re: Как определить запущена программа как сервис или как обы
От: Demon Россия  
Дата: 07.09.04 07:00
Оценка:
Здравствуйте, Qrdl, Вы писали:

Q>Как определить запущена программа как сервис или как обычное приложение без анализа командной строки


Еще идея:



bool bService = false;

void WINAPI ServiceMain( DWORD dwArgc, LPTSTR *psArgv )
{
     bService = true;  
     // bla-bla-bla
}

int WINAPI WinMain(...)
{
     SERVICE_TABLE_ENTRY steTable[] = 
     {
          { szServiceName, ServiceMain },
          { NULL, NULL }
     };

     StartServiceCtrlDispatcher( steTable );
     
     if( !bService ){
         // bla-bla-bla
     }
}
Re: Как определить запущена программа как сервис или как обы
От: Denis Россия http://blogs.gotdotnet.ru/personal/Denis
Дата: 07.09.04 07:04
Оценка:
поиск рулит...
как минимум тут
http://rsdn.ru/Forum/Message.aspx?mid=34368
Автор: vadimus
Дата: 11.03.02
Re[5]: Как определить запущена программа как сервис или как
От: Demon Россия  
Дата: 07.09.04 07:13
Оценка:
Здравствуйте, Denis, Вы писали:

D>>Почему?

D>>Если я пишу сервис, который должен работать под LocalSystem, то проблемы, которые огребет пользователь, запуская его под другой учетной записью, — его проблемы.
D>хм, хороший подход к пользователю...
Давай тогда изголяться чтоб один и тот же бинарник могли и под виндой запускать и под соляркой.

D>ладно оставим, вопрос отношения к пользователю в стороне,


D>я и обычную прогу могу под ним (LS) запустить... как тогда отличать?

Вот против таких запусков я пожалуй не стану возражать. Но тогда действительно придется использовать что-то другое.
Re[2]: Как определить запущена программа как сервис или как
От: Qrdl  
Дата: 07.09.04 07:41
Оценка:
Здравствуйте, FruT, Вы писали:

FT>IMHO надо сдалать


FT>
FT>OpenSCManager();
FT>OpenService();
FT>QueryServiceStatus(
FT>  /*SC_HANDLE8*/ hService,
FT>  /*LPSERVICE_STATUS*/ lpServiceStatus
FT>);
FT>

FT>И если lpServiceStatus->dwCurrentState == SERVICE_STOPPED значит ты запустился как обычная программа.
FT>Правда это не актуально если твой сервис после останова продолжает что-то делать(IMHO это не корректно).

Проблема еще в том, что сервис может быть еще даже не установлен!
Re[2]: Как определить запущена программа как сервис или как
От: Andrew S Россия http://alchemy-lab.com
Дата: 07.09.04 11:13
Оценка:
D>поиск рулит...
D>как минимум тут
D>http://rsdn.ru/Forum/Message.aspx?mid=34368
Автор: vadimus
Дата: 11.03.02


Поиск действительно рулит, но немного в другую сторону:
http://rsdn.ru/Forum?mid=606292
Автор: SergeMukhin
Дата: 14.04.04

http://rsdn.ru/Forum?mid=348553
Автор: Andrew S
Дата: 08.08.03


В общем — вариантов туева хуча, на любой вкус
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: Как определить запущена программа как сервис или как
От: Denis Россия http://blogs.gotdotnet.ru/personal/Denis
Дата: 07.09.04 11:14
Оценка:
AS>Поиск действительно рулит, но немного в другую сторону:
главное было дать направление
Re[3]: Как определить запущена программа как сервис или как
От: Qrdl  
Дата: 08.09.04 06:43
Оценка:
Здравствуйте, Andrew S, Вы писали:

D>>поиск рулит...

D>>как минимум тут
D>>http://rsdn.ru/Forum/Message.aspx?mid=34368
Автор: vadimus
Дата: 11.03.02


AS>Поиск действительно рулит, но немного в другую сторону:

AS>http://rsdn.ru/Forum?mid=606292
Автор: SergeMukhin
Дата: 14.04.04

AS>http://rsdn.ru/Forum?mid=348553
Автор: Andrew S
Дата: 08.08.03


AS>В общем — вариантов туева хуча, на любой вкус


К сожалению ссылки не содержат подходящего ответа, всё заканчивается анализом командной строки или полумерами, которые подходят не ко всем вариантам запуска :
1. Запуск сервиса;
2. Запуск приложения при установленном сервисе (сервис запущен);
3. Запуск приложения при установленном сервисе (сервис остановлен);
4. Запуск приложения при неустановленном сервисе.

Придется, видно, сначала проверять установлен ли сервис
Re[4]: Как определить запущена программа как сервис или как
От: Andrew S Россия http://alchemy-lab.com
Дата: 08.09.04 06:59
Оценка:
Q>К сожалению ссылки не содержат подходящего ответа, всё заканчивается анализом командной строки или полумерами, которые подходят не ко всем вариантам запуска :

Правда? Вы их хоть посмотрели? Если да, то где вы там увидели полумеры?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.