Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Узнать как кем был запущен процесс / 21 сообщений из 21, страница 1 из 1
22.08.2010, 23:33
    #36805337
DelphiLexx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
Пишу сервис (gmtsrv.exe) на базе TService который имеет 4 параметра:
/INSTALL - установить службу
/UNINSTALL - удалить службу
/START - запустить службу
/STOP - остановить службу

Служба всего лишь при старте инициализирует форму которая в скрытом режиме выполняет нужную работу.
Также предусмотрена возможность работы с моим gmtsrv.exe как с обычным приложением, это если он не устанавливался как служба.
Возникает следующая проблема, если сделать так:
1) запускаем gmtsrv.exe /install - в результате зарегистрировалась служба (в случае ее запуска и с параметром /start она запустит мой gmtsrv.exe естественно под пользователем SYSTEM)
2) запускаем gmtsrv.exe - и здесь бы пользователю хотелось бы выдать сообщение что мол gmtsrv.exe уже был установлен как сервис (служба) и использовать как приложение можно только,
если удалить службу через /UNINSTALL
Для этого нужно узнать кем же был запущен процесс, службой или все пользователем как это сделать???
...
Рейтинг: 0 / 0
22.08.2010, 23:52
    #36805353
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
DelphiLexx
Для этого нужно узнать кем же был запущен процесс, службой или все пользователем как это
сделать???

Говорил же я тебе - используй WinAPI... Там всё просто: вернул
StartServiceCtrlDispatcher() ERROR_FAILED_SERVICE_CONTROLLER_CONNECT - ты запущен как
приложение.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
23.08.2010, 00:17
    #36805374
DelphiLexx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
Dimitry Sibiryakov
Говорил же я тебе - используй WinAPI... Там всё просто: вернул
StartServiceCtrlDispatcher() ERROR_FAILED_SERVICE_CONTROLLER_CONNECT - ты запущен как
приложение.

А есть ли возможность также через API узнать это, но не прибегая к ф-циям пытающие стартовать сервис, ведь на сколько я понимаю StartServiceCtrlDispatcher пытается стартовать процесс.
...
Рейтинг: 0 / 0
23.08.2010, 00:21
    #36805377
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
DelphiLexx
на сколько я понимаю StartServiceCtrlDispatcher пытается стартовать процесс.

Ни на сколько ты не понимаешь.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
23.08.2010, 00:34
    #36805382
DelphiLexx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
Dimitry Sibiryakov
Ни на сколько ты не понимаешь.

как так??? Исходя из параметров StartServiceCtrlDispatcher ему передается имя сервиса и главная процедура, так вот StartServiceCtrlDispatcher передает имя управление
...
Рейтинг: 0 / 0
23.08.2010, 00:38
    #36805384
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
DelphiLexxкак так???

Вот так. Отказался идти по пути познания, вот и тычешься теперь в параметры как слепое
щеня. Ты не на параметры смотри, а на то когда и зачем эта функция обязана быть вызвана.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
23.08.2010, 00:52
    #36805390
DelphiLexx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
Dimitry Sibiryakov
DelphiLexxкак так???

Вот так. Отказался идти по пути познания, вот и тычешься теперь в параметры как слепое
щеня. Ты не на параметры смотри, а на то когда и зачем эта функция обязана быть вызвана.


Дмитрий, ты можешь сказать способ как через API узнать юзер меня (gmtsrv.exe) пытается запустить или все же сервис, путем нажатия на кнопку Запустить(Пуск) в апплете Службы (Панель управление->Ажминистрирование->Службы)?
Доступ к Api сервису у меня есть - TService же не перекрывает доступ к API, а просто выполняет большую часть работы в том числе удобство использования OnStart, OnStop.
...
Рейтинг: 0 / 0
23.08.2010, 01:36
    #36805398
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
DelphiLexxюзер меня (gmtsrv.exe) пытается запустить или все же сервис, путем нажатия на кнопку Запустить(Пуск) в
а если этот самый юзер в свойствах твоего сервиса поменяет умолчательный LocalSystem на себя или специально созданного юзера?
...
Рейтинг: 0 / 0
23.08.2010, 01:41
    #36805399
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
... и поставит соотв. галочку.

