Для информации, вы установили для fMask значение SEE_MASK_NOCLOSEPROCESS
, чтобы hProcess действовал?
Кроме того, почему вы используете P / Invoke в ShellExecuteEx, почему бы не использовать Process.Start с ProcessStartInfo, который будет обрабатывать ShellExecuteEx для вас?
РЕДАКТИРОВАТЬ: Так как вы выполняете runas, вы получаете только доступ SYNCHRONIZE для дескриптора, но не PROCESS_QUERY_INFORMATION
доступ, следовательно, GetExitCodeProcess завершается ошибкой, в результате чего hasEnded вызывает исключение Win32.
В качестве обходного пути вы можете P / Invoke WaitForSingleObject с таймаутом, равным нулю, проверить, завершился ли процесс.