这是前提:
我有一个桌面,我需要能够启动和停止应用程序,但无法远程访问。我想到的是在机器上设置一个服务,它将按照说明启动/停止应用程序列表。此Windows服务将定期为Web服务提供新命令,并相应地执行它们。
这些是我的问题。
1)这是最简单的解决方案吗?你还推荐什么?
2)从Windows服务运行exe有多难?如何阻止一个?
这不是一个项目或任何东西,只是我感兴趣的实现(主要是为了好玩)。任何答案甚至想法都表示赞赏。也欢迎进行一般性讨论(随时留言)。
答案 0 :(得分:3)
至于在C#中创建Windows服务本身,请参阅我的帖子here。
轮询机制可行,但总的来说,我更喜欢事件驱动的流程而不是轮询流程。您没有提到您正在使用的.NET版本,但如果它是.NET 3.0 / 3.5,我建议您使用WCF。当命令发布到Web服务时,Web服务可以将命令发送到要执行的Windows服务。非常直截了当。编程WCF服务的作者Juval Lowy提供了一堆可以在website免费使用的WCF示例/库。
答案 1 :(得分:1)
所以我猜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.");
}
答案 2 :(得分:0)
我已经完成了启动其他exe文件的服务。有一些事情要考虑:作为一项服务,你没有可视桌面 - >没有直接的互动是可能的。此外,该程序必须设计为运行很长时间。
停止exe是为了终止进程。考虑通常的副作用。
答案 3 :(得分:0)
这不会太难 - 您可以让它经常轮询一些web服务以获取“禁止”应用程序列表,然后在另一个计时器上,让它检查正在运行的禁用应用程序并将其杀死它是。这里有一些代码来获取进程列表,你可以使用进程类上的方法来启动或杀死某些东西:
计时器也可以独立运行 - 它可以每天一次检查Web服务以获取新的添加/禁止列表,但是例如每隔2分钟检查计算机上运行的进程。
答案 4 :(得分:0)
我先回答问题2:
要启动或停止程序,只需使用System.Diagnostics.Process对象,示例代码就在MSDN库中。
问题1: 如果您想这样做,可以定期轮询Web服务。
作为替代方案,您可以设置远程服务并让它只是在tcp端口上侦听函数调用,然后编写一个可以使用远程处理来调用服务的Windows应用程序。我必须为合法的商业应用程序执行此操作,并且它运行良好。
但是,如果我不包含此警告,我将是非常不负责任的:
无论哪种方式,设置一台计算机以便它可以执行任意代码是一个糟糕的想法,应该非常小心。仅仅因为可以完成并不意味着应该完成。如果您使用Web服务路由,您将如何确保某人不会篡改Web服务并获取恶意代码?你怎么知道有人不会弄乱你的app.config并将应用程序指向他们自己的网络服务?在远程处理方案中,如何确保其他.Net开发人员不仅仅创建自己的代理?
老实说,我很惊讶Microsoft甚至允许在.Net应用程序中使用System.Diagnostocs.Process。您可以随心所欲地执行任何操作,包括启动cmd shell和执行系统命令。因此,我建议你认真考虑是否真的有必要这样做。您可以更好地安装vnc或使用远程桌面或其他应用程序进行远程访问。
您需要回答的另一个问题是“该应用程序是否应该对该远程计算机上的用户可见?”如果是这样,那么您需要确保将服务设置为在该用户的上下文下运行。否则,您可以使用本地系统帐户启动Word,并且登录到该计算机的人永远不会看到它。