2012-04-04 81 views
1

我有一个包含服务和应用程序的.NET应用程序。我要求该服务在应用程序未运行时提醒我,反之亦然。这是运行在超过1000台具有不同登录凭据的机器上(正常登录用户名,例如机器1-PC,2-PC,3-PC的bob,sam,fred)。确定用户是否登录的服务

我想知道什么时候应用程序没有运行,所以我可以解决它,但是当计算机重新启动并在登录屏幕上等待时,我经常被告知我的应用程序没有运行,但实际上没有人登录有没有办法查看用户是否登录?我已经看到了一些黑客,但没有具体/没有优雅的方式来实现这一点。

这样我就可以看到服务正在运行,但不会期望应用程序在有人登录到计算机上之前运行。

+0

您是否期望您的应用程序能够在有人登录的整个过程中运行?预计应用程序是否会在服务停止时重新启动服务(类似安装服务的病毒)? – 2012-04-04 01:33:57

+0

应用程序保持登录状态 - 位于任务栏中。就我所知,应用程序无法重新启动服务。我们没有遇到停止服务的问题。 – Scottf007 2012-04-04 01:56:33

+0

应用程序可以绝对停止并启动服务。 – Jesse 2015-06-18 14:15:34

回答

0

如果你的服务是坚如磐石的(即很少崩溃),我会做的是在服务启动时在某处(文件,注册表,数据库)编写一个临时值。

然后,您第一次看到应用程序运行清除标志。

此后,如果未设置标志且应用程序未运行,则存在问题。

这种方法并不能解决用户注销的情况,只有重启场景,所以我不能100%确定这对你有用,但你只提到重启场景,所以我希望这可能会给你有一些想法。

+0

感谢competent_tech,通过查看进程是否正在运行,哪些工作正常,我可以看到应用程序是否正在运行。你逃避的问题是在它没有运行的情况下,但也不应该运行。我需要知道何时出现问题而不仅仅是状态。 – Scottf007 2012-04-04 01:58:19

+0

你对应用程序有控制吗?如果是这样,我会在开始的时候在某个地方设置一个标志,然后当它正常退出时清除标志。在您的服务中,如果标志已设置且应用程序未运行,则存在问题。要处理重新启动,请务必在服务启动时清除该标志。 – 2012-04-04 02:20:52

0

您可以在您的应用程序中使用Global\MYUniqueEvent对象,并提供必要的安全证书以便您的服务可以检查它。

您也可以侦听Microsoft.Win32.SystemEvents.SessionSwitch以确定用户正在登录。(我没有亲自使用过,但知道它在那里)。看看本作的例子http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.asp

0

这几个链接可能是有用的

注意:这样做有很好的机会 - serverfault可能是一个更好的网站,可以提出有关管理大量计算机的问题(除非您使用工具进行黑屏活动)。

+0

嗨Alexi它看起来像检查谁运行explorer.exe是目前为止最好的选择。我将实施它并查看它是如何工作的 – Scottf007 2012-04-11 12:31:14

0
var ntuser = new NTAccount(UserName); 

var securityIdentifier = (SecurityIdentifier)ntuser.Translate(typeof(SecurityIdentifier)); 

var okey = Registry.Users.OpenSubKey(securityIdentifier + @"\Control Panel\Desktop", true); //any key is ok 

if (okey != null) 
//login 
else 
//not login 
相关问题