使用 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/
我制作了一个 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 可以提供帮助。
好的,我的代码在哪里?
Impersonation.ExecuteAppAsLoggedOnUser("applicationName", null);
还要确保您向用户授予替换进程级别令牌的权限: https://defaultreasoning.com/2017/01/16/migration-assistant-error-replace-process-level-token/