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 Server下查看当前登录用户命令

原文地址:http://blog.csdn.net/starshine/article/details/7441201  对于开通了远程桌面和终端服务的Windows服务器来说,特别是在通过...

将程序设置为服务,在系统登录界面自动启动(解决:不间断运行的程序遇到电脑重启,且电脑登录需要账号和密码)

============================================== 查看电脑是否自动重启 ==========================================...

[Windows][VC]开机自动启动程序的几种方法

【原文:http://www.cnblogs.com/upendi/archive/2012/07/04/sina-20110619.html】 很多监控软件要求软件能够在系统重新启动后不用...

监控Windows 域用户登陆情况 python

首先要想让域用户的登陆情况反馈到DC,要在组策略里开启下面两个,其实只监控用户的话选第二个就够了。   这个脚本起初是想通过powershell实现的,但是对powershell不是很熟悉,写起来...

使用windows服务和.NET FileSystemWatcher对象来监控磁盘文件目录的改变

关于FileSystemWatcher 类的详细说明,大家可以去找找CSDN,或者在百度Google上搜下。 至于使用windows服务和.NET FileSystemWatcher对象来监控磁盘文件...

Windows Azure功能更新:网站服务支持过渡环境,支持异步任务,监控改进等

本月是圣诞后的第一个月,Windows Azure国际版的新功能发布终于继续了。本次发布的重点是网站服务。网站服务是Windows Azure上重要的PaaS服务,个人认为它也是未来Windows A...

C++实现Windows下的Daemon,监控多个进程

在windows下,可以用简单的bat实现守护进程的功能,如果dump掉就重新拉起来,百度下就能查到,举个例子: @echo off ::检测时间间隔,单位:秒 set _interval=5 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:windows 用户登录和注销监控|windows session 状态改变监控
举报原因:
原因补充:

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