Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Служба и запуск программы, Служба и запуск программы 
:(
    Опции темы
ZBugz
  Дата 7.8.2014, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Добрый день smile 
Никогда не писал службы...
Помогайте...
Задача проста, надо написать службу, установить ее, а служба должна следить, запущена ли моя програма. Если нет, то запустить, если да, то ничего не делать...  smile  

Это сообщение отредактировал(а) ZBugz - 7.8.2014, 13:25
PM MAIL   Вверх
kami
Дата 7.8.2014, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Ох, и нажили же вы проблем себе smile Это совсем не простая задача...
How to start GUI from service under Windows Vista/7
P.S. Ссылка любезно предоставлена kirillkr

Это сообщение отредактировал(а) kami - 7.8.2014, 22:44
PM MAIL WWW   Вверх
drkot
Дата 8.8.2014, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(ZBugz @  7.8.2014,  14:25 Найти цитируемый пост)
запущена ли моя програма

первые вопросы на которые надо дать ответ, это:
Под кем запущена программа?
Где запущена программа?

только после этого можно определиться с тем, Как? решить задачу


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
ZBugz
Дата 8.8.2014, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(drkot @ 8.8.2014,  01:42)
Цитата(ZBugz @  7.8.2014,  14:25 Найти цитируемый пост)
запущена ли моя програма

первые вопросы на которые надо дать ответ, это:
Под кем запущена программа?
Где запущена программа?

только после этого можно определиться с тем, Как? решить задачу

1. По текущем пользователем. Хотя, если есть варианты указать другого пользователя, я не против это тоже написать.
2. В той же папке где и сервис.

Задача у меня простая... Я написал программу, она в автозапуске на сервере... Но иногда выключается питание и APC не хватает, после подачи питания, сервер загружается, но программа то не запускается, если не войти под юзером... А надо что бы запускалась. Вот и хочу написать сервис, который стартанет мою программу...

Добавлено через 48 секунд
Цитата(kami @ 7.8.2014,  22:41)
Ох, и нажили же вы проблем себе smile Это совсем не простая задача...
How to start GUI from service under Windows Vista/7
P.S. Ссылка любезно предоставлена kirillkr

Спасибо, гляну. Я и сервис то сам еще не писал даже  smile 
PM MAIL   Вверх
kami
Дата 8.8.2014, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(ZBugz @  8.8.2014,  06:19 Найти цитируемый пост)
сервер загружается, но программа то не запускается, если не войти под юзером... А надо что бы запускалась. Вот и хочу написать сервис, который стартанет мою программу...

Тогда - это неправильная постановка задачи.
Сервис не сможет стартануть программу от имени пользователя, если пользователь не залогинен.
Значит - сперва надо залогинить юзера.
А раз программа стоит в автозапуске - то больше ничего не надо делать, она сама запустится при логоне.

Другой вопрос - а надо ли ее запускать от пользователя, не сможет ли она работать от имени системной учетки?

PM MAIL WWW   Вверх
Delvish
Дата 8.8.2014, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 1
Всего: 4



Цитата(kami @  8.8.2014,  09:13 Найти цитируемый пост)
сперва надо залогинить юзера

начиная с Vista сервисы умеют запускаться вне зависимости от регистрации пользователя. так что вполне себе решение проблемы с автозапуском
PM MAIL   Вверх
kami
Дата 8.8.2014, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(Delvish @  8.8.2014,  10:38 Найти цитируемый пост)
начиная с Vista сервисы умеют запускаться вне зависимости от регистрации пользователя.

вообще-то нет. Сервис в любом случае работает из-под пользователя, и пошло это с момента их появления. В большинстве своем этот "изподпользователь" -  LOCALSYSTEM. 
А начиная с Висты просто запретили интерактивность сервисов. Но даже интерактивному сервису совершенно необязателен был активный рабочий стол.

В любом случае - чтобы запустить приложение в оконной станции, сессии и рабочем столе пользователя - надо, чтобы этот пользователь был залогиненю

Это сообщение отредактировал(а) kami - 8.8.2014, 11:37
PM MAIL WWW   Вверх
Delvish
Дата 8.8.2014, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 1
Всего: 4



Извиняюсь, спутал с приложениями, запускаемыми планировщиком с возможностью выбора варианта запуска "вне зависимости от регистрации пользователя". Кстати, не так давно я поднимал схожую тему и реализовал почти так, как это предлагается в статье, приведенной Вами в первом посте этой темы, только реализовал несколько проще:

Код

function WTSQueryUserToken(SessionId : DWORD; phToken: pHandle) : bool; stdcall; external 'wtsapi32.dll';
function WTSGetActiveConsoleSessionId : DWORD; stdcall; external 'kernel32.dll';

procedure RunApp(FilePath : string);
var
   hToken : THandle;
   si     : STARTUPINFO;
   pi     : PROCESS_INFORMATION;
begin
   if WTSQueryUserToken(WtsGetActiveConsoleSessionID, @hToken) then
     begin
       ZeroMemory(@si, SizeOf(si));
       si.cb := SizeOf(si);
       si.lpDesktop := nil;
       CreateProcessAsUser(hToken, nil, PAnsiChar(FilePath), nil, nil, False, 0, nil, nil, si, pi);
       CloseHandle(hToken);
     end;
end;

PM MAIL   Вверх
kami
Дата 8.8.2014, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Delvish, увы, но этого кода мало, о чем явно говорится в ремарках MSDN, самое главное - 
Цитата

CreateProcessAsUser does not load the specified user's profile into the HKEY_USERS registry key. Therefore, to access the information in the HKEY_CURRENT_USER registry key, you must load the user's profile information into HKEY_USERS with the LoadUserProfile function before calling CreateProcessAsUser.
......
If the lpEnvironment parameter is NULL, the new process inherits the environment of the calling process. CreateProcessAsUser does not automatically modify the environment block to include environment variables specific to the user represented by hToken. For example, the USERNAME and USERDOMAIN variables are inherited from the calling process if lpEnvironment is NULL. It is your responsibility to prepare the environment block for the new process and specify it in lpEnvironment.

Отсюда - запускаемое приложение не получит нужные данные из реестра и доступ к сетевым ресурсам.

Добавлено через 58 секунд
Цитата(kami @  8.8.2014,  15:10 Найти цитируемый пост)
 не получит нужные данные из реестра

Причем - совершенно не обязательно, что приложение само будет пытаться лезть в реестр, вполне возможно туда полезут используемые dll...
PM MAIL WWW   Вверх
drkot
Дата 8.8.2014, 16:01 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(ZBugz @  8.8.2014,  07:19 Найти цитируемый пост)
1. По текущем пользователем.

Текущий это какой? Тот кто владеет терминальной сессией? или RDP сессией?
Цитата(ZBugz @  8.8.2014,  07:19 Найти цитируемый пост)
2. В той же папке где и сервис.

Речь не о местоположении файла, речь о пространстве имен. Под какой сессией, на каком рабочем столе? 
Цитата(ZBugz @  8.8.2014,  07:19 Найти цитируемый пост)
 если не войти под юзером... 

Вам наверно надо перенести функционал в сервис и всех то делов...
Или просто из сервиса выполнить shellExec и пусть себе работает

Цитата(kami @  8.8.2014,  09:13 Найти цитируемый пост)
если пользователь не залогинен

может, но смысла в этом особого нет. если только конкретный пользователь не обладает "ценными" правами (например это аккаунт на сервере баз данных MSSQL).

Цитата(Delvish @  8.8.2014,  11:38 Найти цитируемый пост)
с Vista сервисы умеют запускаться вне зависимости от регистрации пользователя

да ну что Вы говорите? а в nt4 они что ждали пока админ протрезвеет и залогинется? 

Цитата(kami @  8.8.2014,  12:34 Найти цитируемый пост)
запретили интерактивность сервисов

не запретили, а привели к "безопасному" виду. Показать окно на любом рабочем столе возможно, но окна создаваемые сервисом по умолчанию привязаны его рабочему столу.

Цитата(kami @  8.8.2014,  12:34 Найти цитируемый пост)
надо, чтобы этот пользователь был залогиненю

нет не надо. процесс от имени любого пользователя может работать в пределах любого пространства если это не запрещено политикой. изначально это не запрещено. в частности планировщик задач так и работает.


ZBugz, в вашем случае лучший и простейший вариант создать задачу в планировщике, указать там нужного пользователя и все. Подходящий триггер "При запуске".
Пока пользователь не залогинется программа будет висеть на десктопе default пользователя system, как только появится пользователь, программа перескочит на его рабочий стол.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
kami
Дата 8.8.2014, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(drkot @  8.8.2014,  16:01 Найти цитируемый пост)
а привели к "безопасному" виду. 

Окна от интерактивных сервисов в Висте показывались на отдельном рабочем столе, переключение на который происходит с использованием службы "Обнаружения интерактивных служб". В Win7 эта служба по умолчанию не в автозапуске. Сам сервис не может получить доступ к рабочему столу пользователя.

Цитата(drkot @  8.8.2014,  16:01 Найти цитируемый пост)
Показать окно на любом рабочем столе возможно, но окна создаваемые сервисом по умолчанию привязаны его рабочему столу.

Пример/ссылку возможности этого можно?
помнится, сие для меня была очень большая проблема (которую я не решил, а до сих пор хочется) - отобразить окно, созданное сервисом на десктопе пользователя, сессию которого можно получить через WTSGetActiveConsoleSessionID.


Это сообщение отредактировал(а) kami - 8.8.2014, 16:27
PM MAIL WWW   Вверх
drkot
Дата 8.8.2014, 17:32 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(kami @  8.8.2014,  17:26 Найти цитируемый пост)
Сам сервис не может получить доступ к рабочему столу пользователя

Да что вы говорите? и кто же ему помешает? 
Создавать окна с правами системы на рабочем столе терминального пользователя потенциально не безопасно, это да... так пусть разработчик думает... его предупредили...
А вот то что окна сервиса автоматически не выкидывает на терминальный рабочий стол, это да... и это правильно.

Цитата(kami @  8.8.2014,  17:26 Найти цитируемый пост)
"Обнаружения интерактивных служб"

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

Цитата(kami @  8.8.2014,  17:26 Найти цитируемый пост)
Пример/ссылку возможности этого можно?

у Rouse_ есть пример... там как раз сервис с окнами, не помню только насколько он соответствует этой теме...
а в целом делается примерно так:
Код

  StartupInfo.lpDesktop:= 'winsta0\default';

этот параметр и определяет на какой рабочий стол будет подцеплен поток.
Создаем поток привязываем его к нужному столу
Создаем окно в контексте потока.
Оно отобразилось на нужном рабочем столе...

Единственное рабочий тол типа "logon" не принимает потоки от кого попало...



--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
kami
Дата 8.8.2014, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(drkot @  8.8.2014,  17:32 Найти цитируемый пост)
этот параметр и определяет на какой рабочий стол будет подцеплен поток.

Вы утверждали, что сервис может отобразить окно на рабочем столе пользователя. StartupInfo относится к запуску отдельного процесса.
Даже если не брать это в расчет, сей параметр всего лишь определяет, какой рабочий стол будет использован. При этом рабочий стол должен принадлежать WinSta, под которым запущен процесс. Для справки - у каждой Window Station свой набор столов, по умолчанию - default. Да, Window Station можно переключать, но увы - только в рамках своей сессии. Вы не в состоянии открыть десктоп пользователя.
Итого - указание WinSta0\Default приведет к тому, что отдельный процесс будет использовать дефолтный десктоп, принадлежащий сессии родительского процесса, т.е. - сервису. А у сервисов  - отдельный, не-интерактивный десктоп.

Цитата(drkot @  8.8.2014,  17:32 Найти цитируемый пост)
Да что вы говорите? и кто же ему помешает? 

Пример в студию. Что угодно - нарисовать линию, показать окно - любое действие из сервиса в Vista|Win7, воздействующее на рабочий стол пользователя. Выше я дал пруфлинки, почему считаю это невозможным.
На всякий случай - подчеркну: непосредственно из сервиса, а не отдельного приложения, запущенного им.

Это сообщение отредактировал(а) kami - 8.8.2014, 17:50
PM MAIL WWW   Вверх
Delvish
Дата 8.8.2014, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 1
Всего: 4



Цитата(kami @  8.8.2014,  16:10 Найти цитируемый пост)
запускаемое приложение не получит нужные данные из реестра и доступ к сетевым ресурсам

На счет раздела HKCU я не проверял, но вот сеть работает исправно. Или под сетевыми ресурсами имеется ввиду доступ к шарам?
В общем, как это описал выше drkot, в моем случае одна программа запускается от имени Системы, ждет входа пользователя, после чего приведенным выше кодом запускает основную программу, которая работает безо всяких проблем.
Если же топикстартеру не нужно ждать логина пользователя, то планировщик, как я писал выше, позволяет запускать задачи вне зависимости от регистрации.  Ему просто нужно определиться с самой задачей smile
PM MAIL   Вверх
drkot
Дата 8.8.2014, 22:54 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(kami @  8.8.2014,  18:46 Найти цитируемый пост)
 должен принадлежать WinSta, под которым запущен процесс

Во первых Вы правы в своих суждениях. Но Вы движетесь по пути, который не предполагает решения. Конечно можно углубиться в права и привилегии и переключить окно с одной станции на другую, но это не тот путь...
Никто не мешает создать процесс под в нужной станции/столе, и выполнить то что нужно, при этом задав процессу права пользователя ... 
Цитата(kami @  8.8.2014,  18:46 Найти цитируемый пост)
принадлежащий сессии родительского процесса

в этом вопросе не могу с Вами согласится... 
Цитата(kami @  8.8.2014,  18:46 Найти цитируемый пост)
Пример в студию. 

я же говорю скачайте пример с сайта Rouse и не создавайте панику... Функциональный пример для этой задачи в три строчки не поместишь...
пример от Rouse
Тотя могли и сами скачать, чай не дети малые.
Цитата(kami @  8.8.2014,  18:46 Найти цитируемый пост)
а не отдельного приложения, запущенного им

а в чем разница? а... да... Вместо того чтобы пройти в дверь, мы по старинке пытаемся пробить стену головой... ну тут каждый выбирает по себе... извольте...


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
ZBugz
  Дата 9.8.2014, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Так, погодите... У меня уже голова кругом пошла, пока Вас читал, 95% информации не понял  smile 
И так по порядку....
Есть windows 2008R2
Там есть моя программка, она в атозапуске. Пользователи: Администратор и гость. 
Когда выключают свет, к примеру, и комп перезагружается, и некому зайти под любым из пользователей, то программа не запускается.
Вот мне и надо, что бы ее запустил сервис.
Ну как в антивирусе или файрволе...
GUI в сервис конечно я не перенесу, там программа большая. Мне старта моей хватит и остлеживание ее на наличие запущенности...

Желательно (начитался Ваших диcскусий), мне бы пример, с сервисом, в котором можно указат пользователя и пароль из под которого он запустится и если их не указывать, то что бы по умолчанию он запускался из под LOCALSYSTEM  smile 

З.Ы. Никаких там RDP или для Sql или использовать планировщик или еще чего либо, мне не надо, чисто локальный пользователь...


Это сообщение отредактировал(а) ZBugz - 9.8.2014, 06:51
PM MAIL   Вверх
drkot
Дата 9.8.2014, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(drkot @  8.8.2014,  17:01 Найти цитируемый пост)
ZBugz, в вашем случае лучший и простейший вариант создать задачу в планировщике, указать там нужного пользователя и все. Подходящий триггер "При запуске".Пока пользователь не залогинется программа будет висеть на десктопе default пользователя system, как только появится пользователь, программа перескочит на его рабочий стол.


но если есть желание приобрести мешочек геморроя, то ссылка на пример выше


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
kami
Дата 9.8.2014, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(drkot @  8.8.2014,  22:54 Найти цитируемый пост)
Но Вы движетесь по пути, который не предполагает решения.

Пардон, но этот путь задали Вы. Изначально меня смутило Ваше заявление о возможности доступа к десктопу из сервиса. Еще раз подчеркну - из сервиса, о чем Вы неоднократно (в том числе в ехидных фразах) утверждали. Именно поэтому я и пытался расставить все точки над i - по прежнему ли нельзя (так было, когда пытался заниматься этим вопросом), то ли ситуация поменялась, а я не в курсе.
Цитата(drkot @  8.8.2014,  22:54 Найти цитируемый пост)
 Вместо того чтобы пройти в дверь, мы по старинке пытаемся пробить стену головой... ну тут каждый выбирает по себе... извольте...

О том, что есть свет в конце тоннеля - с чувством полного превосходства сказали Вы. Печально, что в конечном итоге это оказалось не так. Я бы с огромной радостью посыпал голову пеплом и пошел перечитывать мануалы. 
Цитата(drkot @  8.8.2014,  22:54 Найти цитируемый пост)
Конечно можно углубиться в права и привилегии и переключить окно с одной станции на другую, но это не тот путь...

Углубиться можно. Но это не поможет - WinSta останется в той же сессии, о чем я уже говорил.
Цитата(drkot @  8.8.2014,  22:54 Найти цитируемый пост)
в этом вопросе не могу с Вами согласится... 

А зря. Смысл не в упоминании десктопа в lpDesktop, а именно в манипуляциях с hToken. Судя по этому, десктоп можно не указывать.

Цитата(drkot @  8.8.2014,  22:54 Найти цитируемый пост)
Никто не мешает создать процесс под в нужной станции/столе, и выполнить то что нужно, при этом задав процессу права пользователя ... 

Так именно об этом речь и шла изначально, и проблем с этим по большому счету нет. Пример Rouse я посмотрел практически сразу после его упоминания, но там так же используется запуск отдельного процесса. Ни о каком SetThreadDesktop для потока сервиса речи не идет.


Возвращаясь к исходному вопросу:
ZBugz, что мешает обойтись не программерскими, а административными методами решения? Например, Autologon. При включении компьютера сразу будет залогинен пользователь и будет запущено то, что указано в его автозапуске. 

quod erat demonstrandum


Цитата(ZBugz @  9.8.2014,  06:48 Найти цитируемый пост)
 мне бы пример, с сервисом, в котором можно указат пользователя и пароль из под которого он запустится

Ну, а если все равно нужен сервис, да и в добавок логин/пароль известны -  воспользуйтесь CreateProcessWithLogonW. Вы попробуйте, там нечему не-получаться smile.
PM MAIL WWW   Вверх
kami
Дата 9.8.2014, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(drkot @  9.8.2014,  17:02 Найти цитируемый пост)
Пока пользователь не залогинется программа будет висеть на десктопе default пользователя system, как только появится пользователь, программа перескочит на его рабочий стол.

Да никто не переключится. НЕВОЗМОЖНО это. Программа так и останется висеть на десктопе сервисов. Сейчас для подтверждения своего мнения провел несколько экспериментов - да, приложения запускаются через планировщик. Да, они есть в процессах, НО ProcessExplorer говорит, что запущен от имени нужного пользователя... вот только в сесии 0 (LocalSystem) и WindowStations\Service-0x0-24012.
Планировщик - не выход.
PM MAIL WWW   Вверх
drkot
Дата 9.8.2014, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



kami, у нас как-то диалог глухого с немым получился... ну да ладно, не суть
Вы останетесь при своём, и я при своем, так что не о чем спорить...
А то, что Вы хотите сделать можно, но это не тривиально и для большинства задач не есть рациональное решение. 
Цитата(kami @  9.8.2014,  22:18 Найти цитируемый пост)
Планировщик - не выход.

ню-ню


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
ZBugz
Дата 10.8.2014, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(drkot @  8.8.2014,  22:54 Найти цитируемый пост)
Возвращаясь к исходному вопросу:
ZBugz, что мешает обойтись не программерскими, а административными методами решения? Например, Autologon. При включении компьютера сразу будет залогинен пользователь и будет запущено то, что указано в его автозапуске. 

Не, люблю все сам smile 

Цитата

Ну, а если все равно нужен сервис, да и в добавок логин/пароль известны -  воспользуйтесь CreateProcessWithLogonW. Вы попробуйте, там нечему не-получаться smile.

Вот пример бы  smile 
PM MAIL   Вверх
kami
Дата 10.8.2014, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(ZBugz @  10.8.2014,  07:15 Найти цитируемый пост)
Вот пример бы 

Честно говоря - даже не знаю, как построить пример, чтобы он не стал непосредственным решением задачи smile

В общем и целом:
нужно создать новый проект - сервис, а в OnExecute выполнить единственное мероприятие - CreateProcessWthLogon. А если программа продолжает оставаться в автозагрузке - то LogonUser.
Вы попробуйте, а с тем что не получится (хотя я не понимаю, что там может не получиться) - сюда.


drkot, все-таки я настоятельно прошу доказательств Вашей точки зрения, раз уж Вы продолжаете настаивать на том, что это возможно.
Цитата(drkot @  9.8.2014,  22:41 Найти цитируемый пост)
А то, что Вы хотите сделать можно, но это не тривиально и для большинства задач не есть рациональное решение. 

Какие бы ни были извращения при "стыковке" своего потока с интерактивным рабочим столом - оно в любом случае окупится тем, что не будет необходимости использовать IPC. Механизмы синхронизации "своих" потоков гораздо проще в применении.
Пусть это будет нетривиально, пусть с извращениями - главное чтобы было.
Повторно прошу: пример, ссылку - что угодно, реализующее взаимодействие с рабочим столом пользователя из потока, принадлежащего сервису.

Цитата(drkot @  9.8.2014,  22:41 Найти цитируемый пост)
ню-ню

Опять это бездоказательное "я знаю и умею, а вы, серые, продолжайте упорствовать в своем невежестве". 

Я дождусь подтверждения ваших слов, или это так и останется на уровне ОБС?

Это сообщение отредактировал(а) kami - 10.8.2014, 14:16
PM MAIL WWW   Вверх
drkot
Дата 10.8.2014, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(kami @  10.8.2014,  15:14 Найти цитируемый пост)
Какие бы ни были извращения при "стыковке" своего потока с интерактивным рабочим столом

Данные извращения сводятся к переписыванию системной области процесса требует отключения защитных механизмов системы. К делфи не имеет никакого отношени. После прикрытия "интерактивных" сервисов копал именно в этом направлении. Выяснилось, что для нормальной работы на произвольной машине добиться не получится.
Насколько понимаю 
Цитата(kami @  8.8.2014,  17:26 Найти цитируемый пост)
службы "Обнаружения интерактивных служб"

делает что-то очень подобное, но ей "разрешено", а другим нет. Какие конкретно права и привилегии имеет эта служба не изучал.
Для себя решил, что "интерактивных" сервисов быть не должно и точка. Если сервисом надо управлять, то делается десктопное приложение через которое управляется (настройки, телеметрия).
Но никаких диалоговых окон из сервиса быть не должно, никаких ожиданий ответа от пользователя и прочего.
Если хочется развлечься, то это Ваше право.
Есть еще два варианта: 1) регистрируется COM сервер (или расширение оболочки) и через него открываются окна; 2) запустить сервис в контексте текущего пользователя
Проверять не пробовал, это заметки с того времени.
 
