.NET 4: Процесс. Начните использовать пустой вывод возвратов учетных данных

Я запускаю внешнюю программу из 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 является названием внешнего приложения.

6
задан alexey 13 May 2010 в 12:00
поделиться

3 ответа

Согласно 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());
2
ответ дан 17 December 2019 в 00:05
поделиться

Глядя на документацию MSDN, есть несколько других элементов, которые рекомендуется настроить для правильного запуска приложения от имени другого пользователя.

  1. Задайте свойства домена, имени пользователя и пароля (Вы должны установить домен)
  2. Установите рабочий каталог, так как по умолчанию с именем пользователя / паролем это папка system32

Это может помочь вам решить эту проблему.

1
ответ дан 17 December 2019 в 00:05
поделиться

Возможно, для запускаемого вами приложения требуется загруженный профиль (по умолчанию этого не происходит). Вы пробовали установить для свойства LoadUserProfile значение true?

1
ответ дан 17 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: