问题描述
Visual C ++ 2008
Visual C++ 2008
如何确定当前交互式用户是否位于锁定桌面(Windows键L)或关机屏幕(Vista或7)等待程序在注销期间关闭。
How to establish whether or not the currently interactive user is at either the Locked desktop (Windows-Key L) or the Shutdown Screen (Vista or 7) waiting for programs to close during log-out.
HDESK hd = OpenInputDesktop(0,false,READ_CONTROL);
HDESK hd = OpenInputDesktop(0, false, READ_CONTROL);
这对于默认桌面上的用户应用程序正常工作,但是在锁定或关闭桌面上,由于用户没有权限打开安全桌面对象的权限,因此失败并显示错误代码5。
This works fine for a user app on the Default desktop, but fails with error Code 5 when at the Locked or Shutdown desktops due to, I understand, the user not having permissions to open the secure desktop object.
从在SYSTEM帐户下运行的服务调用此命令将返回错误1(无效的函数)。我认为该服务无论如何都在错误的会话(会话0)中,并且无法确定任何其他会话的交互式桌面。
Calling this from a Service running under the SYSTEM account returns error 1 (invalid function). I believe that the Service is in any case in the wrong session (Session 0) and is unable to determine the interactive desktop for any other session.
我正在运行一个应用程序
I have an app running under the currently interactive user, and also, the system service running, so could do the code from either.
我可能应该尝试枚举所有会话,以及Window站。和台式机?
Should I perhaps attempt to enumerate all of the sessions, Window stations and desktops?
即使我只能在会话0中从SYSTEM服务调用OpenInputDesktop,如何确定当前交互的台式机呢?
Even then how do I determine the currently interactive desktop if I can only make the call to OpenInputDesktop from the SYSTEM service in session 0?
推荐答案
我认为您可以尝试以下方法:
I think you can try these methods:
-
从当前正在交互用户中运行的进程中:
使用WTSRegisterSessionNotification
注册会话更改通知。一旦注册,交互过程将获得登录/注销通知。可在此处找到更多信息:
http://msdn.microsoft.com/zh-cn/library/aa383841.aspx
http://blogs.msdn。 com / b / oldnewthing / archive / 2006/01/04 / 509194.aspx
-
来自服务(在会话0):
- 使用
GetProcessWindowStation
获取当前站的服务句柄,并将其保存为 - 使用
WTSGetActiveConsoleSessionId
获取当前交互式会话的会话ID。 - 获取
- 与
WTSQuerySessionInformation
和WTSWinStationName
信息类的当前会话ID对应的工作站名称。 - 使用
OpenWindowStation
打开此站。使用SetProcessWindowStation
将此工作站设置为您的服务进程。 - 现在,您可以使用
OpenInputDesktop
检查用户是否已登录。 - 通过调用
CloseWindowStation
关闭打开的交互式Window站。通过调用SetProcessWindowStation
并保存较早的站句柄来重置服务的原始窗口站。
- 使用
- From a process running in currently interactive user:
UseWTSRegisterSessionNotification
to register for session change notifications. Once registered, interactive process would get logon/logoff notifications. More info can be found here:
http://msdn.microsoft.com/en-us/library/aa383841.aspx
http://blogs.msdn.com/b/oldnewthing/archive/2006/01/04/509194.aspx - From a service (running in session 0):
- Use
GetProcessWindowStation
to get the current station handle of service, and save it for later use. - Use
WTSGetActiveConsoleSessionId
to get session id of current interactive session. - Get station name corresponding to current session id using
WTSQuerySessionInformation
withWTSWinStationName
info class. - Open this station using
OpenWindowStation
. Set this station to your service process usingSetProcessWindowStation
. - Now, you can use
OpenInputDesktop
to check if user has logged-in or not. - Close the opened interactive window station by calling
CloseWindowStation
. Reset the original window station of service by callingSetProcessWindowStation
with station handle saved earlier.
- Use
PS:当前, WinSta0
是Windows中唯一的交互式工作站。因此,您可以跳过 WTSGetActiveConsoleSessionId
和 WTSQuerySessionInformation
调用。
PS: Currently, "WinSta0"
is the only interactive station in Windows. So, you can skip WTSGetActiveConsoleSessionId
and WTSQuerySessionInformation
calls.
这篇关于OpenInputDesktop()确定安全/登录桌面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!