2015-06-30 3 views
1

Мне нужно создать процесс, который нужно вызвать UAC. Я прочитал этот пост: How can I run a child process that requires elevation and wait?.Как запустить процесс с помощью ShellExecuteEx как дочернего, который закрывается после выхода из родителя?

К сожалению, я не могу запустить процесс как real ребенок. Новый процесс запускается как отдельный и продолжает работать даже после закрытия spawner. Но мне нужно, чтобы он автоматически закрывался, когда родительский выход (нормальный выход или сбой или любая другая причина).

Одним из решений, которые были предоставлены, является использование рабочих мест для этого. К сожалению, я не могу назначить процесс, созданный с заданием ShellExecuteEx. Он возвращает мне ошибку ERROR_ACCESS_DENIED. Чтобы справиться с этим, я должен пройти CREATE_BREAKAWAY_FROM_JOB до CreateProcess. И это замкнутый круг. Я должен использовать ShellExecuteEx, но не CreateProcess.

+3

Ядро Windows не приписывает какой-либо конкретный смысл * дочернему процессу *, за исключением наследования дескриптора. В частности, нет никакой зависимости от времени жизни процесса (если явно не реализовано). – IInspectable

+0

Windows действительно не заботится о взаимоотношениях между родителями и дочерними процессами между процессами. Процессы независимы друг от друга. Да, возможно * узнать, какой процесс породил другой процесс (Windows отслеживает эту информацию за кулисами), но это не очень полезная информация для кода пользователя в средах Windows. Что именно вы пытаетесь решить путем «запуска процесса как ребенка»? Просто создайте новый процесс и сделайте с ним.Вопрос MK, связанный с вами, указывает вам, как связывать процессы вместе, если вы должны их убить вместе - поместите их в один и тот же объект Job вместе. –

+0

Если вы не хотите, чтобы родительский процесс ждал «ребенка», не делайте этого. Ожидание запуска процесса для выхода не является состоянием по умолчанию. –

ответ

2

У вас есть командный глагол runas, чтобы повысить высоту. Что исключает CreateProcess. Таким образом, вы можете сделать следующее:

  1. Используйте ShellExecuteEx для создания дочернего процесса.
  2. Упорядочить по ShellExecuteEx, чтобы вернуть дескриптор процесса для ребенка.
  3. Когда родитель завершает работу, завершите его.

Если вы хотите использовать задания для связывания процессов, то вам нужно включить опцию манифеста requiresAdministrator. Таким образом, вы можете использовать CreateProcess и указать флаги создания процесса по своему усмотрению.

Теперь, возможно, вы не захотите, чтобы процесс ребенка проявился таким образом. Если это так, вы все равно можете выполнить задание с вызовом CreateProcess. Вам необходимо три процесса:

  • Родительский процесс, работает как стандартный пользователь.
  • Пусковой процесс, проявляющийся как повышенный. Создан родителем, с соответствующими флагами работы и передан аргументы, указывающие, как запустить дочерний элемент. Что он делает с CreateProcess и помещается в ту же работу.
  • Ребенка процесса. Не проявляется быть повышенным. Но поскольку он запускается при помощи стартовой пусковой установки, он тоже повышен.

Дело в том, что существует два способа повышения высоты. Статически во время компиляции с манифестом. Это позволяет использовать CreateProcess. Или динамически с помощью глагола оболочки runas. Это заставляет ShellExecuteEx. Вы заявляете, что вас подталкивают до CreateProcess, и это означает, что использование манифеста для принудительного повышения.

+0

Спасибо. Просто, чтобы прояснить вторую часть - с 3 процессами - процесс запуска является промежуточным и не должен быть помещен в работу. Но мне нужно создать задание в родительском процессе, передать его в процесс запуска, и пусковая установка поместит дочерний процесс в эту работу после нереста, не так ли? – nikitablack

+0

Вы могли бы сделать так. Или вы можете иметь все три процесса в работе. Я не уверен, что это так важно. Я не вижу недостатка в том, чтобы все они были на одной и той же работе. –

+1

Ну, если родитель - нормальный процесс, а ребенок повышен, то его размещение в задании всегда терпит неудачу. – nikitablack

 Смежные вопросы

  • Нет связанных вопросов^_^