|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
|
DaDe |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 17.6.2007 Репутация: нет Всего: нет |
Добрый день.
Долго пытаюсь уже решить данную проблему, но безуспешно. Может кто из читающих, что-нибудь подскажет по теме. Проблема в том, что есть сервис запущенный с минимальным привилегиями и нужно, чтобы этот сервис запускал консольное приложение от имени администратора. Проблема состоит в том, что в ОС Windows 7 не консольные приложения нормально запускаются, а вот консольные не запускаются. Под XP и консольные запускаются нормально. Один из вариантов запуска:
Может, кто сможет подсказать. Буду очень признателен. |
|||
|
||||
grofast |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 7.3.2008 Репутация: нет Всего: нет |
Добрый день.
Я тоже мучаюсь с этой проблемой. А подскажи как ты определяешь. Рабочую станцию и рабочий стол? StartupInfo.lpDesktop:= Pchar(ST+'\'+DS); Спасибо. |
|||
|
||||
DaDe |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 17.6.2007 Репутация: нет Всего: нет |
winsta0\Default
|
|||
|
||||
grofast |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 7.3.2008 Репутация: нет Всего: нет |
Блин у меня на windows7 x64 +delphi 2011 не работает(
Если как обычное приложение все отлично если как сервис ни одно окно не показывается. Хотя процесс запускается отлично.( Это сообщение отредактировал(а) grofast - 4.10.2010, 15:42 |
|||
|
||||
DaDe |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 17.6.2007 Репутация: нет Всего: нет |
Результат процедуры Log покажи. Или вопрос, у тебя CreateProcessWithLogon выполняется или нет? |
|||
|
||||
grofast |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 7.3.2008 Репутация: нет Всего: нет |
Если строчку с указанием рабочего стола закоментировать то процесс запускается но на десктопе текущего пользователя не появляется. Если раскоментировать то вообще не запускается CreateProcessWithLogonW всегда возврашает true типа все удачно gestlasterror возврашает 0. Служба под пользователем programist (он в группе администраторы) Это сообщение отредактировал(а) bems - 5.10.2010, 19:57 |
|||
|
||||
grofast |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 7.3.2008 Репутация: нет Всего: нет |
Если из под Ситемы запускаю то выводит в лог ошибку 5
Отказано в доступе. |
|||
|
||||
DaDe |
|
||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 17.6.2007 Репутация: нет Всего: нет |
Судя по коду. Когда у тебя отображается результат gestlasterror, то CreateProcessWithLogonW не выполняется.
Из под System не получится, есть ограничения. |
||||
|
|||||
bems |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
grofast, кнопка КОД справа вверху над формой ответа
-------------------- Обижено школьников: 8 |
|||
|
||||
kami |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Нарыл у себя в закромах. Писалось несколько лет назад, проверено сейчас под Vista - cmd.exe из сервиса запускается на активном десктопе "только так". В висте система разграничения учетных записей, afair, не отличается от семерки - так же в разных терминальных сессиях, соответственно - разные WinSta и Desktop. Смотреть метод Timer1Timer. Функции когда-то писались под запуск вообще любого файла, у которого есть ассоциации в реестре. Может быть, что-то (или большинство) лишнее - просьба удалить самим Присоединённый файл ( Кол-во скачиваний: 512 ) Unit1.pas 7,57 Kb |
|||
|
||||
grofast |
|
||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 7.3.2008 Репутация: нет Всего: нет |
Нет почему у меня в коде прописано и если удачно процесс создается и если не удачно Выводить лог
Я кстати досмотрелся вчера ,в логах пишет что приложение запустилось но не может инициализироваться. Видимо из-за виртуализации. Если под тем пользователем под которым стартует служба то приложение запускается но на десктопе текущего пользователя не отображается я так думаю оно в нулевой сессии. Висит себе в процесах. Если из под другого пользователя приложение пытается запуститься то в логах пишет explorer.exe - Ошибка приложения Ошибка при запуске приложения (0xc0000142). Для выхода из приложения нажмите кнопку "ОК". То есть CreateProcessWithLogonW отрабатывает на отлично приложение запускается но почемуто не может инициализироватся. Я так думаю из-за виртуализации. Пока эксперементирую.) Добавлено @ 10:18
Спасибо. Это сообщение отредактировал(а) bems - 6.10.2010, 16:43 |
||||
|
|||||
grofast |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 7.3.2008 Репутация: нет Всего: нет |
Спасибо огромное. Я много функций переписал одной строкой и много нового узнал. И все заработало. Спасибо спасибо спасибо)))). |
|||
|
||||
grofast |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 7.3.2008 Репутация: нет Всего: нет |
kami
А еще просьба подскажи плиз нужно для решения второй части задачи. Если ни один пользователь не залогинен можно ли из под службы (system) запустить мою программу с правами пользователя? Или может залогинится сначала под ним нужно.? Спасибо. |
|||
|
||||
bems |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
Модератор: grofast, я второй раз прошу тебя пользоваться кнопкой "код". В следующий раз пойдешь на пару дней в ридонли
-------------------- Обижено школьников: 8 |
|||
|
||||
kami |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Чтобы запустить программу с правами пользователя, нужно получить права пользователя. Чтобы получить права пользователя, нужно или получить его токен (для не-вошедшего в систему пользователя - вызвать LogonUser) или сразу вызвать CreateProcessWithLogonW, которая автоматом его "залогинет". P.S. Могу ошибаться - давно не освежал в памяти данные этого направления. P.P.S. Вспомнил, что у этих моих функций есть ограничение, вытекающее из ограничения WTSGetActiveConsoleSessionID - если активно используется FastUserSwitching, то она будет возвращать SessionID для первого из залогиненных, и не важно, находится его сессия в WTS_SESSIONSTATE_LOCK (вызывана "смена пользователя") или активна. Решение, afair, в регистрации для своего сервиса нотификаций о смене сессии (SERVICE_CONTROL_SESSIONCHANGE), правда для этого нужно задействовать HandlerEx, а не Handler, как в Delphi ( по крайней мере по D7 включительно) и работе уже с этими данными. |
|||
|
||||
DaDe |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 17.6.2007 Репутация: нет Всего: нет |
Получается от имени учетной записи, запустившей сервис. Уже отчаиваюсь найти решение и возникают бредовые идеи типа создания задания в шедулере от имени другого пользователя, но это как-то не элегантно. Неужели никто не сталкивался с подобной задачей. |
|||
|
||||
kami |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
||||
|
||||
bems |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
kami, одно не всегда означает другое
-------------------- Обижено школьников: 8 |
|||
|
||||
DaDe |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 17.6.2007 Репутация: нет Всего: нет |
В вашем примере, если запустить сервис например, от имени пользователя User. Залогиневшись под пользователем User2 и запустив сервис, то мы не увидим окна cmd и оно будет запущенно от имени User. |
|||
|
||||
seldir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 11.11.2016 Репутация: нет Всего: нет |
Я новичок в системном программировании. Попытался изучить Ваш пример, все просто замечательно работает под win 8.1., но только при запуске сервиса или при перезагрузки системы, если сервис установить и выключить компьютер, а потом включить, то окно с cmd.exe не запускается, хотя сама служба находится в системе в состоянии "выполняется". Пыхтел над кодом целый день, но, очевидно, базовых знаний не хватает, подскажите, пожалуйста, куда смотреть? |
|||
|
||||
kami |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Служба пусть находится в любом состоянии. Вам нужно понять, почему не запускается нужный процесс. Для этого нужно анализировать коды возврата WinAPI функций. Т.к. работа идет в сервисе - пишите всё в лог. Подозрение на то, что сервис пытается стартануть приложение до того, как появится активная сессия пользователя. |
|||
|
||||
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |