从C#创建进程时psexec.exe不起作用

时间:2011-11-09 15:31:02

标签: c# process psexec

长话短说......

这不起作用:

Process p = new Process();
p.StartInfo.FileName = @"External\PsExec.exe";
string file = String.Concat(Path.Combine(Environment.CurrentDirectory,"temp"),@"\iisreset",DateTime.Now.ToString("ddMMyyyy-hhmmssss"),".txt");
p.StartInfo.Arguments = String.Format("-s -u {0}\\{1} -p {2} \\\\{3} iisreset > \"{4}\"", Domain,UserName, Password, machineIP, file);
p.StartInfo.CreateNoWindow = true;
p.Start();
p.WaitForExit();

我收到了RPC Unavailable消息。

但是当我访问程序文件夹中的命令行时,我运行:(使用正确的参数),就像我在文件名/参数中指定的那样......

External\PsExec.exe -s -u [user] -p [password] \\[ip] iisreset > "[path]"

有效! 我是否必须在C#进程中指定其他内容?可能会发生什么?

提前致谢!

编辑:如果我将cmd作为FileName而/c PsExec.exe放在参数之前,它就有效。问题是这样它总是显示窗口。

3 个答案:

答案 0 :(得分:2)

使用p.standardinput.writeline(command)代替p.startinfo.arguments

string PSPath = @"C:\PSTools\PsExec.exe";
            fullcommand = PSPath + " -u " + userName + " -p " + password + " \\\\" + remoteMachine + " -h cmd.exe /c " + command + "";
            

            Console.Clear();
            //Console.WriteLine(fullcommand);
            System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError = true;
            process.StartInfo.RedirectStandardInput = true;

            process.StartInfo.FileName = "cmd.exe";
            //process.StartInfo.Arguments = fullcommand;

            process.Start();
            process.StandardInput.WriteLine(fullcommand);
            process.StandardInput.Flush();
            process.StandardInput.Close();
            Console.WriteLine("*****Command*****");
            Console.WriteLine(fullcommand);
            Console.WriteLine("*****Output*****");
            Console.WriteLine(process.StandardOutput.ReadToEnd());
            Console.WriteLine("*****Error*****");
            Console.WriteLine(process.StandardError.ReadToEnd());
            Console.WriteLine("*****Exit*****");
            process.WaitForExit();
            Console.WriteLine("Again ?");

答案 1 :(得分:1)

您不能使用您正在进行的参数重定向标准输出。事实并非如此。

在命令行中,当命令解释器看到>时,您的参数结束,并且它开始将标准输出重定向到文件名的过程。

要在C#中完成此操作,您需要使用RedirectStandardOutput类的StartInfo属性,然后从Process.StandardOutput流中读取并写入文件。

RedirectStandardOutput的MSDN文档有一个简短的示例,您可以使用它来开始。

答案 2 :(得分:0)

iisreset [machinename] -

你不需要psexec