一种确定用户是否已登录的服务
本文关键字:是否 登录 服务 用户 一种 | 更新日期: 2023-09-27 18:29:59
我有一个.NET应用程序,它同时包含服务和应用程序。我要求服务在应用程序未运行时提醒我,反之亦然。这在1000多台具有不同登录凭据的机器上运行(正常登录用户名,即机器1-PC、2-PC、3-PC的bob、sam、fred)。
我想知道应用程序什么时候没有运行,这样我就可以处理它,但是当计算机重新启动并在登录屏幕上等待时,我经常被告知我的应用程序没有运行,但实际上没有人登录。有办法查看用户是否登录吗?我见过一些技巧,但没有具体/优雅的方法来实现这一点。
这样,我就可以看到服务正在运行,但在有人登录机器之前,我不希望应用程序正在运行。
如果你的服务坚如磐石(即很少崩溃),我会在服务启动时在某个地方(文件、注册表、数据库)写一个临时值。
然后,当您第一次看到应用程序正在运行时,清除该标志。
此后,如果未设置标志并且应用程序未运行,则存在问题。
这种方法不能解决用户注销的情况,只能解决重新启动的情况,所以我不能100%确定这对你有效,但你只提到了重新启动的场景,所以我希望这能给你一些想法。
您可以在应用程序中使用Global'MYUniqueEvent
对象,并在其上提供必要的安全凭据,以便您的服务可以检查它。
您也可以监听Microsoft.Win32.SystemEvents.SessionSwitch
以确定用户正在登录。(我个人没有使用过,但知道它在那里)。看看这个例子http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.asp
这对链接可能是有用的
- http://www.codeproject.com/Articles/10937/Retrieving-Logged-In-User-Name-using-a-Windows-Ser-通过检查运行explorer.exe的用户(如果有的话)来检查当前是否有登录用户
- 如何在.NET中检索已登录/已连接用户的列表?-使用Win32 PInvoke获取用户信息
注意:很有可能有更好的内置方法-serverfault可能是一个更好的网站,可以询问有关管理大量机器的问题(除非你用工具进行可疑活动)。
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