powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Узнать как кем был запущен процесс
21 сообщений из 21, страница 1 из 1
Узнать как кем был запущен процесс
    #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
Узнать как кем был запущен процесс
    #36805353
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DelphiLexx
Для этого нужно узнать кем же был запущен процесс, службой или все пользователем как это
сделать???

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

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

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

Как вариант - проверять каким процессом было запущено приложение.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Узнать как кем был запущен процесс
    #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
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Узнать как кем был запущен процесс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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