Запуск explorer.exe
От: vega5  
Дата: 12.10.14 00:04
Оценка:
Здравствуйте!

Пытаюсь из сервиса запустить explorer.exe, которого перед тем, принудительно завершаю!
Непосредственно через CreateProcessAsUser вроди не удалось запустить, по этому потом пробовал запустить через *.bat в котором написано: /C explorer.exe
Так уже запускается, но как то странно, многие иконки на рабочем столе не появляются, и обычно выдаётся сообщение в котором на некий idlist сыляется.
Точно так же запускается, если вместо bat-ник я запускаю специально для этого написанную маленькую программу *.exe, в котором просто запускаю через ShellExecute explorer-а.

Не понимаю в чём проблема..., все эти способы вызываются же в узер моде, я это проверил через ProcExplorer-ом. И каждый из них работает в отдельности, то есть ежли в ручную их запускаю, и потом завершаю explorer, то из них правильно запускаются explorer, но когда из сервиса, то только так как описывал выше.
В чём может быть проблема ?
Re: Запуск explorer.exe
От: okman Беларусь https://searchinform.ru/
Дата: 12.10.14 06:45
Оценка:
Здравствуйте, 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 был запущен обычно, пользователем через меню "Пуск".
Re[2]: Запуск explorer.exe
От: vega5  
Дата: 13.10.14 01:22
Оценка:
Здравствуйте, 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 профиль ?
Re[3]: Запуск explorer.exe
От: okman Беларусь https://searchinform.ru/
Дата: 13.10.14 06:06
Оценка: 2 (1)
Здравствуйте, vega5, Вы писали:

V>Только вот всеравно не понимаю, как заставить explorer.exe загружать конкретный user профиль ?


Загружать не нужно, профиль уже и так загружен.
А нужно вызвать CreateEnvironmentBlock и передать полученный указатель
аргументом lpEnvironment функции CreateProcessAsUser.
Re[4]: Запуск explorer.exe
От: vega5  
Дата: 13.10.14 16:27
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, vega5, Вы писали:


V>>Только вот всеравно не понимаю, как заставить explorer.exe загружать конкретный user профиль ?


O>Загружать не нужно, профиль уже и так загружен.

O>А нужно вызвать CreateEnvironmentBlock и передать полученный указатель
O>аргументом lpEnvironment функции CreateProcessAsUser.

Спасибо..., с окружением всё стало на месте, появились все иконки!!!

Однако запуск explorer-а работает как то нестабильно, то запускается нормально, то вообще нет.

Собственно не понимаю почему не работает этот код:
    PROCESS_INFORMATION pi; 
    STARTUPINFO si;
    HANDLE Token,hUserToken;
    LPVOID Env;
    DWORD ret;
    WTSQueryUserToken(WTSGetActiveConsoleSessionId(),&Token);
    DuplicateTokenEx(Token, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hUserToken);
    CreateEnvironmentBlock(&Env, hUserToken, FALSE);
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    si.lpDesktop = "winsta0\\default";
    ZeroMemory(&pi, sizeof(pi));
    ret=CreateProcessAsUser(hUserToken,NULL,file,NULL,NULL,FALSE,CREATE_UNICODE_ENVIRONMENT,Env,NULL,&si,&pi);
    DestroyEnvironmentBlock(Env);
    CloseHandle(Token);
    CloseHandle(hUserToken);


Другие программы нормально запускаются этим кодом, только вот explorer не хочет....
Указатель file сыляется на имя файла explorer-а с польным путем.
Re[5]: Запуск explorer.exe
От: okman Беларусь https://searchinform.ru/
Дата: 13.10.14 18:17
Оценка: +1
Здравствуйте, vega5, Вы писали:

V>Собственно не понимаю почему не работает этот код:

V>...

Если код не работает, одна из функций должна вернуть ошибку.
Ну а там нужно смотреть GetLastError и разбираться.
Короче, сделайте нормальную обработку ошибок и будете знать причину и место их возникновения.
Re[6]: Запуск explorer.exe
От: vega5  
Дата: 14.10.14 08:51
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, vega5, Вы писали:


V>>Собственно не понимаю почему не работает этот код:

V>>...

O>Если код не работает, одна из функций должна вернуть ошибку.

O>Ну а там нужно смотреть GetLastError и разбираться.
O>Короче, сделайте нормальную обработку ошибок и будете знать причину и место их возникновения.

Сделал обработку ошибок, вот что получается на Win8:

DuplicateTokenEx ret=1
GetLastError=0
Token=844
hUserToken ret=820
CreateEnvironmentBlock ret=1
GetLastError=0
CreateProcessAsUser ret=1
GetLastError=203

То есть ошибка только на CreateProcessAsUser — ERROR_ENVVAR_NOT_FOUND. Странно, потомучто CreateEnvironmentBlock без ошибок выпольняется.


Под XP:

DuplicateTokenEx ret=1
GetLastError=997
Token=768
hUserToken ret=340
CreateEnvironmentBlock ret=1
GetLastError=0
CreateProcessAsUser ret=1
GetLastError=1307

Тут ошибка и на DuplicateTokenEx — ERROR_IO_PENDING, но предпологаю это здесь не причём, с другими программаи тоже самое, и они запускаются без проблем.
На CreateProcessAsUser тоже ошибка — ERROR_INVALID_OWNER. Это ошибка возвращается и с другими программаи, которые нормально запускаются.

Понятие не имею, в чём разница и проблема... Почему с Explorer-ом такая проблема ?
Re[7]: Запуск explorer.exe
От: okman Беларусь https://searchinform.ru/
Дата: 14.10.14 10:47
Оценка:
Здравствуйте, vega5.

И где тут ошибки ?
Если CreateProcessAsUser вернула ненулевое значение, значит, она завершилась успешно.
В этом случае GetLastError смотреть бессмысленно, его состояние не определено.
И это справедливо почти для всех WinAPI-шных функций (за некоторыми исключениями
вроде AdjustTokenPrivileges, где даже в случае успеха требуется звать GLE).

V>Понятие не имею, в чём разница и проблема... Почему с Explorer-ом такая проблема ?


Судя по всему, explorer.exe таки запускается, а вот уже после что-то идет не так.
Кроме environment variables, можно еще поэкспериментировать с current directory,
хотя сомневаюсь, что это поможет. Надо под отладчиком запускать и смотреть,
почему explorer.exe не хочет нормально функционировать.
Re[8]: Запуск explorer.exe
От: vega5  
Дата: 14.10.14 11:23
Оценка:
Здравствуйте, 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 версию...а вдруг?!
Re[9]: Запуск explorer.exe
От: okman Беларусь https://searchinform.ru/
Дата: 14.10.14 15:01
Оценка:
Здравствуйте, vega5, Вы писали:

V>Кстати...приглядывая Process Explorer-ом за момента запуска, как будто действительно на миг появилось сам процесс explorer, и тут же исчезает...

V>К сожалении я не експерт работать с отладчиками, тем более в сервисе всё это происходит, с системным аккунтом.
V>Я так понимаю тут вовсе не так просто отлаживать...

Можно попробовать запустить explorer.exe с флагом CREATE_SUSPENDED, а потом прицепиться отладчиком.
Можно kernel debugger подключить и отлаживаться на виртуалке.
Можно в Image Execution Options прописать автоматическое подключение отладчика при запуске explorer.exe.
В общем, варианты есть, вплоть до использования CreateProcessAsUser + DEBUG_ONLY_THIS_PROCESS и WaitForDebugEvents.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.