Цитата(kami @  10.8.2014,  15:14 Найти цитируемый пост)
 "я знаю и умею, а вы, серые, продолжайте упорствовать в своем невежестве"

нет, это скорее "чем Вам планировщик не угодил?". 

ZBugz, лучшее решение то, которое самое простое... 


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
ZBugz
Дата 10.8.2014, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(kami @ 10.8.2014,  14:14)

Честно говоря - даже не знаю, как построить пример, чтобы он не стал непосредственным решением задачи smile

А вот , к прмеру, касперский или outpost firewall, они работают даже, когда компьютер ен залогинен. Или бэкапер cobian backup, тот же, там в нем прописываешь под авторизироватся и все, он сам шурует, даже если не залогинишься в windows...
Мне как раз как у них надо... smile

Цитата(drkot @ 10.8.2014,  15:33)

ZBugz, лучшее решение то, которое самое простое...

Согласен, поэтому и хочу сам написать, я считаю это самым простым smile 

Это сообщение отредактировал(а) ZBugz - 10.8.2014, 19:15
PM MAIL   Вверх
kami
Дата 11.8.2014, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(ZBugz @  10.8.2014,  19:13 Найти цитируемый пост)
А вот , к прмеру, касперский или outpost firewall, они работают даже, когда компьютер ен залогинен. Или бэкапер cobian backup, тот же, там в нем прописываешь под авторизироватся и все, он сам шурует, даже если не залогинишься в windows...

