Приходящий из
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???
}
}