Windows services 将exe作为服务打开,但不带";“交互式服务检测”;窗口7中的消息

Windows services 将exe作为服务打开,但不带";“交互式服务检测”;窗口7中的消息,windows-services,exe,Windows Services,Exe,我有一个简单的应用程序,可以监视文件夹的任何更改,如下所示: private void Form1_Load(object sender, EventArgs e) > { > FileSystemWatcher w = new FileSystemWatcher(); > w.Path = @"C:\temp"; > w.Changed += new Fil

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

            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;
我在命令提示符下添加了与服务相同的

  sc create <service name> binPath= <path of the exe file>
sc创建binPath=
这将在服务中添加exe,并在注册表中创建条目。但是当我试着启动服务时

sc start <service name>
sc启动
它显示了“交互式服务检测”消息

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

编辑I

正如@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();
    }
protected override void OnStart(字符串[]args)
{
base.OnStart(args);
BackgroundWorker bw=新的BackgroundWorker();
bw.DoWork+=新DoWorkEventHandler(bw_DoWork);
RunWorkerAsync();
}
私有void bw_DoWork(对象发送方,DoWorkEventArgs e)
{
p、 StartInfo.CreateNoWindow=false;
p、 StartInfo.WindowStyle=ProcessWindowStyle.Normal;
p、 StartInfo.WorkingDirectory=@;
p、 StartInfo.FileName=“”;
p、 StartInfo.Arguments=@;
p、 StartInfo.UseShellExecute=false;
p、 StartInfo.RedirectStandardOutput=true;
p、 Start();
p、 WaitForExit();
base.Stop();
}
我已成功安装服务,但启动时未启动exe

编辑II


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

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


别无选择。顺便说一句,对于非管理员用户和远程桌面会话,您现有的方法已经被打破了,即使他们愿意,他们也不会从服务中看到UI。

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