如何识别电脑当前是否已锁定或未登录?
Short:如何在服务中识别当前是否显示而不是显示活动桌面(即已锁定还是未登录)?如何识别电脑当前是否已锁定或未登录?
长:我试图构建一个由数据库,服务和WPF应用程序组成的Win 7-10解决方案。在DB中设置标志时,服务会向用户发送自定义消息 - 无论是否已登录。
如果有人登录,服务将启动应用程序,该应用程序显示消息以及重新启动/日志关闭选项。 这工作正常 - 迄今如此好。
如果屏幕锁定或没有用户登录,则问题是在锁定屏幕上显示一条消息。我可以使用“msg.exe *消息”显示消息,但我不希望这两个消息。 exe和应用程序启动,如果用户是登录。因此,我需要能够确定哪个可执行文件是适当的,当标志从DB读取。
要清楚:我对事件解雇不感兴趣。我有兴趣在特定的时间阅读“当前状态”。
注意:已经有很多类似于这个问题的问题,但我一直没能找到一个完全覆盖我的困境。大部分都与锁定事件有关,或者不能在服务中工作/没有用户登录。
我没有设法在C#中实现WTSSessionInfoEx(我只能找到C++示例并且无法成功转换),所以我接受失败并将监视事件。
从Michael Piendl这个答案工作:https://*.com/a/734037/5992820
谢谢迈克尔!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceProcess;
using System.Diagnostics;
namespace MyCode
{
class MyService : ServiceBase
{
public MyService()
{
this.CanHandleSessionChangeEvent = true;
}
protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
switch (changeDescription.Reason)
{
case SessionChangeReason.SessionLogon:
Debug.WriteLine(changeDescription.SessionId + " logon");
break;
case SessionChangeReason.SessionLogoff:
Debug.WriteLine(changeDescription.SessionId + " logoff");
break;
case SessionChangeReason.SessionLock:
Debug.WriteLine(changeDescription.SessionId + " lock");
break;
case SessionChangeReason.SessionUnlock:
Debug.WriteLine(changeDescription.SessionId + " unlock");
break;
}
base.OnSessionChange(changeDescription);
}
}
}
呼叫RegisterServiceCtrlHandlerEx
在您服务,您HandlerEx
回调然后将收到SERVICE_CONTROL_SESSIONCHANGE
通知,并可以跟踪WTS_SESSION_LOCK
和WTS_SESSION_UNLOCK
事件。
WTSQuerySessionInformation(.., WTSSessionInfoEx, ...)
可以为您提供特定会话的状态(WTSINFOEX_LEVEL1。SessionFlags)。
正如我在OP中提到的,我宁愿不看事件,只看当前状态。 我会研究WTSQuerySessionInformation,并回复给你,虽然听起来很有希望:) – Nathan
事件是专为在服务中使用而设计的,并且易于实现,所以我不明白为什么你不能使用它。 – Anders
我可以得到WTSQuerySessionInformation工作正常,但它没有给我什么我需要没有WTSSessionInfoEx - 这是更麻烦。我只能在C++中找到我没有经验的例子。我发现有人试图将其转换为C#的帖子:https://*.com/a/36596656/5992820 ...但我无法让他的代码工作。我不是一个非常强大的程序员,所以我可能在这里头痛不已。 我可能不得不重新使用这些事件。 – Nathan
我曾经有过一些工作,我不得不从服务启动桌面上的应用程序。为此,我必须在系统托盘中创建一个图标才能获得对桌面的权限。也许如果你设置了一个系统尝试图标应用程序在启动时运行,你可以与它沟通,以确定是否有人登录它(我认为这是一个单一登录情况)。 – juharr
这是一个单一的迹象,是的。我大概可以确定是否有人以这种方式签名,但它不会告诉我他们是否被锁定。作为可能的部分解决方案,我会牢记它,但我真的不希望在服务之上添加一个始终运行的应用程序。我希望尽可能保持简单,因为稳定性和占地面积小是关键。它将在10-30k电脑上运行,并将为用户提供关键信息。 – Nathan
如果控制台会话在锁定时显示为“断开连接”,则可以枚举所有终端服务会话并检查它们是否都处于断开连接状态。我不知道它是否确实如此。 –