【问题标题】:Open exe as service without "Interactive Service Detection" message in window 7在窗口 7 中打开 exe 作为服务而没有“交互式服务检测”消息
【发布时间】:2025-12-06 09:05:02
【问题描述】:

我有一个简单的应用程序可以监视文件夹的任何更改,如下所示:

            private void Form1_Load(object sender, EventArgs e)

>         {
>             FileSystemWatcher w = new FileSystemWatcher();
>             w.Path = @"C:\temp";
>             w.Changed += new FileSystemEventHandler(OnChanged);
>             w.Created += new FileSystemEventHandler(OnChanged);
>             w.Deleted += new FileSystemEventHandler(OnChanged);
>             w.Renamed += new RenamedEventHandler(OnChanged);
>             // Begin watching.
>             w.EnableRaisingEvents = true;
        }
    // Define the event handlers. 
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
        MessageBox.Show("File: " + e.FullPath + " " + e.ChangeType + Path.GetFileName(e.FullPath));
    }

我在命令提示符下添加了与服务相同的内容

  sc create <service name> binPath= <path of the exe file>

这在服务中添加了 exe,并在注册表中创建了条目。但是当我尝试将服务启动为

sc start <service name>

它显示了“交互式服务检测”消息。

我想避免此消息弹出并启动服务。 我也需要在 c# 中完成此操作,但如果有人对在 cmd 中执行此操作有任何想法,我可以将其添加为批处理文件并执行相同操作。

编辑我

正如@Seva 建议的那样,我创建了一个服务来调用我希望的 exe。我编写了以下代码在服务启动时启动 exe:

    protected override void OnStart(string[] args)
    {

        base.OnStart(args);
        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerAsync();

    }
    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        p.StartInfo.CreateNoWindow = false;
        p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
        p.StartInfo.WorkingDirectory = @"<my exe path>";
        p.StartInfo.FileName = "<myexe.exe>";
        p.StartInfo.Arguments = @"<my exe path>";
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.Start();
        p.WaitForExit();
        base.Stop();
    }

我已成功安装服务,但启动时没有启动 exe。

编辑二

exe 已启动。必须将服务的属性配置为允许服务与桌面交互,但随后再次出现“交互服务检测”消息。

【问题讨论】:

    标签: windows-services exe


    【解决方案1】:

    您必须将 Windows 服务重新架构为两部分 - 一个无 GUI 的服务进程和一个在用户桌面上运行的单独 UI 应用程序。服务可以通过多种方式与 UI 应用程序进行通信。这些 SO 问题将帮助您入门:

    没有其他办法。顺便说一句,您现有的方法已经被打破了——对于非管理员用户和远程桌面会话——即使他们愿意,他们也不会看到来自服务的 UI。

    【讨论】:

    • 谢谢@Seva Titov,我实际上是开发Windows服务的新手。我只是自己开始了。谢谢你给我指明了方向。我将立即通过它。我只是有一个疑问:当一个服务调用这个 exe 时,它​​不会再次显示该消息吗?
    • 我创建了这个服务,这个服务调用了 exe,但是当我尝试这个时,exe 没有执行 [如 EDIT I]。但是当我检查服务的属性时,在“登录”选项卡中“允许服务与桌面交互”被禁用。当我再次尝试时,“交互式服务检测”消息再次弹出。
    • 通常用户模式应用程序调用服务,而不是服务调用用户模式应用程序。原因是可能有多个用户登录计算机(或根本没有登录),并且服务必须知道他们都在哪里以及他们处于什么状态。典型示例:用户模式应用程序注册一个托盘图标并进行通信到服务;当用户应用程序确定需要用户执行某些操作时,它会显示一个气球或打开一个新窗口以吸引用户注意。
    • 嗨塞瓦,我发现了同样的问题,但在詹金斯。如何在系统上看到真实的浏览器?我不想在交互式服务检测中运行我的 Jenkins 作业。