Я запускаю внешнюю программу из ASP.NET:
var process = new Process();
var startInfo = process.StartInfo;
startInfo.FileName = filePath;
startInfo.Arguments = arguments;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
//startInfo.RedirectStandardError = true;
process.Start();
process.WaitForExit();
Console.Write("Output: {0}", process.StandardOutput.ReadToEnd());
//Console.Write("Error Output: {0}", process.StandardError.ReadToEnd());
Все хорошо работает с этим кодом: внешняя программа выполнена, и обработать. StandardOutput. ReadToEnd () возвращает корректный вывод.
Но после того, как я добавляю эти две строки перед процессом. Запустите () (для запущения программы в контексте другой учетной записи пользователя):
startInfo.UserName = userName;
startInfo.Password = securePassword;
Программа не выполнена, и обработать. StandardOutput. ReadToEnd () возвращает пустую строку. Никакие исключения не выдаются.
имя пользователя и securePassword корректны (в случае неправильных учетных данных, исключение выдается).
Как запустить программу в контексте другой учетной записи пользователя?
Среда:.NET 4, Windows Server 2008 32bit
UPD:
Приложение хорошо работает под сервером разработки ASP.NET + Windows 7, но перестало работать на IIS 7 + Windows Server 2008 Web Edition.
UPD2:
Найденный этим в конечном счете зарегистрируйтесь:
Дающее сбой приложение cryptcp.exe, версия 3.33.0.0, метка времени 0x4be18460, дающий сбой модуль kernel32.dll, версия 6.0.6002.18005, метка времени 0x49e03821, код исключения 0xc0000142, отказ сместил 0x00009eed, обрабатывает идентификатор 0xbf4, время начала приложения 0x01caf1b91f5b851a.
cryptcp.exe является названием внешнего приложения.
Согласно Microsoft , вы не можете читать стандартный вывод И стандартные ошибки, подобные этой, поскольку это приводит к взаимоблокировке. Чтобы решить эту проблему, используйте что-то вроде следующего:
private readonly StringBuilder outputText = new StringBuilder();
private readonly StringBuilder errorText = new StringBuilder();
. . .
process.OutputDataReceived += delegate(
object sendingProcess,
DataReceivedEventArgs outLine)
{
if (!string.IsNullOrEmpty(outLine.Data))
{
outputText.AppendLine(outLine.Data);
}
};
process.ErrorDataReceived += delegate(
object sendingProcess,
DataReceivedEventArgs errorLine)
{
if (!string.IsNullOrEmpty(errorLine.Data))
{
errorText.AppendLine(errorLine.Data);
}
};
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
Console.WriteLine(errorText.ToString());
Console.WriteLine(outputText.ToString());
Глядя на документацию MSDN, есть несколько других элементов, которые рекомендуется настроить для правильного запуска приложения от имени другого пользователя.
Это может помочь вам решить эту проблему.
Возможно, для запускаемого вами приложения требуется загруженный профиль (по умолчанию этого не происходит). Вы пробовали установить для свойства LoadUserProfile значение true?