开发者社区> 杰克.陈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)

简介: 利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)作者:Tuuzed(土仔)   发表于:2008年3月3日23:12:38 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。
+关注继续查看

利用未公开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命令,命令返回“使用者名称 工作阶段名称 识别码 状态 闲置时间 登入时间”。如图:

TS0

    微软给出了获取终端会话的重要API(见Terminal Services API Functions),与获取当前终端会话功能有关的API有:WTSEnumerateSessionsWTSQuerySessionInformation

        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):

 

typedef enum _WINSTATIONINFOCLASS {
    WinStationInformation = 8
} WINSTATIONINFOCLASS; 

 

typedef struct _WINSTATIONINFORMATIONW {
    BYTE Reserved2[70];
    ULONG LogonId;
    BYTE Reserved3[1140];
} WINSTATIONINFORMATIONW, * PWINSTATIONINFORMATIONW; 

 

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

typedef struct _WINSTATIONQUERYINFORMATION
{
    char Reserved1[72];
    unsigned int SessionId;
    char Reserved2[4];
    FILETIME ConnectTime;
    FILETIME DisconnectTime;
    FILETIME LastInputTime;
    FILETIME LogonTime;
    char Reserved3[1096];
    FILETIME CurrentTime;
} WINSTATIONQUERYINFORMATION, *PWINSTATIONQUERYINFORMATION; 

 

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

BOOL WINAPI WinStationQueryInformation(HANDLE hServer, DWORD SessionId, DWORD InfoClass, LPVOID Buffer, DWORD BufferLength, LPDWORD Count)
{
    typedef BOOL (WINAPI *PROCPTR)(HANDLE, DWORD, DWORD, LPVOID, DWORD, LPDWORD);
    static HMODULE hModule = NULL;
    static PROCPTR proc = NULL;
    hModule = LoadLibrary("winsta.dll");
    if (hModule == NULL)
    {
        return FALSE;
    } 

    if (proc == NULL)
    {
        proc = (PROCPTR) GetProcAddress(hModule, "WinStationQueryInformationW");
    } 

    if (proc == NULL)
    {
        return FALSE;
    } 

    return proc(hServer, SessionId, InfoClass, Buffer, BufferLength, Count);

 

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

    已经做出来了一个DEMO,看截图:

 

TS1

    这是我做的一个ROOKIT工具的截图,其中就包括有对终端会话的管理等。在这次编程后,给我感触最深的就是国外大虾解决问题的方法与国内的我们有很大的不同,他们善于从多角度来解决问题,独自解决问题后再总结,是利用网络资源而不是依赖网络资源。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java Web之Struts2访问Servlet API
方法一:直接获取 Map类型 Map request = (Map)Actioncontext.getContext().get("request"); Map session = ActionContext.getContext.getSession(); Map application = ActionContext.getContext.getApplication(); 比如使用:request.put("name",name); 可以在Jsp页面获取 说明:为struts2的标签。
794 0
《ASP.NET5》无法路由到Web API Controller控制器
这个标题不知道恰当不恰当,具体的问题就是我在一个现有的项目上创建了一个Web API Controller Class,但是按F5启动调试后,通过给定的路径如“http://localhost:3753/api/values/5”访问Get(int id)方法时,没有反应,设置了断点也进不去。
770 0
Asp.Net Web API 2第十一课——在Web API中使用Dependency Resolver
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文主要来介绍在Asp.Net Web API使用Web API的Decpendency Resolver在控制器中如何注入依赖。
746 0
Asp.Net Web API 2第十课——使用OWIN自承载Web API
详情请查看http://aehyok.com/Blog/Detail/71.html   个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:http://www.cnblogs.com/aehyok/p/3946286.html 感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,那不妨点个推荐吧,谢谢支持:-O。
667 0
Asp.Net Web API 2第八课——Web API 2中的属性路由
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html   路由就是Web API如何把URI匹配到一个Action的描述。
645 0
Asp.Net Web API 2第九课——自承载Web API
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html Asp.Net Web API可以需要IIS。
828 0
Asp.Net Web API 2第七课——Web API异常处理
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文主要来讲解Asp.Net Web API中错误和异常的处理,包括以下几点:   1.
856 0
Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]
详情请查看http://aehyok.com/Blog/Detail/67.html   个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:http://www.cnblogs.com/aehyok/p/3946286.html 感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,那不妨点个推荐吧,谢谢支持:-O。
649 0
Asp.Net Web API 2第六课——Web API路由和动作选择
Asp.Net Web API 导航       Asp.Net Web API第一课——入门http://www.cnblogs.com/aehyok/p/3432158.html       Asp.
717 0
Asp.Net Web API 2第五课——Web API路由
Asp.Net Web API 导航     Asp.Net Web API第一课——入门 http://www.cnblogs.com/aehyok/p/3432158.html       Asp.
810 0
+关注
杰克.陈
一个安静的程序猿~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
数据资源的基础设施API总线
立即下载
Time Series Analysis
立即下载
重保场景及API安全指南
立即下载