2

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

是否可以(从“MyService”中)在不同/同一台计算机上启动多个“MyEXE”实例,让它执行一些任务并将真/假结果返回给“MyService”中的回调方法?

像这样的东西

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

4 回答 4

10

您可以做的一件事是在单独的进程中从 Sysinternals运行 PsExec 工具 ( http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx ),将结果通过管道传输到文件,然后将其解析为图成功/失败。

于 2009-04-22T14:31:00.997 回答
3

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

于 2009-04-22T14:51:26.220 回答
0

一种解决方案是使用 psexec,另一种是......做 psexec 所做的事情:

  • 将服务 exe 作为资源嵌入到您的应用中
  • 将资源复制到 \\remotesystem\admin$
  • 使用 SCM 在 \\remotesystem 上启动此 exe 作为服务
  • 连接请求服务来完成工作
  • 从 SCM 卸载服务
于 2010-03-06T04:34:02.880 回答
0

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

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

于 2010-03-06T04:42:57.683 回答