如何在.net中的另一台计算机上运行进程

时间:2009-04-22 14:24:00

标签: c# windows-services parallel-processing appdomain

假设我有一个名为“MyService”的Windows服务和一个名为“MyEXE”的可执行文件,位于我网络上的几台计算机上。

是否可以(在“MyService”中)在不同/同一台计算机上启动“MyEXE”的多个实例,让它执行某项任务并将“true / false”结果返回到“MyService”中的回调方法? / p>

像这样的东西

class MyService : ServiceBase
{
    delegate void UpdateCallBack(int id, bool updated)
    void CheckForUpdates()
    {
        bool updatesExist = someService.GetCurrentVersion() != currentVersion;
        if(updatesExist)
        {
            UpdatePC("C:\Program Files\MyApp.exe", 1, UpdateComplete);
            UpdatePC("\\somepc\Program Files\MyApp.exe", 1, UpdateComplete);
            UpdatePC("\\mypc\Program Files\MyApp.exe", 1, UpdateComplete);
        }
    }

    void UpdatePC(string filePath, int id, UpdateCallBack callback)
    {
       //This is where I am kind of lost 
       SomeEXERunner runner = new SomeEXERunner();
       runner.Run(filePath,"-u",id,callback);
    }

    void UpdateComplete(int id, bool updated)
    {
       //do something
       if(!updated)
          EmailService.NotifyAdmin("PC Not updated", id);
    }
}

也许我的整个架构都错了!

4 个答案:

答案 0 :(得分:10)

您可以做的一件事是在一个单独的进程中从Sysinternals运行PsExec工具(http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx),将结果传递给一个文件,然后解析它以找出成功/失败。

答案 1 :(得分:3)

你可以像Ian所说的那样使用PSexec,但我认为WMI是一个更好的方法来试试这个例子http://www.codeproject.com/KB/cs/EverythingInWmi02.aspx

答案 2 :(得分:0)

一种解决方案是使用psexec,另一种解决方案是...... do what psexec does

  • 将服务exe作为资源嵌入到您的应用中
  • 将资源复制到\\ remotesystem \ admin $
  • 使用SCM在\\ remotesystem
  • 上启动此exe作为服务
  • 连接请求服务进行工作
  • 从SCM卸载服务

答案 3 :(得分:0)

另请参阅任务管理器API。你安排一个任务现在运行一次+ 1秒,等等。它是基于COM的,所以非常适合.NET。

与psexec不同,它不会在目标机器上安装任何东西。