簡體   English   中英

在C#中監控應用

[英]Monitoring app in c#

我正在用c#制作一個控制台應用程序以監視公司個人計算機中的使用情況,該應用程序很好用,但是我的問題是我想讓工作人員關閉它,但我要么不想關閉它(盡管我已經讀過) (無法避免他從任務監視器關閉它)或再次重新啟動它。

我的方法是編寫一個Windows服務,以檢查應用程序是否正在運行,但是從服務啟動時,應用程序無法正確記錄用戶的活動(即使通過在服務控制選項卡上進行檢查,也可以允許服務與桌面進行交互)。

我還認為在執行計划任務時,該程序監視應用程序是否正在運行,並在需要時重新啟動它。

我的問題是,使用戶(常規用戶而非管理員權限)登錄且無法被用戶關閉時,使應用程序繼續運行的最佳方法是什么?

PD:如果他關閉了該應用程序,則可能無法正常工作,這將不再是必需的;)

無論如何,一旦用戶關閉程序,您的Windows窗體應用程序將收到WM_CLOSE消息。 在此消息的處理程序中,您可以將.bat文件寫入硬盤驅動器,該文件僅再次運行您的應用程序。 然后,您只需要片刻即可安排.bat文件。 因此,一旦關閉您的應用程序,它將再次由Windows啟動。 您還可以使用前面提到的其他Windows服務。 這是更可靠的方法。 您只需要以特殊的桌面用戶身份運行程序。 有兩種方法可以實現此目標,例如:

System.Diagnostics.Process.Start(filenameToStart, username, password, domain);

只要確保您對Process實例具有控制權即可。 如果您有提到的服務,則可以從中啟動真正的監視器應用程序。

然后,您可以執行以下操作:

public void StartProcess()
{
      var process = new Process();
      process.EnableRaisingEvents = true;
      process.Exited += new EventHandler(process_Exited);
      process.Start();
}

您的process_Exited事件可以循環回到StartProcess();

我的方法是編寫Windows服務,以檢查應用程序是否正在運行

這是監視在用戶上下文中運行的守護程序的最簡單(可能也是最干凈的)方法。 Terje的答案解決了這個問題。

但是從服務啟動時,應用無法正確記錄用戶的活動(即使通過在服務控制標簽上進行檢查,也允許服務與桌面進行交互)。

這是因為您的應用程序正在服務桌面上運行。 選中服務控制選項卡上的框僅顯示由服務本身在用戶桌面上創建的窗口。

您需要在已登錄用戶的默認桌面上啟動該應用程序。 請參閱在C ++中啟動交互式客戶端進程

對於Windows服務,檢索用戶令牌非常簡單:

在服務中,處理OnSessionChange事件以在用戶登錄/注銷時檢索其會話ID。 獲得會話ID后,您可以檢索用戶令牌並在用戶的桌面上啟動監視器應用程序。

現在,您要做的就是使用下面的STARTUPINFO調用CreateProcessAsUser

var si = new STARTUPINFO();
si.cb = Marshal.SizeOf(si);
si.lpDesktop = "Winsta0\\default";//this is the user's desktop.

有關完整的示例源,請參閱Henry Chong的博客文章

暫無
暫無

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

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