如何使用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);
我一直在“找不到网络路径”。
答案 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)
根据MSDN,Process
对象只允许访问到远程进程,而不能启动或停止远程进程。所以要回答你关于使用这门课程的问题,你不能。
答案 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工作)。