2014-01-22 71 views
1

我正在使用以下函数来启动特定的exe。在进入下一组代码之前,我需要等待这个过程完成。我如何等待过程完成?如何等待CreateProcessAsUser在C#中完成

[DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUser", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] 
extern static Boolean CreateProcessAsUser(IntPtr hToken, String lpApplicationName, String lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes, 
     ref SECURITY_ATTRIBUTES lpThreadAttributes, Boolean bInheritHandle, Int32 dwCreationFlags, IntPtr lpEnvironment, 
     String lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation); 

回答

2

PROCESS_INFORMATION您从该方法返回的结构还包含创建的进程的句柄及其ID。所以,你可以举例来说做到这一点:

Process.GetProcessById(procInfo.dwProcessId).WaitForExit() 

但是,请注意,如果这个过程中你得到这个调用之前终止,也可能是远程可能你会得到一个不同的进程来代替。因此,这将是更好的做一些验证,以防万一:

var process = Process.GetProcessById(procInfo.dwProcessId); 

if (process.Handle == procInfo.hProcess) 
    process.WaitForExit(); 

// The process has definitely exited by now 

不过,你不必使用CreateProcessAsUser可言。您可以使用允许指定用户名和密码的Process.Start重载 - 这应该是在C#中的不同用户下启动进程的首选方式。您也可以使用ProcessStartInfo指定用户名和密码。