CreateProcessAsUser из вопросов оболочки службы - PullRequest
0 голосов
/ 01 мая 2019

У меня есть стандартная неинтерактивная служба Windows, установленная на автозапуск (без задержки) при загрузке Windows.Я не использую какой-либо порядок загрузки / настройки группы загрузки и не задаю никаких зависимостей, так что это простой ванильный сервис.Когда Служба запускается, я вызываю CreateProcessAsUser для запуска другого программного приложения.Это приложение просто показывает значок в трее и окно пользовательского интерфейса, ничего больше.Рабочий стол, оконная станция, блок среды и маркер пользователя соответствуют интерактивному пользователю, вошедшему в систему, поэтому для меня это работает правильно при ручном запуске службы (вместо перезагрузки и предоставления этой возможности службы, поскольку она настроена на автоматический запуск).Теперь проблема ...

Значок в трее для создаваемого второго приложения не всегда создается (или отображается), когда служба автоматически запускается Windows.Если я вставлю задержку в несколько секунд (в отдельном потоке), а затем создаю процесс, все работает на 100%.

Это заставляет меня поверить только в одну вещь: код для вызова CreateProcessAsUser простослишком раноИтак, как я могу узнать, когда рабочий стол или командная консоль полностью инициализированы, чтобы избежать этой проблемы?

Токен, блок среды, идентификатор сеанса являются правильными и проверяются перед созданием процесса.Там нет сбоев ни с одним из задействованных Win32 API, так что вы подумаете, если я создаю среду от интерактивного пользователя, оболочка будет готова?Но это не так.Любые способы определить, инициализируется ли Shell из службы?Я даже ждал WTS_SESSION_LOGON, та же проблема

...