2015-06-30 193 views
1

我需要產生一個需要調用UAC的進程。我看過這篇文章:How can I run a child process that requires elevation and wait?如何使用ShellExecuteEx作爲父級退出後關閉的子級運行進程?

不幸的是我不能運行一個進程real孩子。新過程作爲單獨運行並且在產卵器關閉後繼續運行。但是當父母退出時(正常退出或崩潰或其他原因),我需要它自動關閉。

提供的解決方案之一是使用作業。不幸的是,我不能將一個用ShellExecuteEx創建的進程分配給一份工作。它返回給我一個錯誤ERROR_ACCESS_DENIED。爲了解決這個問題,我必須通過CREATE_BREAKAWAY_FROM_JOBCreateProcess。這是封閉的圈子。我必須使用ShellExecuteEx而不是CreateProcess

+3

Windows內核不會將任何特定的含義賦予*子進程*,但不包括句柄繼承。特別是在過程壽命方面沒有關係(除非明確實施)。 – IInspectable

+0

Windows並不關心進程之間的父/子關係。進程是彼此獨立的。是的,它可以*知道哪個進程產生了另一個進程(Windows會在後臺跟蹤該信息),但它對於Windows環境中的用戶代碼並不是真正有用的信息。作爲一個孩子運行一個流程,你究竟想要解決什麼問題?只是產生一個新的過程,並完成它。MK鏈接的問題告訴你如何將過程鏈接在一起,如果你必須能夠一起殺死它們 - 將它們放在同一個Job對象中。 –

+0

如果您不希望父進程等待「孩子」,請不要。等待啓動的進程退出不是默認狀態。 –

回答

2

您可以使用shell動詞runas強制擡高。其中排除CreateProcess。因此,您可以執行以下操作:

  1. 使用ShellExecuteEx來創建子進程。
  2. 安排ShellExecuteEx爲孩子返回一個進程句柄。
  3. 父母終止時,終止子女。

如果您想使用作業將流程生命結合在一起,那麼您需要包含兒童的requiresAdministrator清單選項。這樣,您可以使用CreateProcess並根據需要指定進程創建標誌。

現在,你可能不希望孩子的過程表現出這種方式。如果是這樣,那麼你仍然可以通過致電CreateProcess完成工作。您需要三個進程:

  • 父進程,以標準用戶身份運行。
  • 啓動過程中,表現爲升高。由父級創建,具有適當的作業標誌,並傳遞指定如何啓動子級的參數。它與CreateProcess並且放置在相同的工作。
  • 子進程。沒有表現出升高。但是因爲它是由高架發射器發射的,所以它也升高了。

這裏的要點是有兩種方法來強制擡高。靜態地在編譯時使用清單。這可以讓你使用CreateProcess。或動態使用runas shell動詞。這迫使ShellExecuteEx。你聲明你被推到CreateProcess,所以這意味着使用清單強制擡高。

+0

謝謝。只是爲了澄清第二部分 - 有三個過程 - 啓動過程是中間過程,不應該放在工作中。但我必須在父進程中創建一個工作,將其傳遞給啓動進程,啓動程序會在產卵後將子進程放入此工作中,對嗎? – nikitablack

+0

你可以這樣做。或者你可以在工作中擁有全部三個流程。我不確定這很重要。我不認爲讓他們都在同一份工作中有任何不利之處。 –

+1

那麼,如果父母是正常的過程,並且孩子升高,那麼將其置於工作中總是失敗。 – nikitablack

相關問題