【问题标题】:WCF: how to start simple cmd command on remote machineWCF:如何在远程机器上启动简单的 cmd 命令
【发布时间】:2019-04-07 15:56:45
【问题描述】:

所以我有WCF 服务器在远程机器上运行。 此服务器接收简单字符串作为参数,我希望通过 command line 执行此参数。

这是服务器端需要执行command的函数:

public void ExecuteCmdCommand(string arguments)
    {
        log.Info(arguments);
        Process process = new Process();
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.WindowStyle = ProcessWindowStyle.Maximized;
        startInfo.RedirectStandardOutput = true;
        startInfo.UseShellExecute = false;
        startInfo.FileName = "cmd.exe";
        startInfo.Arguments = arguments;
        log.Debug(startInfo.Arguments);
        process.StartInfo = startInfo;
        process.OutputDataReceived += (sender, args) =>
        {                
            log.Info(args.Data);
        };

        process.Start();
        process.BeginOutputReadLine();
        process.WaitForExit();
    }

正如您在此function 开头看到的那样,我打印到我的console 收到的command

所以我尝试通过传递参数notepad 来启动notepad,我可以通过控制台看到命令是在服务器端接收的,所以我可以确定通信正常但什么也没发生。

我做错了什么?我本地机器上的相同命令启动notepad

更新

好的notepad 工作正常(最后也没有.exe)但是当我发送命令appium(我想启动我的appium 服务器)我得到这个err或发送时commandserver (但 server 收到 'appium' 命令):

System.ServiceModel.FaultException: '服务器无法处理 由于内部错误导致的请求。有关更多信息 错误,要么打开 IncludeExceptionDetailInFaults(要么来自 ServiceBehaviorAttribute 或来自配置 行为)在服务器上以发送异常信息 返回客户端,或根据 Microsoft .NET 打开跟踪 框架 SDK 文档并检查服务器跟踪日志。'

【问题讨论】:

  • 该服务是否托管在 IIS 中?还是windows服务?根据这些托管进程的配置方式,您可能不会“看到”记事本,因为它们可能未启用连接到它们的显示器。如果您发送参数“/c dir c: > c:\temp\somedir.txt”(假设 c:\temp 确实存在并且对每个人都是可写的)在调用服务后您能找到 somedir.txt 吗?
  • 在该服务器端代码中添加 try/catch 并记录错误。或者在服务器上启用 WCF 跟踪以记录异常详细信息。:docs.microsoft.com/en-us/dotnet/framework/wcf/diagnostics/…
  • “系统找不到指定的文件”虽然我手动尝试时识别了appium
  • 您的服务没有正确的 PATH 设置。尝试使用完整路径。请记住,服务不需要在其个人资料中具有相同的设置或访问用户拥有的相同文件夹。从服务的角度来看,您可以运行某些东西没有任何意义。

标签: c# wcf cmd


【解决方案1】:

进程的文件名不正确,“cmd.exe”。你可以试试这个:

ProcessStartInfo startInfo = new ProcessStartInfo(arguments);
startInfo.WindowStyle = ProcessWindowStyle.Maximized;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;

并在参数中传递以下内容:

notepad.exe

有关ProcessStartInfo类的详细概述,请查看here

我建议你考虑一下你想要传递参数的情况,以及一些与你想要开始的过程相关的参数。例如,您可能想要启动记事本并打开一个文件。该文件也应作为参数传递。所以我认为一个更好的方法是使arguments 成为一个字符串数组,并遵循数组的第一个元素是您要启动的程序的约定,而数组的其余元素是程序的参数。

【讨论】:

  • 我需要删除其余的吗?
  • @falukky 基本上你不需要这个startInfo.Arguments = arguments
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
相关资源
最近更新 更多