.NET 4: Process.Start с использованием учетных данных возвращает пустой вывод - PullRequest
6 голосов
/ 11 мая 2010

Я запускаю внешнюю программу из 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());

Все отлично работает с этим кодом: внешняя программа выполняется и process.StandardOutput.ReadToEnd () возвращает правильный вывод.

Но после того, как я добавлю эти две строки перед process.Start () (чтобы запустить программу в контексте другой учетной записи пользователя):

startInfo.UserName = userName;
startInfo.Password = securePassword;

Программа не выполняется и process.StandardOutput.ReadToEnd () возвращает пустую строку. Нет исключений.

userName и 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, время запуска приложения 0x01caf1b91.

cryptcp.exe - это имя внешнего приложения.

Ответы [ 4 ]

3 голосов
/ 10 января 2012

Я понимаю, что это было задано некоторое время назад, но я столкнулся с той же проблемой и нашел решение на этом сайте: Опасности и недостатки запуска процесса с новыми полномочиями

Применение решения в разделе Приложение не удалось правильно инициализировать исправило его для меня.

Надеюсь, это сэкономит другим время и разочарование!

2 голосов
/ 13 мая 2010

Согласно 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());
1 голос
/ 13 мая 2010

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

1 голос
/ 11 мая 2010

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

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

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

...