Ага. Пока не залогинен - "шурует" сервис.
Когда залогинен - сервис запускает GUI процесс под "залогиненным" пользователем, но "шуровать" продолжает все равно сервис. А гуй - всего-навсего представляет собой прослойку между пользователем и сервисом. Эта прослойка показывает информацию от сервиса - пользователю и отправляет в сервис команды, отданные пользователем.

Вы уверены, что теперь надо именно это?
PM MAIL WWW   Вверх
ZBugz
Дата 11.8.2014, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата

Ага. Пока не залогинен - "шурует" сервис.
Когда залогинен - сервис запускает GUI процесс под "залогиненным" пользователем, но "шуровать" продолжает все равно сервис. А гуй - всего-навсего представляет собой прослойку между пользователем и сервисом. Эта прослойка показывает информацию от сервиса - пользователю и отправляет в сервис команды, отданные пользователем.

Вы уверены, что теперь надо именно это?

Неверно smile 
Хочу как у других...
Пока не залогиен, запускается сервис, который стартует мою программу. 
Как юзер залогинился, программа уже и так запущена, тогда два варианта (не знаю что лучше и как реализовать хотя бы один):

1. Так что ее не трогаем... Но все равно каждые 5 секунд проверяет ее запущенность, елси не запущенная, то запускает ее.
Если я закрываю комманду, то посылаю комманду сервису, который выключает таймер проверки запуска программы...
2. Выгружаем программу и срабатывает обычный автозапуск, который уже написан.
PM MAIL   Вверх
Delvish
Дата 12.8.2014, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 1
Всего: 4



