使用 Windows 服务启动应用程序或批处理文件

Start an application or batch file using Windows Service

我制作了一个 C# 应用程序来备份一些文件并将其发送到 FTP 或 Dropbox。此应用程序在服务器中运行。但有时我的应用程序会以某种方式崩溃或关闭。它必须一直保持打开状态。我想我可以做一个 Windows 服务来检查我的应用程序状态。如果我的应用程序关闭,请再次打开它。我创建了服务。我使用 Process.Start() 方法再次打开我的应用程序。但它没有用。我更改了代码以打开一个打开我的应用程序的批处理文件。它也没有用。然后我搜索了这个情况。我了解到 Windows 服务无法从桌面打开应用程序。我没有找到解决方案。

是否有解决此问题的方法,或者是否有与 Windows 服务不同的方法可用于再次打开我的应用程序?

抱歉我的英语不好。谢谢

一个快速的解决方案是创建一个 exe(Monitor.exe) 来监控您的应用进程是否为 运行。如果没有启动您的应用程序。

Monitor.exe 的唯一职责是确保您的主应用已启动并且 运行

您的应用程序绝对没有理由崩溃。为此,在开始时添加对未处理异常的处理

// For service
AppDomain.CurrentDomain.UnhandledException += ...
// For windows forms
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);

那么你的逻辑应该是 - 你启动你的执行线程,如果该线程死了,它应该在这里处理

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
    // Log the exception, display it, etc
    // Restart your processor on new thread
    // count number of breakages. If it exceeds certain criteria, like total number,
    // or number per minute, stop service ans send yourself email - 
    // hey your service encounters too many exceptions
}

就您问题的组成部分而言 - 在 DLL 中编写您的逻辑,然后您可以在服务或应用程序或其他地方重新使用它

尽管如此,您的代码应该处理所有异常并防止未处理的异常。而且它可能会根据框架版本而有所不同。参见 HandleProcessCorruptedStateExceptionsAttribute

I learned Windows services can't open an app from desktop.

这是错误的,服务可以在 windows 上以桌面用户身份启动应用程序。但是您需要采取一些变通办法才能使其正常工作。

问题是 windows 服务 运行 与您的 windows 桌面用户处于不同的会话中。并且他们的交互是不直接允许的。这叫做:Session 0 Isolation

您需要做的是,从 windows 服务启动您的桌面应用程序 "as the desktop user"。 Windows CreateProcessAsUserA function 可以提供帮助。

好的,我的代码在哪里?

我真的很喜欢这个例子class。 "Impersonation.cs" 因为,它使您可以非常轻松地使用 CreateProcessAsUser 函数。您可以像这样调用该函数:

Impersonation.ExecuteAppAsLoggedOnUser("applicationName", null);

还要确保您向用户授予替换进程级别令牌的权限: https://defaultreasoning.com/2017/01/16/migration-assistant-error-replace-process-level-token/