Я читал о реализации UAC на MSDN:
http://technet.microsoft.com/en-us/magazine/2007.06.uac.aspx
Случайно натолкнулся на эту интересную строку:
Хотя AIS технически является родителем повышенного процесса, AIS
использует новую поддержку в API CreateProcessAsUser, который устанавливает
ID родительского процесса процесса к тому процессу, который первоначально
запустил его (см. рисунок 13).
Вот страница MSDN для CreateProcessAsUser:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682429(v=vs.85).aspx
BOOL WINAPI CreateProcessAsUser(
_In_opt_ HANDLE hToken,
_In_opt_ LPCTSTR lpApplicationName,
_Inout_opt_ LPTSTR lpCommandLine,
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ BOOL bInheritHandles,
_In_ DWORD dwCreationFlags,
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCTSTR lpCurrentDirectory,
_In_ LPSTARTUPINFO lpStartupInfo,
_Out_ LPPROCESS_INFORMATION lpProcessInformation
);
Exert говорит, что мы можем создать процесс и установить другого родителя, используя параметры в API. Я не уверен, как это сделать? Нужно ли копаться в токене?
Эта функциональность задокументирована в записях MSDN для InitializeProcThreadAttributeList а также UpdateProcThreadAttribute функции.
В частности см. PROC_THREAD_ATTRIBUTE_PARENT_PROCESS
атрибут:
Параметр lpValue — это указатель на дескриптор процесса, который следует использовать вместо вызывающего процесса в качестве родителя для создаваемого процесса. Используемый процесс должен иметь право доступа PROCESS_CREATE_PROCESS.