利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)
利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)
作者:Tuuzed(土仔) 发表于:2008年3月3日23:12:38
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。
http://www.cppblog.com/tuuzed/archive/2008/03/03/43631.html
可能很多人都知道NT系统的query user命令,命令返回“使用者名称 工作阶段名称 识别码 状态 闲置时间 登入时间”。如图:
微软给出了获取终端会话的重要API(见Terminal Services API Functions),与获取当前终端会话功能有关的API有:WTSEnumerateSessions,WTSQuerySessionInformation。
WTSEnumerateSessions:顾名思义就是列出所有的Session,返回一个WTS_SESSION_INFO结构,结构存储了SessionId,WinStationName,State(包括Active、Disconnected等状态)。
WTSQuerySessionInformation:这个和上面的API有些不同,它只能通过SessionId来查询Session的详细信息,可获取例如用于连接终端客户端工具的ClientName、ClientDirectory等,比WTSEnumerateSessions功能丰富。
按照MSDN上说的,WTSQuerySessionInformation还可以获取IdleTime、LogonTime、IncomingBytes、OutgoingBytes等信息,可惜,标明是“This value is not used.”,要使用的话必须在Windows Server 2008和Windows Vista SP1下使用,局限性太大了。只好自己上Goolge上搜索一下了,在国外的论坛中,大部分人对于获取Idle Time都是说在WIN2008或VISTA才支持。那么WIN2000、2003里的query命令是怎么获得登入时间的?这里面肯定有什么没有公开的API在里面!果然,我找到了Guy Teverovsky的BLOG,它给出的答案(《Querying TS session idle time with C#》译文:《[翻译]利用C#获取终端服务(Terminal Services)会话的闲置时间》)和我预想的差不错——所要的信息在在Winsta.dll内的一个未公开API函数WinStationQueryInformationW返回的结构WINSTATIONQUERYINFORMATIONW里面。
要想使用WinStationQueryInformationW必须知道其中两个重要的参数WinStationInformation(枚举类型)值和WINSTATIONINFORMATIONW结构内容。在VS2005对上述两个值有定义(winternl.h):








第一个值很清楚了,是8。而后一个结构,保留位达1140位,这里有太多未知的信息了。还好那位牛人给出了C#的定义,我把它转成C++的结构定义:












定义完这个结构,工作已经有眉目了。下面就是载入Winsta.dll内那个未公开的API函数,顺便包装了一下:
























这样,只要直接调用自己的WinStationQueryInformation来间接调用DLL里面的WinStationQueryInformationW就可以了。登入时间Logon Time是可以直接获取的,而闲置时间的获取就要参考当前会话的状态了:如果会话是断开(Disconnected)状态,闲置时间=当前时间-断开时间(Idle Time = CurrentTime - DisconnectTime);如果会话是活动的(alive)状态,闲置时间=当前时间-最后输入时间(Idle Time = CurrentTime - LastInputTime)。
已经做出来了一个DEMO,看截图:

这是我做的一个ROOKIT工具的截图,其中就包括有对终端会话的管理等。在这次编程后,给我感触最深的就是国外大虾解决问题的方法与国内的我们有很大的不同,他们善于从多角度来解决问题,独自解决问题后再总结,是利用网络资源而不是依赖网络资源。
利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)的更多相关文章
- CListCtrlEx:一个支持文件拖放和实时监视的列表控件——用未公开API函数实现Shell实时监视
一.需求无论何时,当你在Explorer窗口中创建.删除或重命名一个文件夹/文件,或者插入拔除移动存储器时,Windows总是能非常快速地更新它所有的视图.有时候我们的程序中也需要这样的功能,以便当用 ...
- 利用KEGG的API获取基因对应的pathway 信息
KEGG 官网提供了API, 可以方便的访问KEGG 数据库中的内容,链接如下: http://www.kegg.jp/kegg/rest/keggapi.html 利用API可以得到某一个基因参与的 ...
- 软件看门狗--别让你地程序无响应(使用未公开API函数IsHungAppWindow,知识点较全)
正文一.概述一些重要的程序,必须让它一直跑着:而且还要时时关心它的状态——不能让它出现死锁现象.当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误.我们首要做的事是,把这个Bug揪出来.但如果 ...
- 利用百度词典API和Volley网络库开发的android词典应用
关于百度词典API的说明,地址在这里:百度词典API介绍 关于android网络库Volley的介绍说明,地址在这里:Android网络通信库Volley 首先我们看下大体的界面布局!
- QQ登入(5)获取空间相册,新建相册,上传图片到空间相册
///////////////////////////////////////////////////////////////////// 获取相册列表:必须先授权登入 1.1. String mA ...
- [翻译]利用C#获取终端服务(Terminal Services)会话的闲置时间
[翻译]利用C#获取终端服务(Terminal Services)会话的闲置时间 作者:Tuuzed(土仔) 发表于:2008年2月29日版权声明:可以任意转载,转载时请务必以超链接形式标明文章原 ...
- 利用腾讯企业邮箱开放API获取账户未读邮件数初探
公司一直使用腾讯提供的免费企业邮箱服务,今天用管理员帐户登录后发现,原来现在腾讯的企业邮箱也开放了部分API 你可以通过开放接口实现以下功能: 数据同步 数据同步可以帮助你同步部门成员信息,你还可以创 ...
- 劳动节脑洞大开!利用Debug API 获取 加壳客户端的MD5值
系统 : Windows xp 程序 : 某游戏客户端 程序下载地址 :不提供 要求 : 远程注入 & 获取MD5值 使用工具 : vc++6.0 & OD 案例说明: 该游戏客户端对 ...
- 利用百度地图API,获取经纬度坐标
利用百度地图API,获取经纬度坐标 代码很简单,但在网上没找到现成的获取地图经纬度的页面. 就是想,给当前页面传递一个经纬度,自动定位到此经纬度.然后可以重新选择,选择完返回经纬度. 效果如下: 源代 ...
随机推荐
- 设计模式(二)单件模式Singleton(创建型)
SINGLETON(单件)—对象创建型模式 几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序中共享数据库句柄,因为在保持连接打开或关 ...
- 怎样建立一个bower私库
本教程适用于centos 安装之前 检查nodejs 假设没安装nodejs依照下面步骤安装 $ su - $ yum install openssl-devel $ cd /usr/local/sr ...
- PHP - 点击更换头像
原理: 操作流程: 首先点击头像图片,弹出选择窗口,选中其中一个则窗口推出头像更换. 效果: 主页面代码: <tr> <td>头像:</td> <td> ...
- 手把手教你安装QT集成开发环境(操作系统为ubuntu10.04)
在安装QT集成开发工具包之前需要先安装build-essential和libncurses5-dev这两个开发工具和库,libncurses5-dev库是一个在Linux/Unix下广泛应用的图形函数 ...
- Javascript 生成指定范围数值随机数
JavaScript对随机数的介绍比较少,所以今天分享一下有关随机数的一些事儿.希望能对大家有点小帮助. 主要的公式就是parseInt(Math.random()*(上限-下限+1)+下限); Ma ...
- android ble蓝牙开发略解
Android 蓝牙4.0开发 1. 权限和相关属性 “android:required="true"表示apk只有在具有bluetooth_le属性的系统里运行,这个4.3之前 ...
- Winform - TreeView控件,只展开根目录
TreeNode类型是有Expand和ExpandAll这两个方法.而Treeview是只有ExpandAll的,想要展开根目录下面的节点的话 //只展开根目录 ) ].Expand();
- Makefile自动生成工具-----autotools的使用(详细)
相信每个学习Linux的人都知道Makefile,这是一个很有用的东西,但是编写它是比较复杂,今天介绍一个它的自动生成工具,autotools的使用.很多GNULinux的的软件都是用它生成Makef ...
- Android Folding View(折叠视图、控件)
版本号:1.0 日期:2014.4.21 版权:© 2014 kince 转载注明出处 非常早之前看过有人求助以下这个效果是怎样实现的, 也就是側滑菜单的一个折叠效果,事实上关于这个效果的实现,谷 ...
- GNOME界面简单使用
GNOME界面 CentOS下的文件夹打开方式,默认是打开一个文件夹就重新的打开一个窗口,并不是在原有的文件夹中显示要打开文件夹的内容. 怎么修改: 打开任意一个文件夹. Edit --> pr ...