c#中的监控应用程序

本文关键字:应用程序 监控 | 更新日期: 2023-09-27 18:09:30

我正在c#中制作一个控制台应用程序,用于监控公司pc中的使用,该应用程序工作得很好,但我的问题是,我想使如果工作人员关闭它,我想要么不允许关闭它(虽然我已经读到,不可能避免他从任务监视器中关闭它)或重新启动它。

我的方法是写一个windows服务来检查应用程序是否正在运行,但是当从服务启动时,应用程序不能正确记录用户的活动(甚至允许服务与桌面交互,通过在服务控制选项卡上检查它)。

我也认为在制定一个计划任务,如果应用程序正在运行,如果需要重新启动它监控。

我的问题是,什么是最好的方法,使应用程序继续进行,而用户(普通用户,而不是管理权限)登录,不能被他关闭?

PD:如果他关闭应用程序,他可能不工作,它将没有常数;)

c#中的监控应用程序

我的方法是编写一个windows服务来检查应用程序是否正在运行

这是监视在用户上下文中运行的守护程序应用程序的最简单(可能也是最干净)的方法。Terje的答案解决了这个问题。

但是当从服务启动时,应用程序不能正确记录用户的活动(甚至允许服务与桌面交互,通过在服务控制选项卡上检查它)。

这是因为您的应用程序在服务桌面上运行。选中"服务控制"选项卡上的复选框,只显示由服务本身在用户桌面上创建的窗口。

您需要在登录用户的默认桌面启动应用程序。参见在c++中启动交互式客户端进程

对于windows服务,检索用户的令牌非常简单:

在Service中处理OnSessionChange事件来检索用户登录/注销时的会话ID。获得会话ID后,您可以检索用户令牌并在用户桌面上启动监视器应用程序。

现在你所要做的就是调用CreateProcessAsUser使用以下STARTUPINFO。

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

完整的示例源代码参见Henry Chong的博客文章

无论如何,一旦用户关闭程序,您的windows窗体应用程序将收到WM_CLOSE消息。在此消息的处理程序中,您可以将.bat文件写入硬盘驱动器,这只是再次运行您的应用程序。然后,您只需要在几分钟内安排您的。bat文件。因此,一旦您的应用程序被关闭,它将由窗口重新启动。如前所述,您还可以使用额外的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();