Раз уж так хочется именно через сервис, то у Rouse_ есть хороший пример взаимодействия сервиса с рабочим столом пользователя

PM MAIL   Вверх
kami
Дата 12.8.2014, 11:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(ZBugz @  11.8.2014,  18:36 Найти цитируемый пост)
Хочу как у других...

Вы мне напоминаете 90+% заказчиков - они все хотят "чтобы было красиво", но вот что означает это "красиво" - никто объяснить не может. И когда пытаешься отдать им решение, начинается "ну, да, это конечно классно, но совсем не то что мне надо" (да, еще достаточно много народа признает только waterfall).

Давайте полностью проговорим алгоритм работы. 
"После загрузки компьютера запускается наша служба, которая..."
А дальше всё зависит от первой части. Но я не понимаю, чем плох авто-логон юзера, пусть даже сделанный из своего сервиса.

PM MAIL WWW   Вверх
kami
Дата 12.8.2014, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Update:

Цитата(ZBugz @  11.8.2014,  18:36 Найти цитируемый пост)
Пока не залогиен, запускается сервис, который стартует мою программу. 

Ок, программа стартанула. Но если ручками не залогинить пользователя до запуска приложения - вы не увидите его GUI. Хотя... у меня не было необходимости в использовании CreateProcessWithLogonW, посему - может и "прокатит".

