windows 用户登录和注销监控|windows session 状态改变监控

转载 2016年05月31日 10:18:50

不知道大家注意到没有,Windows XP新增加了一个快速切换用户的功能。它可以让您在不注销的情况下在用户之间进行切换,而且每个用户有自己独立的配置文件和桌面。也就是说当您切换到另外 一个用户(即用另外一个账号登陆)时,以前的那个用户运行的所有程序都还是在运行的,并没有退出来。这就给我们的开发带来了新的问题。比如您的应用程序提 供的功能在多个用户同时运行时发生错误,您必须为应用程序添加代码以检测该情形并作出相应的反应。

  1、检测是否有用户正在运行该应用程序

   我们平时都使用互斥体的方法来实现只有一个实例运行,而且在使用CreateMutex()生成互斥体是使用默认的方式,即互斥体的作用范围不是全局 的,只能在一个Session里起作用,而对于切换用户下存在多个Session是不起作用的,因而也就检测不到已经在运行的实例。解决的方法很简单,在 使用CreateMutex()时,在互斥体的名字前加上"Global"关键字即可。

  m_hMutexAppRunning = CreateMutex(NULL, FALSE, "Global\\EsXPSwitchUserApp");

   2、监测用户现在是否在切换用户有的时候,我们需要检测用户做切换用户操作的这个行为,以便让我们的程序能够做出相应的处理

例如,我们需要在结束活动 用户会话运行状态时释放某些资源,而在其再次进入活动会话状态时重新获得该资源。还好Microsoft提供了让我们的程序接收会话通知消息的方法。我们 可以通过调用WTSRegisterSessionNotification 函数进行注册以接收WM_WTSSESSION_CHANGE 消息。

  这些消息主要有:

  WTS_CONSOLE_CONNECT

  WTS_CONSOLE_DISCONNECT

  WTS_REMOTE_CONNECT

  WTS_REMOTE_DISCONNECT

  WTS_SESSION_LOGON

  WTS_SESSION_LOGOFF

  WTS_SESSION_LOCK

  WTS_SESSION_UNLOCK

  在wParam中包含了这些消息类型,而lParam包含的是发生变化的Session的SessionID.

switch(message)
{
case WM_WTSSESSION_CHANGE:
{
switch(wParam)
{
case WTS_CONSOLE_CONNECT:
MessageBox("WTS_CONSOLE_CONNECT", "Esmile", MB_OK );
break;
case WTS_CONSOLE_DISCONNECT:
MessageBox("WTS_CONSOLE_DISCONNECT",
"Esmile", MB_OK );
break;
case WTS_SESSION_LOCK:
MessageBox("WTS_SESSION_LOCK",
"Esmile", MB_OK );
break;
case WTS_SESSION_UNLOCK:
MessageBox("WTS_SESSION_UNLOCK",
"Esmile", MB_OK );
break;
case WTS_SESSION_LOGOFF:
MessageBox("WTS_SESSION_LOGOFF",
"Esmile", MB_OK );
break;
case WTS_SESSION_LOGON:
MessageBox("WTS_SESSION_LOGON",
"Esmile", MB_OK );
break;
default:
break;
}
}
break;
default:
break;
}

  这样,我们就可以处理我们感兴趣的消息了,从而达到我们的目的.

  3、注意事项

  每一个对 WTSRegisterSessionNotification 的调用应与一个对 WTSUnRegisterSessionNotification 的调用匹配,

  即在程序退出时要释放这个通知注册信息

  WTSRegisterSessionNotification 和 WTSUnRegisterSessionNotification 需要头文件Wtsapi32.h以及

  Wtsapi32.lib。另外在包含 windows.h 的语句之前添加以下 #define 语句

  #define _WIN32_WINNT 0x0501

  文章附带的源代码在win2000pro下编译通过,程序只能在Window XP下运行,因为非XP系统没有WTSAPI32.dll。

windows中的会话概念的总结

转载请标明是引用于 http://blog.csdn.net/chenyujing1234  欢迎大家拍砖! 一、 参考: http://blog.csdn.net/zacklin/arti...
  • chenyujing1234
  • chenyujing1234
  • 2012年09月30日 23:39
  • 7376

windows下的session隔离机制以及带来的影响

备存
  • u013694670
  • u013694670
  • 2016年11月10日 09:21
  • 327

windows session机制深入解析

windows session机制深入解析 英文原文移步这里查看http://www.cppblog.com/dawnbreak/articles/90278.html转载请注明出处http:...
  • qinlicang
  • qinlicang
  • 2009年07月17日 13:45
  • 3039

windows编程的偏门概念: 会话(Session), 窗口站(Window Station), 桌面

想实现向linux那样的多个虚拟桌面么?想知道让服务程序显示界面么?那么就认证看一下下面的说明吧。 1. 远程桌面会话 当一个用户登录到一个开启了远程桌面的机器时,便会开始一个该用户的会话...
  • zxy355
  • zxy355
  • 2016年03月03日 17:22
  • 841

关于win7的session0隔离的总结

微软做这个session隔离的原因我就不追查了,反正让人有蛋蛋的忧伤。       在vista以前的系统,后台服务和当前用户进程都运行在同一个session中(本地系统登录时的第一个session...
  • eagleatustb
  • eagleatustb
  • 2013年12月06日 15:45
  • 2411

MFC应用程序 变身成 windows服务程序

非常简单实现MFC应用程序到windows服务程序的转变,简单的就一句话“奥特曼变身”...
  • wangcg123
  • wangcg123
  • 2016年11月09日 11:20
  • 1135

简单理解SESSION

网上对SESSION的介绍很多,但其描述往往偏重于某个角度,以至于像我这样的菜鸟对SESSION的理解如盲人摸象一般,始终朦朦胧胧。“SESSION”到低是个什么?经过学习,本人对SESSION终于有...
  • Win32FanEx
  • Win32FanEx
  • 2017年11月07日 17:31
  • 81

Win32下session和window station以及desktop一些介绍和应用

//********************************************************************************************** ht...
  • sae_kurosawa
  • sae_kurosawa
  • 2016年07月21日 19:46
  • 172

进程外Session | 状态服务器Session 和 数据库Session的设置

1 首先开启一个ASP.NET 状态设置的服务 即:在 “我的电脑” 鼠标右键--->管理--->服务和应用程序----> 服务--->ASP.NET状态服务(或者ASP.NET State Serv...
  • Fanbin168
  • Fanbin168
  • 2015年10月18日 15:22
  • 2757

关于C#服务里面的OnSessionChange

此文档假设你已会C和C#的服务编程了。以前我在写服务程序的时候,SCM有一个很酷的功能,能接收WinLogon的Notify消息。具体操作是,设置服务状态的时候,把SERVICE_STATUS结构体变...
  • Linux7985
  • Linux7985
  • 2010年06月25日 16:54
  • 1991
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:windows 用户登录和注销监控|windows session 状态改变监控
举报原因:
原因补充:

(最多只允许输入30个字)