如何判断当前显示登录屏幕?
Posted
技术标签:
【中文标题】如何判断当前显示登录屏幕?【英文标题】:How to tell that the logon screen is currently displayed? 【发布时间】:2014-04-18 05:19:45 【问题描述】:我正在编写一个使用local system
凭据运行的服务应用程序。如果在任何特定时间显示 Windows 登录屏幕,我需要通过我的服务了解。有没有办法做到这一点?
PS。通过锁定工作站可以调出的屏幕:
或者通过尝试切换用户:
或者在 Ctrl+Alt+Del 之后:
PS。我需要它才能在 Windows XP 及更高版本上运行。
编辑: 到目前为止,我想出的唯一可行的解决方案是查看 LogonUI.exe
进程是否正在运行。这种方法的问题是如何区分实际的系统登录进程和具有该图像名称的任何其他进程?
【问题讨论】:
你为什么想知道这个 @DavidHeffernan:这样我的用户模式进程就不必费心显示用户消息,因为用户不会看到它们。 @c00000fd:您的服务不应该显示消息。传统的解决方案是一个与您的服务对话的小应用程序;该应用程序可以轻松确定它是否可见。 @MSalters:您想告诉我您的应用如何确定它是否可见? PS。顺便说一句,我并不是说我正在显示来自服务的消息。IsWindowVisible(HWND)
【参考方案1】:
如 cmets 中所述,您正在尝试检测交互式桌面会话中的进程是否应显示消息框。如果交互式会话不活动,那么这样做是没有意义的。
在这种情况下,我认为您提出的解决方案是错误的。相反,您应该通过调用WTSRegisterSessionNotification
注册会话更改通知。当您执行此操作时,您将收到WM_WTSSESSION_CHANGE
消息,允许您跟踪当前状态。
请注意,您在桌面应用程序而不是服务中执行此操作。该服务仍将其消息发送到桌面应用程序。但是桌面应用程序现在知道是否值得展示它们。
更新
Remy 在 cmets 中提出了一种更好的方法:
如果正在使用单独的应用程序,则根本没有理由检测会话更改,该应用程序可以简单地检查其当前分配的工作站/桌面是否是当前交互式工作站/桌面,比较
GetThreadDesktop()
和 @例如 987654324@。
【讨论】:
是否会针对 Ctrl+Alt+Del 窗口或锁定屏幕(当用户锁定工作站时)发送这些通知? 是的,他们会的。阅读消息的文档。它列出了所有事件。 我一定没看到,但是 Ctrl+Alt+Del 通知在哪里? 不确定。试试看,看看你会收到什么。 @DavidHeffernan:服务可以使用MessageBox(MB_SERVICE_NOTIFICATION)
和/或WTSSendMessage()
向用户显示消息,而完全不涉及单独的应用程序。如果正在使用单独的应用程序,则根本没有理由检测会话更改,该应用程序可以简单地检查其当前分配的工作站/桌面是否是当前交互式工作站/桌面,比较GetThreadDesktop()
和OpenInputDesktop()
,例如。【参考方案2】:
所有此类屏幕都显示在单独的桌面上。您可以尝试enumerate 用户的桌面并将其与当前桌面进行比较(我不确定会话 0 - Vista 及更高版本中的服务是否可以做到这一点;如果没有,请在用户会话中生成一个帮助进程)。但是,如果 UAC 桌面已启动,这可能会产生误报。另一个极端情况是无用户情况(在启动后任何用户登录之前)。
【讨论】:
EnumDesktops
不会在会话中枚举它们,所以它不起作用。
@c00000fd:在某些时候,您将不得不接受您的某些代码必须在用户会话中运行。您不能总是直接从服务流程中完成所有操作。启动一个单独的进程并使用 IPC 很尴尬,但有时是必要的。【参考方案3】:
窗口中有几种状态。
-
注销状态
当 Winlogon 处于注销状态时,系统会提示用户进行身份验证并提供身份验证信息。如果用户提供了正确的用户帐户信息并且没有任何限制阻止它,则用户登录并在应用程序桌面中执行外壳程序(例如 Windows Explorer)。 Winlogon 更改为已登录状态。
-
登录状态
当 Winlogon 处于登录状态时,用户可以与 shell 交互、激活其他应用程序并完成他们的工作。从登录状态,用户可以停止所有工作并注销,或锁定他们的工作站(保留所有工作)。如果用户决定注销,Winlogon 将终止与该登录会话关联的所有进程,并且工作站将可供其他用户使用。相反,如果用户决定锁定工作站,Winlogon 将更改为工作站锁定状态。
-
工作站锁定状态
当 Winlogon 处于工作站锁定状态时,会显示一个安全桌面,直到用户通过提供与最初登录的用户相同的标识和身份验证信息来解锁工作站,或者直到管理员强制注销。如果工作站已解锁,则会显示应用程序桌面,并且可以继续工作。
参考:https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa380547(v=vs.85).aspx
附言注册安全注意序列(SAS,CTRL+ALT+Delete)包含在 Workstation-Locked 状态中
同样,Windows 上也有多种桌面类型。
Winlogon 桌面
应用程序桌面(=默认桌面)
屏保桌面
安全桌面
我建议您阅读以下内容: https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa375994(v=vs.85).aspx
我不知道我的答案是你想要的……但我希望它在某些方面有所帮助。
【讨论】:
以上是关于如何判断当前显示登录屏幕?的主要内容,如果未能解决你的问题,请参考以下文章