0

我正在用 c# 制作一个控制台应用程序,用于监控公司 pc 中的使用,该应用程序运行良好,但我的问题是,如果工作人员关闭它,我想这样做,我想要么禁止关闭它(虽然我已经阅读无法避免他从任务监视器中关闭它)或重新启动它。

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

我还考虑过制定计划任务,监控应用程序是否正在运行并在需要时重新启动它。

我的问题是,在用户(普通用户,而不是管理员权限)登录并且不能被他关闭时,让应用程序继续运行的最佳方法是什么?

PD:如果他关闭应用程序,他可能无法工作,这将不是它的康斯坦斯;)

4

3 回答 3

0

无论如何,一旦用户关闭程序,您的 Windows 窗体应用程序将收到 WM_CLOSE 消息。在此消息的处理程序中,您可以将 .bat 文件写入硬盘驱动器,该文件仅再次运行您的应用程序。然后你只需要在片刻之后安排你的 .bat 文件。因此,一旦您的应用程序关闭,它就会由 Windows 再次启动。您还可以使用前面提到的其他 Windows 服务。这是更可靠的方法。您只需要以特殊的桌面用户身份运行您的程序。有几种方法可以实现这一目标,例如:

System.Diagnostics.Process.Start(filenameToStart, username, password, domain);
于 2013-04-16T12:15:51.867 回答
0

只需确保您可以控制该Process实例。如果你有你提到的服务,你可以从它启动真正的监视器应用程序。

然后你可以做这样的事情:

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

你的process_Exited事件可以循环回到StartProcess();

于 2013-04-16T12:20:46.177 回答
0

我的方法是编写一个 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 的这篇博客文章

于 2013-04-16T14:14:06.943 回答