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

时间:2010-02-26 17:56:34

标签: c# process system.diagnostics

如何使用System.Diagnostics.Process类在c#中使用计算机名=“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);

我一直在“找不到网络路径”。

5 个答案:

答案 0 :(得分:16)

可以使用http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

中的PsExec

或WMI:

object theProcessToRun() = { "YourFileHere" };

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

theClass.InvokeMethod("Create", theProcessToRun);

答案 1 :(得分:14)

使用以下其中一项:

或者如果您愿意,请注入您自己的服务或COM组件。这与PsExec的作用非常接近。

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

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

ProcessStartInfo无法启动远程进程。

答案 2 :(得分:7)

根据MSDNProcess对象只允许访问到远程进程,而不能启动或停止远程进程。所以要回答你关于使用这门课程的问题,你不能。

答案 3 :(得分:2)

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

答案 4 :(得分:-5)

我不相信你可以直接通过UNC路径开始一个过程;也就是说,如果System.Process使用windows comspec来启动应用程序...如何通过将驱动器映射到“\ someComputer \ somePath”来测试此理论,然后将ProcessStartInfo的创建更改为?如果它以这种方式工作,那么您可能需要考虑以编程方式临时映射驱动器,启动应用程序,然后删除映射(非常类似于命令窗口中的pushd / popd工作)。