Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在远程机器上执行进程,C语言#_C#_Process_System.diagnostics - Fatal编程技术网

C# 如何在远程机器上执行进程,C语言#

C# 如何在远程机器上执行进程,C语言#,c#,process,system.diagnostics,C#,Process,System.diagnostics,如何使用System.Diagnostics.process类在c#中的远程计算机上启动进程,比如说computer name=“someComputer” 我在远程计算机上创建了一个小的控制台应用程序,它只将“Hello world”写入一个txt文件,我想远程调用它 控制台应用程序路径:c:\MyAppFolder\MyApp.exe 目前我有: ProcessStartInfo startInfo = new ProcessStartInfo(string.Format(@"\\{0}\{

如何使用System.Diagnostics.process类在c#中的远程计算机上启动进程,比如说computer name=“someComputer”

我在远程计算机上创建了一个小的控制台应用程序,它只将“Hello world”写入一个txt文件,我想远程调用它

控制台应用程序路径:c:\MyAppFolder\MyApp.exe

目前我有:

ProcessStartInfo startInfo = new ProcessStartInfo(string.Format(@"\\{0}\{1}", someComputer, somePath);

            startInfo.UserName = "MyUserName";
            SecureString sec = new SecureString();
            string pwd = "MyPassword";
            foreach (char item in pwd)
            {
                sec.AppendChar(item);
            }
            sec.MakeReadOnly();
            startInfo.Password = sec;
            startInfo.UseShellExecute = false;

            Process.Start(startInfo);
我不断得到“未找到网络路径”。

可以从

或WMI:

object theProcessToRun() = { "YourFileHere" };

ManagementClass theClass = new ManagementClass(@"\\server\root\cimv2:Win32_Process");

theClass.InvokeMethod("Create", theProcessToRun);

我不相信您可以直接通过UNC路径启动流程;也就是说,如果System.Process使用windows comspec启动应用程序。。。通过将驱动器映射到“\someComputer\somePath”,然后将ProcessStartInfo的创建更改为该值,来测试这个理论如何?如果它是这样工作的,那么你可能需要考虑临时以编程方式映射一个驱动器,启动你的应用程序,然后移除映射(就像PuthD/POPD从命令窗口中工作)。因此,要回答有关使用此类的问题,您不能使用以下选项之一:

  • (编辑)远程Powershell
  • WMI(见Ivan G的答案)
  • 任务计划程序API()
  • PsExec
  • 对象使用伪脚本。它可能通过DCOM工作,远程激活一些脚本对象
或者,如果您愿意,可以注入您自己的服务或COM组件。这与PsExec的功能非常接近

在所有这些方法中,我更喜欢任务调度器。我认为这是所有API中最干净的。连接到远程任务计划程序,为可执行文件创建新任务,然后运行它。注意:可执行文件名称应该是该机器的本地名称。不是\servername\path\file.exe,而是c:\path\file.exe。如果您愿意,请删除该任务

所有这些方法都要求您具有对目标计算机的管理访问权限


ProcessStartInfo
无法启动远程进程。

一个将WMI和其他凭据作为当前进程的示例,默认情况下,它使用与进程运行相同的用户

var hostname = "server"; //hostname or a IpAddress

var connection = new ConnectionOptions();
//The '.\' is for a local user on the remote machine
//Or 'mydomain\user' for a domain user
connection.Username = @".\Administrator";
connection.Password = "passwordOfAdministrator";

object[] theProcessToRun = { "YourFileHere" }; //for example notepad.exe

var wmiScope = new ManagementScope($@"\\{hostname}\root\cimv2", connection);
wmiScope.Connect();
using (var managementClass = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions()))
{
    managementClass.InvokeMethod("Create", theProcessToRun);
}

我在Process类上发布了一个CW答案,其中引用了MSDN,您应该将其纳入您的答案中,以涵盖使用Process.tks作为答案的问题?顺便问一下,您知道系统内部是否得到microsoft的完全官方支持吗?顺便说一句,“YourFileHere”需要是服务器的本地路径,您可以在其中附加参数,例如“C:\\whater\\whater.exe-param1-param2”和该字符串中的“server”需要是实际的服务器名或ip,例如“\\localhost\root\cimv2:Win32\u进程”此答案中的一些WMI身份验证提示:我是否遗漏了这一点?当我尝试执行第一行
对象时,处理器un()={“YourFileHere”}带有文件路径,只是有大量错误(无法在声明中指定构造函数参数…)您是否已使用
处理器运行()
?…执行任务计划程序以获取首选项。请参阅此答案以获取说明:如果目标计算机是SQL server,则另一个有用的选项是xp_cmdshell,我认为这只会导致本地计算机读取远程可执行文件,并在本地运行它。