Логические шаги рабочего процесса от CreateProcessAsUser до ImpersonateLoggedOnUser и DuplicateHandle - все для запуска команды от имени пользователя?

Приходящий из

Windows C # Есть ли способ создать новый процесс с билетом Kerberos родительского процесса?

поддержка ограниченного делегирования Kerberos с использованием SSPI для многопроцессорности

Я пытаюсь скопировать учетные данные Kerberos из одного процесса в другой, чтобы вызвать удаленную команду. Стив мне очень помог, но я немного запутался в том, как создать дочерний процесс, загрузить его с соответствующими учетными данными и олицетворением, а затем получить тот же дочерний процесс для выполнения фактической команды с момента вызова to DuplicateHandles требует, чтобы дочерний процесс существовал первым.

У меня вопрос: как заставить дочерний процесс выполнить команду, которую я изначально предназначал для него, как CreateProcessAsUser с олицетворением?

Код на данный момент:

var CurrentIdentity = ((WindowsIdentity)User.Identity).Token;

IntPtr parentHandle = IntPtr.Zero;

CloneParentProcessToken.QuerySecurityContextToken(ref CurrentIdentity, out parentHandle);
IntPtr parentProcessHandle = Process.GetCurrentProcess().Handle;

currentUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

//Create Child Process as User
IntPtr childProcessHandle = CreateProcessAsUser();

IntPtr lpTargetHandle = IntPtr.Zero;

//Duplicate parent security handle into child
if (CloneParentProcessToken.DuplicateHandle(parentProcessHandle, parentHandle, childProcessHandle, out lpTargetHandle,
    ProcessUtility.TOKEN_IMPERSONATE, true, (uint)0x00000002))
{
    int childHandleProcessID = CloneParentProcessToken.GetProcessId(lpTargetHandle);

    IntPtr newChildProcess = ProcessUtility.OpenProcess(ProcessUtility.ProcessAccessFlags.All, true, childHandleProcessID);
    IntPtr newProcessAccessTokenHandle = IntPtr.Zero;
    if (ProcessUtility.OpenProcessToken(newChildProcess, ProcessUtility.TOKEN_IMPERSONATE, out newProcessAccessTokenHandle))
    {
        //Impersonate the user in the new child process
        if (CloneParentProcessToken.ImpersonateLoggedOnUser(newProcessAccessTokenHandle))
        {
            //newChildProcess is pointer to child process with token and impersonation
            Process child = Process.GetProcessById(childHandleProcessID);

            //Have child process execute???
        }
    }

person jangooni    schedule 08.08.2019    source источник


Ответы (1)


поскольку вызов DuplicateHandles требует, чтобы дочерний процесс существовал первым.

Вы можете установить hTargetProcessHandle как текущий процесс, а bInheritHandle как истину, чтобы дублирующийся дескриптор мог быть унаследован новыми процессами, созданными целевым процессом. Затем передайте новый токен дочернему процессу через IPC.

person Drake Wu    schedule 09.08.2019
comment
Спасибо @Drake Wu - MSFT. Вы знаете, как я могу получить phContext, необходимый для QuerySecurityTokenCkntext, из WindowsIdentity? - person jangooni; 13.08.2019