我正在c#制作一个控制台应用程序用于监控公司电脑中的使用,该应用效果很好,但我的问题是,如果工作人员关闭它,我想要做到不允许关闭它(虽然我已经读过它不可能避免他从任务监视器关闭它)或重新启动它。
我的方法是编写一个Windows服务来检查应用程序是否正在运行,但是当从服务启动时,应用程序不会正确记录用户活动(甚至允许服务与桌面交互,通过在服务控制选项卡上进行检查)。
我也考虑过制定计划任务,监控应用程序是否正在运行,并在需要时重新启动它。
我的问题是,当用户(普通用户,而非管理员权限)登录并且无法被他关闭时,使应用程序继续运行的最佳方法是什么?
PD:如果他关闭应用程序,他可能无法正常工作,而且不会使用它;)答案 0 :(得分:0)
无论如何,一旦用户关闭程序,您的Windows窗体applciation将收到WM_CLOSE消息。在此消息的处理程序中,您可以将.bat文件写入硬盘驱动器,该硬盘驱动器仅再次运行您的应用程序。然后你只需要在几分钟内调整你的.bat文件。因此,一旦您的申请被关闭,它将再次由Windows启动。 您也可以使用前面提到的其他Windows服务。这是更可靠的方式。您只需要将您的程序作为特殊桌面用户运行。有几种方法可以实现这一目标,例如:
System.Diagnostics.Process.Start(filenameToStart, username, password, domain);
答案 1 :(得分:0)
确保您可以控制Process
实例。如果你有像你提到的服务,你可以从它开始真正的监控应用程序。
然后你可以这样做:
public void StartProcess()
{
var process = new Process();
process.EnableRaisingEvents = true;
process.Exited += new EventHandler(process_Exited);
process.Start();
}
您的process_Exited
事件可以循环回StartProcess();
答案 2 :(得分:0)
我的方法是编写一个Windows服务来检查应用程序是否正在运行
这是监视在用户上下文中运行的守护程序应用程序的最简单(也可能是最干净)的方法。 Terje的回答解决了这个问题。
但是从服务启动时,应用程序不会正确记录用户活动(甚至允许服务与桌面交互,通过在服务控制选项卡上进行检查)。
这是因为您的应用程序正在服务桌面上运行。选中服务控制选项卡上的框仅显示服务本身在用户桌面上创建的窗口。
您需要在登录用户的默认桌面上启动该应用程序。见Starting an Interactive Client Process in C++
为Windows服务检索用户的令牌非常简单:
在服务处理OnSessionChange事件中,以便在用户登录/注销时检索会话ID。获得会话ID后,您可以检索User Token并在用户桌面上启动监控应用程序。
现在,您只需使用以下内容为STARTUPINFO致电CreateProcessAsUser。
var si = new STARTUPINFO();
si.cb = Marshal.SizeOf(si);
si.lpDesktop = "Winsta0\\default";//this is the user's desktop.
有关完整的样本来源,请参阅Henry Chong的blog post