如何在安装打印机驱动程序的C#中执行进程?

时间:2011-09-28 07:51:38

标签: c# .net visual-studio-2010 printers

我必须在我的C#代码中启动可执行文件(installPrint.exe)。为此,我使用了System.Diagnostics.Process类。 exe文件安装打印机驱动程序并将多个文件复制到不同的目录中。我可以从命令行执行exe,一切正常。但是如果我使用C#应用程序中的Process类执行该文件,则不会安装打印机驱动程序。

我在Windows XP SP2 x86计算机上以管理员用户身份启动我的C#应用​​程序。为什么我的可执行文件在我的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 个答案:

答案 0 :(得分:2)

我认为,您正在Windows Vista或7上运行程序。然后,您必须为新创建的进程请求提升才能以完全访问权限运行。查看这些问题以获取详细信息: Request Windows Vista UAC elevation if path is protected? Windows 7 and Vista UAC - Programmatically requesting elevation in C#

好的,我现在看到,你正在使用Win XP。然后可能是因为启动时有一些Process设置。尝试以ShellExecute开始处理,这样用户最开始接近正常状态。 这是一个示例:

var p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo { FileName = "yourfile.exe", UseShellExecute = true };
p.Start();

答案 1 :(得分:0)

我在项目的很多部分都使用这个类:

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;
        }
    }
}

我希望能回答你的问题。

微米。