Как запустить bat-файл с необходимыми разрешениями в C # - PullRequest
4 голосов
/ 21 января 2012

У меня есть bat-файл, который копирует файлы из одного места в другое.

SET SRC=%1
SET DEST=%2

xcopy /Y/I %SRC%\*.txt %DEST%\temp
echo Done!

Я пытаюсь запустить этот файл с помощью программы на C #

var psi = new ProcessStartInfo(fileToRun);
psi.Arguments = args;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.UseShellExecute = false;
psi.CreateNoWindow = true;

Process cmdProc = Process.Start(psi); 

StreamReader output = cmdProc.StandardOutput;
StreamReader errors = cmdProc.StandardError;
cmdProc.WaitForExit();

Bat-файл выполнен, я вижу сообщение 'Done!' , но файлы не копируются.

Единственный способ, которым это работает, это

psi.UseShellExecute = true;

psi.RedirectStandardOutput = false;
psi.RedirectStandardError = false;

Но в этом случае мне нужно отключить перенаправление вывода / ошибки, и они мне нужны. Так что это не работает для меня.

Я попытался установить имя пользователя / пароль администратора

psi.UserName = username;
psi.Password = password; 

Вход в систему успешен, но я получаю «Недопустимый дескриптор» в поток StandardError.

Полагаю, процесс, который я пытаюсь запустить, не имеет прав на копирование файлов и Я не знаю, как предоставить ему эти разрешения.

Пожалуйста, помогите!

EDITED

Спасибо за ответы! Я потратил несколько часов, пытаясь решить эту проблему, и, как всегда, я опубликовал свой вопрос и нашел решение :))

Чтобы не получить сообщение «Неверный дескриптор», вам нужно

psi.RedirectStandardInput = true;

Но теперь я вижу окно cmd.exe, если задано имя пользователя, что плохо.

1 Ответ

1 голос
/ 08 марта 2014

вам не хватает

psi.Domain = "domain";
psi.Verb ="runas";
//if you are using local user account then you need supply your machine name for domain

попробуйте этот простой фрагмент, который будет работать для вас

void Main()
{
    string batchFilePathName =@"drive:\folder\filename.bat";
    ProcessStartInfo psi = new ProcessStartInfo(batchFilePathName);

    psi.Arguments = "arg1 arg2";//if any
    psi.WindowStyle = ProcessWindowStyle.Hidden;
    psi.UseShellExecute = false;
    psi.Verb ="runas";
    psi.UserName = "UserName"; //domain\username
    psi.Domain = "domain"; //domain\username
    //if you are using local user account then you need supply your machine name for domain

    psi.WindowStyle = ProcessWindowStyle.Hidden;
    psi.UseShellExecute = false;
    psi.Verb ="runas";

    Process ps = new Process(psi);
    Process.Start(ps);  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...