Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: WinAPI и системное программирование > CreateProcessWithLogonW и запуск из под сервиса |
Автор: DaDe 3.10.2010, 15:07 | ||
Добрый день. Долго пытаюсь уже решить данную проблему, но безуспешно. Может кто из читающих, что-нибудь подскажет по теме. Проблема в том, что есть сервис запущенный с минимальным привилегиями и нужно, чтобы этот сервис запускал консольное приложение от имени администратора. Проблема состоит в том, что в ОС Windows 7 не консольные приложения нормально запускаются, а вот консольные не запускаются. Под XP и консольные запускаются нормально. Один из вариантов запуска:
Может, кто сможет подсказать. Буду очень признателен. |
Автор: grofast 4.10.2010, 14:09 |
Добрый день. Я тоже мучаюсь с этой проблемой. А подскажи как ты определяешь. Рабочую станцию и рабочий стол? StartupInfo.lpDesktop:= Pchar(ST+'\'+DS); Спасибо. |
Автор: DaDe 4.10.2010, 15:31 |
winsta0\Default |
Автор: grofast 4.10.2010, 15:40 |
Блин у меня на windows7 x64 +delphi 2011 не работает( Если как обычное приложение все отлично если как сервис ни одно окно не показывается. Хотя процесс запускается отлично.( |
Автор: DaDe 4.10.2010, 21:28 | ||
Результат процедуры Log покажи. Или вопрос, у тебя CreateProcessWithLogon выполняется или нет? |
Автор: grofast 5.10.2010, 16:26 | ||
Если строчку с указанием рабочего стола закоментировать то процесс запускается но на десктопе текущего пользователя не появляется. Если раскоментировать то вообще не запускается CreateProcessWithLogonW всегда возврашает true типа все удачно gestlasterror возврашает 0. Служба под пользователем programist (он в группе администраторы) |
Автор: grofast 5.10.2010, 16:45 |
Если из под Ситемы запускаю то выводит в лог ошибку 5 Отказано в доступе. |
Автор: bems 5.10.2010, 19:57 |
grofast, кнопка КОД справа вверху над формой ответа |
Автор: kami 6.10.2010, 01:30 |
Нарыл у себя в закромах. Писалось несколько лет назад, проверено сейчас под Vista - cmd.exe из сервиса запускается на активном десктопе "только так". В висте система разграничения учетных записей, afair, не отличается от семерки - так же в разных терминальных сессиях, соответственно - разные WinSta и Desktop. Смотреть метод Timer1Timer. Функции когда-то писались под запуск вообще любого файла, у которого есть ассоциации в реестре. Может быть, что-то (или большинство) лишнее - просьба удалить самим ![]() |
Автор: grofast 6.10.2010, 10:16 | ||||||||||
Нет почему у меня в коде прописано и если удачно процесс создается и если не удачно Выводить лог
Я кстати досмотрелся вчера ,в логах пишет что приложение запустилось но не может инициализироваться. Видимо из-за виртуализации. Если под тем пользователем под которым стартует служба то приложение запускается но на десктопе текущего пользователя не отображается я так думаю оно в нулевой сессии. Висит себе в процесах. Если из под другого пользователя приложение пытается запуститься то в логах пишет explorer.exe - Ошибка приложения Ошибка при запуске приложения (0xc0000142). Для выхода из приложения нажмите кнопку "ОК". То есть CreateProcessWithLogonW отрабатывает на отлично приложение запускается но почемуто не может инициализироватся. Я так думаю из-за виртуализации. Пока эксперементирую.) Добавлено @ 10:18
Спасибо. ![]() |
Автор: grofast 6.10.2010, 11:28 | ||
Спасибо огромное. Я много функций переписал одной строкой и много нового узнал. И все заработало. Спасибо спасибо спасибо)))). |
Автор: grofast 6.10.2010, 14:24 |
kami А еще просьба подскажи плиз нужно для решения второй части задачи. Если ни один пользователь не залогинен можно ли из под службы (system) запустить мою программу с правами пользователя? Или может залогинится сначала под ним нужно.? Спасибо. |
Автор: bems 6.10.2010, 16:43 |
Модератор: grofast, я второй раз прошу тебя пользоваться кнопкой "код". В следующий раз пойдешь на пару дней в ридонли |
Автор: kami 6.10.2010, 22:03 | ||
Чтобы запустить программу с правами пользователя, нужно получить права пользователя. Чтобы получить права пользователя, нужно или получить его токен (для не-вошедшего в систему пользователя - вызвать LogonUser) или сразу вызвать CreateProcessWithLogonW, которая автоматом его "залогинет". P.S. Могу ошибаться - давно не освежал в памяти данные этого направления. P.P.S. Вспомнил, что у этих моих функций есть ограничение, вытекающее из ограничения WTSGetActiveConsoleSessionID - если активно используется FastUserSwitching, то она будет возвращать SessionID для первого из залогиненных, и не важно, находится его сессия в WTS_SESSIONSTATE_LOCK (вызывана "смена пользователя") или активна. Решение, afair, в регистрации для своего сервиса нотификаций о смене сессии (SERVICE_CONTROL_SESSIONCHANGE), правда для этого нужно задействовать HandlerEx, а не Handler, как в Delphi ( по крайней мере по D7 включительно) и работе уже с этими данными. |
Автор: DaDe 7.10.2010, 21:10 | ||
Получается от имени учетной записи, запустившей сервис. Уже отчаиваюсь найти решение и возникают бредовые идеи типа создания задания в шедулере от имени другого пользователя, но это как-то не элегантно. Неужели никто не сталкивался с подобной задачей. |
Автор: kami 8.10.2010, 22:03 |
Это как? LocalSystem|NetworkService|LocalService? Тогда процесс был бы запущен на их десктопе, в 0 терминальной сессии и его окно не было бы видно... |
Автор: bems 8.10.2010, 22:05 |
kami, одно не всегда означает другое |
Автор: DaDe 9.10.2010, 17:41 | ||
В вашем примере, если запустить сервис например, от имени пользователя User. Залогиневшись под пользователем User2 и запустив сервис, то мы не увидим окна cmd и оно будет запущенно от имени User. |
Автор: seldir 12.11.2016, 18:59 | ||
Я новичок в системном программировании. Попытался изучить Ваш пример, все просто замечательно работает под win 8.1., но только при запуске сервиса или при перезагрузки системы, если сервис установить и выключить компьютер, а потом включить, то окно с cmd.exe не запускается, хотя сама служба находится в системе в состоянии "выполняется". Пыхтел над кодом целый день, но, очевидно, базовых знаний не хватает, подскажите, пожалуйста, куда смотреть? |
Автор: kami 19.11.2016, 13:44 |
Служба пусть находится в любом состоянии. Вам нужно понять, почему не запускается нужный процесс. Для этого нужно анализировать коды возврата WinAPI функций. Т.к. работа идет в сервисе - пишите всё в лог. Подозрение на то, что сервис пытается стартануть приложение до того, как появится активная сессия пользователя. |