簡體   English   中英

使用 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

我了解到 Windows 服務無法從桌面打開應用程序。

這是錯誤的,服務可以在 Windows 上以桌面用戶的身份啟動應用程序。 但是您需要做一些解決方法才能使其正常工作。

問題是 Windows 服務在與 Windows 桌面用戶不同的會話中運行。 他們的互動是不被直接允許的。 這稱為: 會話 0 隔離

您需要做的是,從 Windows 服務“作為桌面用戶”啟動您的桌面應用程序。 Windows 有CreateProcessAsUserA 函數來幫助解決這個問題。

好的,我的代碼在哪里?

這是我非常喜歡這個示例類。 “Impersonation.cs” 因為,它使您可以非常輕松地使用 CreateProcessAsUser 函數。 您可以調用該函數,如:

Impersonation.ExecuteAppAsLoggedOnUser("applicationName", null);

還要確保您向用戶授予替換進程級別令牌權限: https : //defaultreasoning.com/2017/01/16/migration-assistant-error-replace-process-level-token/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM