14

如何使用 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);

我不断收到“找不到网络路径”。

4

5 回答 5

17

可以从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);
于 2010-02-26T18:06:39.627 回答
15

使用以下方法之一:

或者,如果您愿意,可以注入您自己的服务或 COM 组件。这将非常接近 PsExec 所做的。

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

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

ProcessStartInfo无法启动远程进程。

于 2010-07-09T15:52:12.663 回答
7

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

于 2010-02-26T18:11:33.550 回答
4

使用 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);
}
于 2018-01-04T17:00:49.360 回答
-5

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

于 2010-02-26T18:06:57.053 回答