Цитата(ZBugz @  11.8.2014,  18:36 Найти цитируемый пост)
каждые 5 секунд проверяет ее запущенность, елси не запущенная, то запускает ее.

Это - 2 под-задачи - а)получение списка процессов б)запуск своего от имени пользователя. Первая более чем широко описана, решение по второй предлагалось здесь во многих постах, включая пример Rouse, упомянутый drkot и Delvish.

Цитата(ZBugz @  11.8.2014,  18:36 Найти цитируемый пост)
Выгружаем программу и срабатывает обычный автозапуск, который уже написан.

Реализовывать можно по разному, смотря кто будет проверять на второй запуск. В любом случае - потребуется взаимодействие двух приложений.

Так чего же вам не хватает, чтобы начать решать эту задачу?

Это сообщение отредактировал(а) kami - 12.8.2014, 13:28
PM MAIL WWW   Вверх
Delvish
Дата 12.8.2014, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 1
Всего: 4



Оу, что-то я проглядел что drkot уже давал ссылку на Багеля. Зато я припомнил старую очень похожую тему, которую некогда встречал... kami, ваш же пост smile
PM MAIL   Вверх
ZBugz
Дата 13.8.2014, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата

Вы мне напоминаете 90+% заказчиков - они все хотят "чтобы было красиво", но вот что означает это "красиво" - никто объяснить не может.

