无法从服务执行程序

时间:2009-08-18 15:13:04

标签: c# windows-services external-process

我有一个Windows服务,我想定期执行外部程序。我目前正常这样做

Process program = Process.Start(@"C:\mpewatch\db_parameters\DBParameters.exe");

这似乎不起作用。我正在从我的服务OnStart处理程序中启动的单独线程执行此操作。这有什么概念上的问题吗?是不是可以从这样的服务执行外部程序?

3 个答案:

答案 0 :(得分:4)

可以从服务执行外部程序,但存在安全问题。例如,您的服务可能在一个帐户下运行,该帐户对外部程序所在的文件夹没有读取权限,即使您的交互式帐户确实具有该访问权限。

出于测试目的,请尝试将服务配置为在交互式帐户下运行。如果按预期调用程序,则原始帐户的问题是它没有足够的权限来运行程序。

答案 1 :(得分:1)

Windows服务的另一个重要考虑因素是没有GUI。从技术上讲,有一个选项允许服务与本地GUI交互,但你不会看到它。这是由于作为本地系统用户运行的服务。

在服务中,任何模态对话框(确定,取消等)都被视为错误。

答案 2 :(得分:1)

您的问题未指明操作系统。

在Windows XP上,您可以将Windows服务配置为与桌面交互,方法是打开服务控制面板,双击服务,选择“登录”选项卡,将服务配置为以本地系统运行,然后选中复选框。这很简单。您可以尝试使用Notepad.exe之类的测试来查看是否可以使其正常工作。

然而,在Vista(可能是Windows 7)上,你可能会失去运气。我已经读过Vista中已经删除了Windows服务与桌面交互的能力。我忘记了术语是什么,但基本上服务将在“shell 0”中运行,而用户将占用“shell 1”。用户应用程序将能够使用WCF等技术与服务进行通信,反之亦然,但服务将无法直接与桌面通信。例如,弹出的任何错误框都必须通过交换到“shell 0”来处理。同样,这是基于我几个月前读过的东西,我还没有再去看它。对我来说,我已经构建了我的Windows服务,通过前端应用程序使用WCF进行配置。

对不起,我没有给你链接,但是如果你的服务最终必须迁移到更新的操作系统(或者你已经在那里),这是需要检查的。