2009-10-12 2 views
3

Мне пришлось вникать в это, потому что код, который отлично работал в Windows 2003/XP, не работает в Windows 7. Приложение, запущенное с помощью CreateProcessAsUser, с ошибкой 0xc0000142. Разница между моим старым кодом и одним из MSDN в Starting an Interactive Client Process in C++ заключается в том, что я не установил привилегии и Window Station и рабочий стол. Я обновил свой код в соответствии с примером, но мне очень хотелось бы понять, какое изменение в новых Windows привело к тому, что выполняемые процессы в интерактивной Window-станции требовали?Почему для CreateProcessAsUser требуется интерактивная оконная станция в Vista/Windows 7?

+0

Вы можете поделиться своим опытом? – menjaraz

+0

Проблема остается. Я также ищу решение. Изоляция сеанса 0 - это название игры. Любой процесс, выполняющийся в сеансе 0, не может создавать экземпляры GUI. Интерактивный клиент запускается, но GUI не отображается! –

+0

Как я уже сказал в сообщении, я просто изменил свой код в соответствии с примером MSDN. Генри, обратите внимание, что мой процесс был командной строкой, без терминала. Поэтому мне все еще интересно, зачем мне нужен интерактивный сеанс для его запуска. –

ответ

0

По крайней мере, часть требований вытекает из изменения для запуска интерактивных процессов в другом сеансе из служб. Это было сделано для того, чтобы приложения не могли запускать атаки типа «разбить» на привилегированные службы. Дополнительная информация доступна here.

+0

Да, я наткнулся на это, исследуя проблему. Однако это не совсем уместно. В сценарии, когда _ordinary_ исполняемый файл запускает другой процесс с использованием CreateProcessAsUser, в Windows 7 и Windows 2003/XP происходит что-то другое, потому что при запуске XP процесс успешно завершается с ошибкой 0xc0000142 на более новой ОС. По-видимому, процесс не переходит к интерактивному сеансу, потому что, если я сделаю это, в соответствии с примером MSDN, он начнет нормально. Мне интересно узнать, что на самом деле происходит и что изменилось с XP. –