【问题标题】:Why can I start a given application using a Windows Service in interactive mode, but not as a service? (Process.Start)为什么我可以在交互模式下使用 Windows 服务启动给定的应用程序,但不能作为服务启动? (进程.开始)
【发布时间】:2017-12-08 14:45:47
【问题描述】:

你好!我目前正在编写一个简单的 C#.NET 服务,该服务会在 PC 失去其无线连接 30 秒时停止给定进程。无线连接返回后,它将重新启动该过程。服务中的所有逻辑看起来都很合理,当我在我的 Visual Studio 开发环境中运行该服务时,它可以完美地运行,目标应用程序从运行该服务的 PC 上存在的同一目录中运行。但是,当我在远程 PC 上运行该服务时,应用程序在重新连接到网络时永远不会重新启动。在 try-catch 中也没有遇到错误。我已经阅读了很多关于工作目录是一个问题的内容,但这并不能解释为什么它在我的机器上运行而不是在另一台机器上运行。这是我目前正在使用的代码:

try
{
    ProcessStartInfo processInfo = new ProcessStartInfo();
    processInfo.FileName = @"C:\Path\Application\Application.exe";
    processInfo.WorkingDirectory = Path.GetDirectoryName(@"C:\Path\Application\Application.exe");
    processInfo.ErrorDialog = true;
    processInfo.UseShellExecute = false;
    processInfo.RedirectStandardOutput = true;
    processInfo.RedirectStandardError = true;
    Process proc = Process.Start(processInfo);
}
catch (Exception ex)
{
    LogTrace.TraceLine("Error re-starting process " + startInfo.FileName + ": " + ex, false);
}

其他一些注意事项:

-我尝试过使用不同权限级别的不同用户运行服务。以管理员身份运行服务没有任何区别。

-UAC 完全关闭。

-我已尝试使用 FireDaemon 在目标 PC 上的会话 0 中以交互模式运行服务。

有人对要研究的任何事情有任何想法吗?

【问题讨论】:

  • 不要使用 process.Start 服务,看看 System.ServiceProcess 命名空间文档和示例。
  • @Rob 感谢您的回复,但实际上在我的情况下,我正在尝试使用我编写的服务结束并重新启动应用程序 .exe。应用程序的重新启动是我失败的地方。

标签: c# windows service process process.start


【解决方案1】:

服务启动器的 sn-p 帮助您入门

{
using System.ServiceProcess;
using...

namespace myServicenamespace
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main(string[] args)
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] { 
                new myService() 
            };
            ServiceBase.Run(ServicesToRun);
        }
    }
}

myService 在别处定义为您想要运行的代码,包括

{
protected override void OnStart() {...}
protected override void OnStop {...}
}

服务的部署也有所不同,如前所述,请查看 ServiceProcess 上的其余文档以了解更多信息。

【讨论】:

  • 感谢您的回复,但实际上在我的情况下,我已经编写了运行服务。我正在尝试使用我编写的服务结束并重新启动应用程序 .exe。应用程序的重新启动是我失败的地方。
  • 不要忘记服务经常以不同的权限运行,这可能是问题吗?任何关于错误的输出(由于权限和缺乏环境设置,这可能很难再次从服务中获得,我使用 Windows 事件系统从服务中获取反馈。)
  • 我尝试以域管理员(PC 上的管理员)的身份运行该服务,这是我所能给予的最高权限。结果相同。我不确定在哪里记录任何错误,因为不幸的是,我有一个没有被命中的 try catch。我确实在任务管理器中看到了该进程,但没有出现应用程序窗口
  • windows 不喜欢在“允许与用户交互”被选中时从服务中打开窗口。无论如何,在我的情况下我不需要它,但我确实在不久前研究过它 - 最好的解决方法之一是启动计划任务,正如很久以前提到的那样,但我记得我确实得到了一些以这种方式出现的东西。 (是的,做一些简单的事情还有很长的路要走,似乎他们故意让它变得困难。)
  • 你说“我确实在任务管理器中看到进程启动了,但是没有出现应用程序窗口” 如果服务在没有人登录的情况下重新启动应用程序,应该在哪里窗口出现?从 Windows 7 开始,不允许服务与桌面交互,Session 0 被隔离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
相关资源
最近更新 更多