Winlogon: Как запустить приложение после завершения работы проводника во время выхода из системы? - PullRequest
1 голос
/ 28 октября 2009

Windows XP / VISTA / 7

Как может быть возможно запустить приложение во время процедуры выхода пользователя из системы после завершения explorer.exe?

Цель состоит в том, чтобы заблокировать завершение работы, но с приложением, которое запускается после завершения работы проводника.

Конечно, возможно временно заблокировать выключение в Vista с помощью ShutdownBlockReasonCreate или отменить его в XP через WM_QUERYENDSESSION. Однако оба эти метода происходят во время сеанса пользователя до завершения работы проводника. Вопрос в том, как запустить приложение после завершения работы обозревателя и заблокировать завершение работы.

Это невозможно из службы, потому что в VISTA / 7, если пользователь выбрал Завершение работы / Перезапуск, служба, по-видимому, не может блокировать завершение работы после выхода пользователя из системы. (Кажется, что ядро ​​завершает работу службы, и сама служба не может блокировать завершение работы, как может пользовательское приложение?)

Как и когда именно WinLogon завершает работу explorer.exe? Кажется, что он ждет, пока все / любые другие приложения не будут завершены и не прекратят блокировку, а затем завершит работу проводника?

WinLogon ожидает закрытия explorer.exe, прежде чем окончательно закроет рабочий стол / сеанс?

Я рассмотрел, например, попытку перехватить NTDLL для API, которые завершают процесс и перехватывают завершение проводника, но неясно, как или почему Winlogon будет ждать, а не продолжать отключение.

Цель всего этого - найти способ запуска исполняемого файла во время завершения работы Vista / 7, который может блокировать отключение на сколько угодно, выход из программы AFTER завершился, и все файлы и ресурсы были освобождены проводник и все другие приложения, работающие от имени этого пользователя.

В XP это возможно, просто отменив завершение работы в WM_QUERYENDSESSION, затем повторно выполнив ExitWindowsEx (LOGOFF), а затем выполнив задачи в системном сервисе. Однако он оставляет пользователя на экране входа в систему без индикации прогресса.

Если бы было возможно внедрить процесс после завершения работы проводника, процесс мог бы (по моей теории) отображать пользовательский интерфейс на рабочем столе того же пользователя и эффективно действовать как вторичная пользовательская оболочка во время процедуры выхода из системы.

Считается / подозревается, что Windows выполняет нечто подобное при установке обновлений во время выключения (но это поведение пока не было замечено в Vista)

Таким образом, кажется, что в Vista нет очевидного способа блокировать выключение после закрытия проводника во время выхода пользователя из системы?

...