P.S. Про соотв. программы-"сервизаторы" напоминать не будем.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
23.08.2010, 07:58
    #36805478
DelphiLexx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
Гаджимурадов Рустам... и поставит соотв. галочку.

P.S. Про соотв. программы-"сервизаторы" напоминать не будем.


Согласен способ с выяснением кем был запущен процесс не совсем удачен, но тогда как быть мне просто нужно различить запускался ли процесс нажатием кнопки Пуск(Запустить) в апплете службы или другим способом?
...
Рейтинг: 0 / 0
23.08.2010, 08:15
    #36805494
Lucefer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
Предлагаю простое решение. При запуске приложения создаем именованный мьютекс. Если создать не получилось по причине мьютекс уже создан - значит приложение уже запущено - выходим с ошибкой. В этом случае можно не беспокоится, что юзер запустит вначале приложение, а потом попытается запустить службу.
...
Рейтинг: 0 / 0
23.08.2010, 14:03
    #36806215
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
Если я правильно понял, то проблема в том, что если программа запускается как обычное приложение и установлена соответствующая служба, то выдать пользователю предупреждение

Определить, что запущено обычное приложение очень просто - в этом случае не вызывается событие TService.OnServiceStart

Определить наличие зарегистрированной службы поможет OpenService()

Все
...
Рейтинг: 0 / 0
23.08.2010, 14:08
    #36806227
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
_Vasilisk_
Если я правильно понял, то проблема в том, что если программа запускается как обычное
приложение и установлена соответствующая служба, то выдать пользователю предупреждение

Нет, проблема в отсутствии головного мозга у аффтара. Он и пытается вроде думать, ан
нечем. И даже гугль (на счёт "два" выдающий статью из MSDN "Как определить запущено ли
приложение как сервис или нет") не помогает.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
23.08.2010, 17:11
    #36806595
demian111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
Ну и че на парня наехали?, Тут и с мозгами не сразу поймешь что делать с этим TService :)
Если прочитать его самый первый пост, то ему нужно либо сервис запускать либо приложение!

Поэтому ему до вызова Application.Run , определиться какой собственно Application , из Forms или из SvcMgr использовать!!! Так что ждать вызова TService.OnServiceStart когда не понятно еще какой Application будет задействован как то не в кассу.

з.ы.
Можно конечно не отказаться от TService , и по методу Сибирякова(возможно как учебный вариант самый лучший способ).
Но думаю можно покопаться и с TService заставить работать! Мне этот вариант интереснее кажется, но тока времени щас копать нету, если тока попозже:)
...
Рейтинг: 0 / 0
23.08.2010, 18:12
    #36806733
wellwell
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
Зарегить сервис с ключом командной строки. В коде
if FindCmdLineSwitch('service') then сервис иначе обычный запуск
...
Рейтинг: 0 / 0
23.08.2010, 18:23
    #36806749
demian111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
wellwell,

похоже на то что прокатит, ну акромя того случая когда этот экзешник запустят через cmd или в батнике с параметром service :), чисто случайно :)
...
Рейтинг: 0 / 0
24.08.2010, 09:14
    #36807291
