Как выполнить процесс в C #, который устанавливает драйвер принтера? - PullRequest
0 голосов
/ 28 сентября 2011

Мне нужно запустить исполняемый файл (installPrint.exe) в моем коде C #.Для этого я использовал класс System.Diagnostics.Process.Exe-файл устанавливает драйвер принтера и копирует несколько файлов в разные каталоги.Я могу выполнить EXE из командной строки, и все работает нормально.Но если я выполню файл с классом Process из моего приложения C #, драйвер принтера не будет установлен.

Я запускаю свое приложение C # как пользователь с правами администратора на компьютере с Windows XP SP2 x86.Почему мой исполняемый файл не работает в контексте моего приложения на C #?Какие возможности у меня есть, чтобы заставить его работать?

 ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.Arguments = "-i \"My Printer\" -dir . -port myPort -spooler";
        startInfo.CreateNoWindow = true;
        startInfo.FileName = @"C:\Printer\install.exe";
        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardError = true;
        startInfo.UseShellExecute = false;
        //startInfo.Verb = "runas";
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.WorkingDirectory = @"C:\Printer\";
        session.Log("Working Directory: " + startInfo.WorkingDirectory);

        session.Log("Executing " + startInfo.FileName);
        try
        {
            Process process = new Process();
            //process.EnableRaisingEvents = false;
            process.StartInfo = startInfo;
            process.Start();

            session.Log("installer.exe started");
            StreamReader outReader = process.StandardOutput;
            StreamReader errReader = process.StandardError;
            process.WaitForExit();

            //session.Log(outReader.ReadToEnd());

            //session.Log(errReader.ReadToEnd());

            session.Log("RETURN CODE: " + process.ExitCode);

        }
        catch (Exception ex)
        {
            session.Log("An error occurred during printer installation.");
            session.Log(ex.ToString());
        }

Ответы [ 2 ]

2 голосов
/ 28 сентября 2011

Я так понимаю, вы запускаете свою программу в Windows Vista или 7. Затем вам нужно запросить повышение прав для вашего недавно созданного процесса, чтобы он работал с полными правами доступа.Посмотрите на эти вопросы для деталей: Запросить повышение прав Windows UAC, если путь защищен? Windows 7 и Vista UAC - программно запрашивать повышение прав в C #

Хорошо, я вижуТеперь, когда вы используете Win XP.Тогда это может быть из-за некоторых настроек процесса при запуске.Попробуйте запустить процесс как ShellExecute, таким образом, он будет наиболее близок к нормальному запуску пользователем.Вот образец:

var p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo { FileName = "yourfile.exe", UseShellExecute = true };
p.Start();
0 голосов
/ 28 сентября 2011

Я использую этот класс во многих частях моих проектов:

public class ExecutableLauncher
{
    private string _pathExe;

    public ExecutableLauncher(string pathExe)
    {
        _pathExe = pathExe;
    }
    public bool StartProcessAndWaitEnd(string argoment, bool useShellExecute)
    {
        try
        {
            Process currentProcess = new Process();

            currentProcess.EnableRaisingEvents = false;

            currentProcess.StartInfo.UseShellExecute = useShellExecute;

            currentProcess.StartInfo.FileName = _pathExe;

            // Es.: currentProcess.StartInfo.Arguments="http://www.microsoft.com";
            currentProcess.StartInfo.Arguments = argoment;

            currentProcess.Start();
            currentProcess.WaitForExit();
            currentProcess.Close();

            return true;
        }
        catch (Exception currentException)
        {
            throw currentException;
        }
    }
}

Я надеюсь ответить на ваш вопрос.

M.

...