Ну я просто считаю, что так правильно написать smile 
Цитата

Ок, программа стартанула. Но если ручками не залогинить пользователя до запуска приложения - вы не увидите его GUI. Хотя... у меня не было необходимости в использовании CreateProcessWithLogonW, посему - может и "прокатит".

Мне никаких GUI не надо видить, тем более это невозможно, раз не залогинен smile
Цитата

Это - 2 под-задачи - а)получение списка процессов б)запуск своего от имени пользователя. Первая более чем широко описана, решение по второй предлагалось здесь во многих постах, включая пример Rouse, упомянутый drkot и Delvish.
Это я гляну...
Цитата

Реализовывать можно по разному, смотря кто будет проверять на второй запуск. В любом случае - потребуется взаимодействие двух приложений.

Эта не проблема.
Цитата

Так чего же вам не хватает, чтобы начать решать эту задачу?

Мне нужен сам код сервиса, где мне подскажут, куда прописать от чьего имени его запустить, при установке и где (в какой процедуре), мне прописать запуск и мониторинг запуска моей програмы. Впринципе это меня и беспокоит, остальное я знаю как написать, ну разве что никогда не писал запуск процесса от имени пользователя, я писал только прорсто запуск http://forum.sources.ru/index.php?showtopic=349249&hl=
PM MAIL   Вверх
kami
Дата 13.8.2014, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(ZBugz @  13.8.2014,  06:29 Найти цитируемый пост)
Мне нужен сам код сервиса,  

