Windows服务应用控制器

这是前提:

我有一个桌面,我需要能够启动和停止应用程序,但无法远程访问。 我想到的是在机器上设置一个服务,它将按照说明启动/停止应用程序列表。 此Windows服务将定期为Web服务提供新命令,并相应地执行它们。

这些是我的问题。

1)这是最简单的解决方案吗? 你还会推荐什么?

2)从Windows服务运行exe有多难? 停一个怎么样?

这不是一个项目或任何东西,只是我感兴趣的实现(主要是为了好玩)。 任何答案甚至想法都表示赞赏。 也欢迎进行一般性讨论(随时发表评论)。

至于在C#中创建Windows服务本身,请参阅我的post。

轮询机制可行,但总的来说,我更喜欢事件驱动的流程而不是轮询流程。 您没有提到您正在使用的.NET版本,但如果它是.NET 3.0 / 3.5,我建议使用WCF。 当命令发布到Web服务时,Web服务可以将命令发送到要执行的Windows服务。 很简单。 编程WCF服务的作者Juval Lowy提供了一些可在他的网站上免费使用的WCF示例/库。

所以我猜PsExec是不可能的?

除此之外,在Win服务中实现程序的运行并不困难。 只需使用.NET Process类来完成它,从我的代码中取样:

ProcessStartInfo processStartInfo = new ProcessStartInfo (programExePath, commandLineArgs); consoleLogger.WriteLine (log, Level.Debug, "Running program {0} ('{1}')", programExePath, commandLineArgs); processStartInfo.CreateNoWindow = true; processStartInfo.ErrorDialog = false; processStartInfo.RedirectStandardError = true; processStartInfo.RedirectStandardOutput = true; processStartInfo.UseShellExecute = false; using (Process process = new Process ()) { process.StartInfo = processStartInfo; process.ErrorDataReceived += new DataReceivedEventHandler (process_ErrorDataReceived); process.OutputDataReceived += new DataReceivedEventHandler (process_OutputDataReceived); process.Start (); process.BeginOutputReadLine (); process.BeginErrorReadLine (); if (false == process.WaitForExit ((int)TimeSpan.FromHours(1).TotalMilliseconds)) throw new ArgumentException("The program '{0}' did not finish in time, aborting.", programExePath); if (process.ExitCode != 0) throw new ArgumentException ("failed."); } 

我已经完成了一个启动其他exe文件的服务。 有一些事情需要考虑:作为一种服务,你没有可视桌面 – >没有可能的直接交互。 此外,该程序必须设计为运行很长一段时间。

停止exe是为了杀死进程。 考虑通常的副作用。

这不会太困难 – 您可以让它经常轮询一些web服务以获取“禁用”应用程序列表,然后在另一个计时器上,让它检查正在运行的禁用应用程序,如果是,则将其杀死。 以下是获取进程列表的一些代码,您可以使用进程类上的方法来启动或终止某些进程:

http://www.vbdotnetheaven.com/UploadFile/prvn_131971/machineprocessvb11182005001454AM/machineprocessvb.aspx

定时器也可以独立运行 – 它可以每天一次检查Web服务以获取新的添加/禁止列表,但是例如每2分钟检查一次在计算机上运行的进程。

我先回答问题2:

要启动或停止程序,只需使用System.Diagnostics.Process对象,示例代码就在MSDN库中。

对于问题1:如果您想这样做,您可以定期轮询Web服务。

作为替代方案,您可以设置远程服务并让它只是在tcp端口上侦听函数调用,然后编写一个可以使用远程处理来调用服务的Windows应用程序。 我必须为合法的商业应用程序执行此操作,并且它运行良好。

但是,如果我不包含此警告,我将是非常不负责任的:

无论哪种方式,设置计算机以便它可以执行任意代码是一个主意,应该非常小心地完成。 仅仅因为它可以完成并不意味着它应该被完成。 如果您使用Web服务路由,您将如何确保某人不会篡改Web服务并获取恶意代码? 你怎么知道有人不会弄乱你的app.config并将应用程序指向他们自己的网络服务? 在远程处理场景中,如何确保其他.Net开发人员不仅仅创建自己的代理?

老实说,我很惊讶微软甚至允许在.Net应用程序中使用System.Diagnostocs.Process。 您可以随心所欲地执行任何操作,包括启动cmd shell和执行系统命令。 因此,我建议你认真考虑是否真的有必要这样做。 安装vnc或使用远程桌面或其他应用程序进行远程访问可能会更好。

您需要回答的另一个问题是“该应用程序应该对该远程计算机上的用户可见吗?” 如果是这样,那么您需要确保将服务设置为在该用户的上下文下运行。 否则,您可以使用本地系统帐户启动Word,并且登录到该计算机的人永远不会看到它。