繁体   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