Windows服务应用控制器

时间:2009-03-26 21:22:27

标签: c# .net windows-services

这是前提:

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

这些是我的问题。

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

2)从Windows服务运行exe有多难?如何阻止一个?

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

5 个答案:

答案 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服务以获取“禁止”应用程序列表,然后在另一个计时器上,让它检查正在运行的禁用应用程序并将其杀死它是。这里有一些代码来获取进程列表,你可以使用进程类上的方法来启动或杀死某些东西:

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

计时器也可以独立运行 - 它可以每天一次检查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,并且登录到该计算机的人永远不会看到它。