Пытаюсь из сервиса запустить explorer.exe, которого перед тем, принудительно завершаю!
Непосредственно через CreateProcessAsUser вроди не удалось запустить, по этому потом пробовал запустить через *.bat в котором написано: /C explorer.exe
Так уже запускается, но как то странно, многие иконки на рабочем столе не появляются, и обычно выдаётся сообщение в котором на некий idlist сыляется.
Точно так же запускается, если вместо bat-ник я запускаю специально для этого написанную маленькую программу *.exe, в котором просто запускаю через ShellExecute explorer-а.
Не понимаю в чём проблема..., все эти способы вызываются же в узер моде, я это проверил через ProcExplorer-ом. И каждый из них работает в отдельности, то есть ежли в ручную их запускаю, и потом завершаю explorer, то из них правильно запускаются explorer, но когда из сервиса, то только так как описывал выше.
В чём может быть проблема ?
Здравствуйте, vega5, Вы писали:
V>Пытаюсь из сервиса запустить explorer.exe, которого перед тем, принудительно завершаю! V>Непосредственно через CreateProcessAsUser вроди не удалось запустить, по этому потом пробовал запустить через *.bat в котором написано: /C explorer.exe V>Так уже запускается, но как то странно, многие иконки на рабочем столе не появляются, и обычно выдаётся сообщение в котором на некий idlist сыляется.
Возможно, проблема в том, что запущенный explorer.exe имеет неправильные переменные окружения.
Поэтому за ярлыками на рабочий стол лезет не в C:\User\name, а в C:\Windows\system32\config\systemprofile.
Если вместо explorer.exe запустить cmd.exe и вбить в нее команду "echo %USERPROFILE%", ее вывод должен
быть в точности таким, как если бы cmd.exe был запущен обычно, пользователем через меню "Пуск".
Здравствуйте, okman, Вы писали:
O>Здравствуйте, vega5, Вы писали:
V>>Пытаюсь из сервиса запустить explorer.exe, которого перед тем, принудительно завершаю! V>>Непосредственно через CreateProcessAsUser вроди не удалось запустить, по этому потом пробовал запустить через *.bat в котором написано: /C explorer.exe V>>Так уже запускается, но как то странно, многие иконки на рабочем столе не появляются, и обычно выдаётся сообщение в котором на некий idlist сыляется.
O>Возможно, проблема в том, что запущенный explorer.exe имеет неправильные переменные окружения. O>Поэтому за ярлыками на рабочий стол лезет не в C:\User\name, а в C:\Windows\system32\config\systemprofile. O>Если вместо explorer.exe запустить cmd.exe и вбить в нее команду "echo %USERPROFILE%", ее вывод должен O>быть в точности таким, как если бы cmd.exe был запущен обычно, пользователем через меню "Пуск".
Да, впольне возможно, я тоже чтото подобное подозревал, и оно в польне логично звучит.
Только вот всеравно не понимаю, как заставить explorer.exe загружать конкретный user профиль ?
Здравствуйте, vega5, Вы писали:
V>Только вот всеравно не понимаю, как заставить explorer.exe загружать конкретный user профиль ?
Загружать не нужно, профиль уже и так загружен.
А нужно вызвать CreateEnvironmentBlock и передать полученный указатель
аргументом lpEnvironment функции CreateProcessAsUser.
Здравствуйте, okman, Вы писали:
O>Здравствуйте, vega5, Вы писали:
V>>Только вот всеравно не понимаю, как заставить explorer.exe загружать конкретный user профиль ?
O>Загружать не нужно, профиль уже и так загружен. O>А нужно вызвать CreateEnvironmentBlock и передать полученный указатель O>аргументом lpEnvironment функции CreateProcessAsUser.
Спасибо..., с окружением всё стало на месте, появились все иконки!!!
Однако запуск explorer-а работает как то нестабильно, то запускается нормально, то вообще нет.
Собственно не понимаю почему не работает этот код:
Здравствуйте, vega5, Вы писали:
V>Собственно не понимаю почему не работает этот код: V>...
Если код не работает, одна из функций должна вернуть ошибку.
Ну а там нужно смотреть GetLastError и разбираться.
Короче, сделайте нормальную обработку ошибок и будете знать причину и место их возникновения.
Здравствуйте, okman, Вы писали:
O>Здравствуйте, vega5, Вы писали:
V>>Собственно не понимаю почему не работает этот код: V>>...
O>Если код не работает, одна из функций должна вернуть ошибку. O>Ну а там нужно смотреть GetLastError и разбираться. O>Короче, сделайте нормальную обработку ошибок и будете знать причину и место их возникновения.
Сделал обработку ошибок, вот что получается на Win8:
Тут ошибка и на DuplicateTokenEx — ERROR_IO_PENDING, но предпологаю это здесь не причём, с другими программаи тоже самое, и они запускаются без проблем.
На CreateProcessAsUser тоже ошибка — ERROR_INVALID_OWNER. Это ошибка возвращается и с другими программаи, которые нормально запускаются.
Понятие не имею, в чём разница и проблема... Почему с Explorer-ом такая проблема ?
И где тут ошибки ?
Если CreateProcessAsUser вернула ненулевое значение, значит, она завершилась успешно.
В этом случае GetLastError смотреть бессмысленно, его состояние не определено.
И это справедливо почти для всех WinAPI-шных функций (за некоторыми исключениями
вроде AdjustTokenPrivileges, где даже в случае успеха требуется звать GLE).
V>Понятие не имею, в чём разница и проблема... Почему с Explorer-ом такая проблема ?
Судя по всему, explorer.exe таки запускается, а вот уже после что-то идет не так.
Кроме environment variables, можно еще поэкспериментировать с current directory,
хотя сомневаюсь, что это поможет. Надо под отладчиком запускать и смотреть,
почему explorer.exe не хочет нормально функционировать.
Здравствуйте, okman, Вы писали:
O>Здравствуйте, vega5.
O>И где тут ошибки ? O>Если CreateProcessAsUser вернула ненулевое значение, значит, она завершилась успешно. O>В этом случае GetLastError смотреть бессмысленно, его состояние не определено. O>И это справедливо почти для всех WinAPI-шных функций (за некоторыми исключениями O>вроде AdjustTokenPrivileges, где даже в случае успеха требуется звать GLE).
V>>Понятие не имею, в чём разница и проблема... Почему с Explorer-ом такая проблема ?
O>Судя по всему, explorer.exe таки запускается, а вот уже после что-то идет не так. O>Кроме environment variables, можно еще поэкспериментировать с current directory, O>хотя сомневаюсь, что это поможет. Надо под отладчиком запускать и смотреть, O>почему explorer.exe не хочет нормально функционировать.
Ну да, вроди функция говорит что успешно выполнилось...но я уже на всяких случии смотрел и GetLastError, в не понимании причин...
Кстати...приглядывая Process Explorer-ом за момента запуска, как будто действительно на миг появилось сам процесс explorer, и тут же исчезает...
К сожалении я не експерт работать с отладчиками, тем более в сервисе всё это происходит, с системным аккунтом. Я так понимаю тут вовсе не так просто отлаживать...а смотреть из юзермодной программе смысла нет, ведь оттуда всё работает, как и с другими запускаемыми программами тоже.
Гдето читал, что ansi версия CreateProcessAsUser немного устаревшая, и глючит иногда...., может в проблема ? На всякий случии начал переписать программу польностю на unicode версию...а вдруг?!
Здравствуйте, vega5, Вы писали:
V>Кстати...приглядывая Process Explorer-ом за момента запуска, как будто действительно на миг появилось сам процесс explorer, и тут же исчезает... V>К сожалении я не експерт работать с отладчиками, тем более в сервисе всё это происходит, с системным аккунтом. V>Я так понимаю тут вовсе не так просто отлаживать...
Можно попробовать запустить explorer.exe с флагом CREATE_SUSPENDED, а потом прицепиться отладчиком.
Можно kernel debugger подключить и отлаживаться на виртуалке.
Можно в Image Execution Options прописать автоматическое подключение отладчика при запуске explorer.exe.
В общем, варианты есть, вплоть до использования CreateProcessAsUser + DEBUG_ONLY_THIS_PROCESS и WaitForDebugEvents.