Цитата(kami @  10.8.2014,  14:14 Найти цитируемый пост)
нужно создать новый проект - сервис, 

C этим проблем быть не должно - при создании нового проекта всего лишь выбрать Service Application, все остальное Delphi сделает за вас.

Цитата(ZBugz @  13.8.2014,  06:29 Найти цитируемый пост)
где мне подскажут, куда прописать от чьего имени его запустить, 

Оставить по умолчанию.
Цитата(ZBugz @  13.8.2014,  06:29 Найти цитируемый пост)

при установке и где (в какой процедуре), мне прописать запуск и мониторинг запуска моей програмы.

Например, запуск можно в OnCreate сервиса, а мониторинг... ну бросьте таймер на этот сервис, к примеру.

Это сообщение отредактировал(а) kami - 13.8.2014, 07:26
PM MAIL WWW   Вверх
drkot
Дата 13.8.2014, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(kami @  13.8.2014,  08:24 Найти цитируемый пост)
запуск можно в OnCreate сервиса

не стоит использовать это событие для запуска, так как оно возникает всегда, когда исполняется файл. 
Для организации сервиса можно использовать либо OnStart OnStop либо OnExecute.
Единственно нужно не забывать, что при запуске сервиса еще не все работает в системе, и по хорошему нужно бы подождать, пока нужные для работы системы запустятся.

Цитата(ZBugz @  13.8.2014,  07:29 Найти цитируемый пост)
Ну я просто считаю, что так правильно написать

если это самостоятельный процесс, то правильнее в виде сервиса. но если эта реализация будет "кривая" то вряд ли такой подход можно считать правильным.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
ZBugz
Дата 14.8.2014, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Ну хорошо. Я все посмотрю, выложу тут, что я написал, будем проверять smile
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.