DelphiLexx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
wellwellЗарегить сервис с ключом командной строки. В коде
if FindCmdLineSwitch('service') then сервис иначе обычный запуск
Молодец wellwell ты в самую точку. Ребята отсюда ( http://forum.sources.ru/index.php?act=ST&f=12&t=311400&st=0 так и подсказали и это одно из самых простых и надежных решений.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
21.04.2015, 10:09
    #38941315
PascalDeathe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
Dimitry SibiryakovDelphiLexxкак так???

Вот так. Отказался идти по пути познания, вот и тычешься теперь в параметры как слепое
щеня. Ты не на параметры смотри, а на то когда и зачем эта функция обязана быть вызвана.


Дмитрий! Можете немного по подробнее рассказать про StartServiceCtrlDispatcher. Судя по МСДН-у мы передает в параметрах название сервиса и адрес функции сервиса. Как это нам может помочь при проверке запуска приложения как службы или консольного приложения.
Я увидел что если мы получаем ERROR_FAILED_SERVICE_CONTROLLER_CONNECT - то считаем что запускается консольное приложение, но что мы при этом должны передавать в параметрах?

Я не нахожу правильным проверять от имени какого пользователя запускается приложение, или проверять параметры запуска.
Я тоже пишу службу/приложение и для нормальной работы мне тоже необходимо понять на этапе инициализации кто запускает (менеджер служб или пользователь) службу/приложение.
...
Рейтинг: 0 / 0
21.04.2015, 10:12
    #38941316
PascalDeathe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
DelphiLexxwellwellЗарегить сервис с ключом командной строки. В коде
if FindCmdLineSwitch('service') then сервис иначе обычный запуск
Молодец wellwell ты в самую точку. Ребята отсюда ( http://forum.sources.ru/index.php?act=ST&f=12&t=311400&st=0 так и подсказали и это одно из самых простых и надежных решений.

Это вариант не плох, но он всего лишь обходной маневр задачи. Как насчет выработки универсального решения??? А не частного?
...
Рейтинг: 0 / 0
21.04.2015, 16:35
    #38941765
PascalDeathe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
StartServiceCtrlDispatcher() - работает криво. Если использовать для проверки - то приложение отрабатывает нормально, служба загибается.

Как вариант - проверять каким процессом было запущено приложение.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
05.04.2018, 13:22
    #39626080
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать как кем был запущен процесс
Мне недавно тоже надоело постоянно переключать параметр как запускать приложение : служба или GUI.
Немного покопался ради интереса и нашел вот что:
авторA window station contains a clipboard, an atom table, and one or more desktop objects. Each window station object is a securable object. When a window station is created, it is associated with the calling process and assigned to the current session.

The interactive window station is the only window station that can display a user interface or receive user input. It is assigned to the logon session of the interactive user, and contains the keyboard, mouse, and display device. It is always named "WinSta0". All other window stations are noninteractive, which means they cannot display a user interface or receive user input.

When a user logs on to a computer using Remote Desktop Services, a session is started for the user. Each session is associated with its own interactive window station named "WinSta0". For more information, see Remote Desktop Sessions.

Также нашел вот это: https://support.microsoft.com/en-us/help/171890/info-services-desktops-and-window-stations

Проверил имя для сервиса и для GUI...
WinSta0 - для гуи и Service-0x0-3e7 для сервиса

Поэтому по сути получилось вот так:
Код: pascal
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.
 function IsWinSta0: Boolean;
 var
   H: HWINSTA;
   sz: Cardinal;
   Name: string;
 begin
   H := GetProcessWindowStation();
   GetUserObjectInformation(H, UOI_NAME, nil, 0, sz);
   SetLength(Name, sz div StringElementSize(Name));
   GetUserObjectInformation(H, UOI_NAME, PChar(Name), sz, sz);
   Exit(Name.Contains('WinSta0'));
 end;

begin
  if IsWinSta0 then
  begin
    Vcl.Forms.Application.Initialize;
    Vcl.Forms.Application.MainFormOnTaskbar := True;
    Vcl.Forms.Application.CreateForm(TDebug, Debug);
    Vcl.Forms.Application.Run;
  end
  else
  begin
    if not Vcl.SvcMgr.Application.DelayInitialize or Vcl.SvcMgr.Application.Installing then
      Vcl.SvcMgr.Application.Initialize;
    Vcl.SvcMgr.Application.CreateForm(TTransportService, TransportService);
    Vcl.SvcMgr.Application.Run;    
  end;
end.



Учитывая что создавать интерактивные сервисы дурной тон (кстати у меня не проверка с галкой не сработала), можно забить на пункт
авторthe service type includes the SERVICE_INTERACTIVE_PROCESS flag), the service will use the following Window station and Desktop:
Winsta0\default

Из плюшек, не надо парится как запускается приложение.. как служба или как просто exe или из под IDE.. без всяких параметров и директив
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Узнать как кем был запущен процесс / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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