System.Diagnostics.Process не принимает учетные данные - PullRequest
1 голос
/ 02 ноября 2011

Я пытаюсь выполнить командный файл, используя класс Process.Этот код находится в середине большей части кода, где я использую LogonUser () и WindowsIdentity.Impersonate () для олицетворения локальной учетной записи администратора ПК.

Я пытался запустить пакетный файл в рамках процесса, не добавляя учетные данные в ProcessStartInfo, но при этом способе пакетный файл завершился сбоем без ошибок - никаких ошибок не возникало, и ожидаемый вывод из пакетного файла никогдабыл возвращен (я читаю stderr и stdout асинхронно, fwiw).

Затем я добавил учетные данные в ProcessStartInfo, но теперь я получаю ошибку «Доступ запрещен», если я сначала не вызываю WindowsImpersonationContext.Undo ()и ошибка «Ошибка входа в систему: неизвестное имя пользователя или неправильный пароль», если я вызываю .Undo () перед Process.Start ().Я трижды проверил правильность имени пользователя / пароля / домена для нескольких учетных записей.

Если в моем коде нет вызовов LogonUser () или WindowsIdentity.Impersonate () (и учетных данных в ProcessStartInfo нет), то яУ меня нет проблем с выполнением командного файла и выводом из захваченного командного файла.

Я могу успешно запустить командный файл с рабочего стола как локального администратора или как произвольная локальная учетная запись пользователя.Я вижу, что его разрешения показывают, что он должен быть читаемым / исполняемым из учетных записей, которые я пытаюсь запустить.Это действительно довольно глупо;любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2012

Проблема была в том, что мне нужно было перенаправить все 3 потока; Я только перенаправил 2 (нет, ошибаюсь, не в). Это в основном исправлено.

0 голосов
/ 23 февраля 2012

Вы ищете что-то подобное?

Process proc = new Process();
proc.StartInfo.FileName = @"C:\WINNT\notepad.exe";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;

proc.StartInfo.Domain = "mydomain.com"; // Domain of IIS Computer
proc.StartInfo.UserName = "kaung"; //Administrator for that computer
System.Security.SecureString password = new System.Security.SecureString();
password.AppendChar('m'); //Password
password.AppendChar('y');
password.AppendChar('p');
password.AppendChar('a');
password.AppendChar('s');
password.AppendChar('s');
password.AppendChar('w');
password.AppendChar('o');
proc.StartInfo.Password = password;

proc.Start();
...