当前位置: 首页 > news >正文

[翻译]利用C#获取终端服务(Terminal Services)会话的闲置时间

[翻译]利用C#获取终端服务(Terminal Services)会话的闲置时间

作者:Tuuzed(土仔)   发表于:2008年2月29日
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。
http://www.cppblog.com/tuuzed/archive/2008/02/29/43424.html

 


 
原著:Guy Teverovsky 
翻译:土仔Tuuzed
原文出处:Querying TS session idle time with C#
原文URL:http://blogs.microsoft.co.il/blogs/guyt/archive/2007/10/06/querying-ts-session-idle-time-with-c.aspx
本文特别声明:原文版权归原作者Guy Teverovsky所有,本译文可以任意转载, 转载时请务必以超链接形式标明原文出处、译文出处、译者及本声明。

        这一开始就是一个挑战。我的同事正在编写一个程序,用来获取远程计算机终端服务会话的闲置时间。刚开始,我们想到的是利用WMI(译注WMI:Windows Management Instrumentation管理规范),但是那里没有有价值的信息,因此我们开始在Win32 API(译注API:Application Programming Interface应用程序接口)里查找。首先,“Terminal Services API”字样令我们觉得有希望,同时里面的WTSQuerySessionInformation函数也引起了我的注意,可是,接下来对WTS_INFO_CLASS枚举类型的注释不得不使得我们又要回到Google中了:

 

        后来,我找到一个看似有些意思的API函数:WinStationQueryInformationW. 可是这个函数有些问题:

        1. 这是一个内部函数,它在Winsta.dll内部实现,不像其他已公开的WTS API函数是在wtsapi32.dll内部;
        2. 该函数的返回值(一个结构):WINSTATIONQUERYINFORMATIONW,该结构的代码在MSDN上没有任何资料;
        3. MSDN上的资料说,查询的句柄(handle)通常只能是SERVERNAME_CURRENT。这就意味着你不能查询远程的终端服务器(尽管如此,通过用depends.exe(译注:Visual Studio自带的工具)查看终端服务管理器(Terminal Services Manager)的EXE文件,该管理器也大量地在使用这个函数)。

       我决定试一试,看能否解决以上的问题:

       1. “这是一个内部函数”——嗯……没办法,已经没有其他方法能够得到我想要的信息了,这是唯一的选择。
       2. “WINSTATIONQUERYINFORMATIONW结构的代码没有公开”——这是最棘手的问题。看了它在Platform SDK的winternl.h文件中的定义后,我相当失望:


            显然,这是不够的……我设法找到了这部分结构的C++代码,转用C#定义如下:


       3. “MSDN上的资料说,我们只能在本地机器上使用这个函数”——但是这里隐含了些线索……这个函数与WTS API记载在了一起,而且你可以通过一个函数获得终端服务(TS)的句柄(handle):WTSOpenServer。所以,接下来我要做的就是利用WTSOpenServer()函数获取远程终端服务的句柄(handle),然后利用WinStationQueryInformationW()函数得到我想要的信息。

 

      把上面的做一个总述

      需要的结构(structures)/枚举类型(enums):

 


        DLL文件导入(DLLImports):

 

 


         我们将得到通俗易懂的信息:

 

 


        将难处理的FILETIME类型转为DateTime类型:

 

 


       有用的代码:

 

 


        只需简单地调用WTSQuerySessionInfo("servername", <Session ID>)就行了。

 

       总结:

       就如大家看到的一样,在所有步骤完成后,我们还是没有得到我们想要的“会话闲置时间(Session Idle Time)”。其实,根据下面的简单规则就能很容易地把它计算出来:

※ 如果会话是断开(disconnected)状态,闲置时间=当前时间-断开时间(Idle Time = CurrentTime - DisconnectTime)
※ 如果会话是活动的(alive)状态,闲置时间=当前时间-最后输入时间(Idle Time = CurrentTime - LastInputTime)

相关文章:

  • 让Windwos Server 2008 R2 SP1的FTP真正能访问
  • 20天android学习
  • 库函数实现之字符串拷贝
  • Xqk.Data数据框架使用说明之:如何自定义数据表名
  • 优化SqlServer--数据压缩
  • devexpress chart 柱形图
  • 我的电脑搜索这个功能不能打开
  • VS2010性能监视工具
  • Silverlight和WPF开发人员必须具备以下十大开发技能
  • 满足需求为第一位
  • 窗体信息处理函数讲解
  • 易宝典文章——如何配置Windows Live Mail使用连接Exchange邮箱
  • 关于 UIImageView
  • [原创]什么是信息安全资产管理?
  • http 状态代码表
  • @angular/forms 源码解析之双向绑定
  • 《深入 React 技术栈》
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Android交互
  • HashMap剖析之内部结构
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Rancher如何对接Ceph-RBD块存储
  • 服务器之间,相同帐号,实现免密钥登录
  • 聊聊directory traversal attack
  • 深入浏览器事件循环的本质
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 用Canvas画一棵二叉树
  • PostgreSQL之连接数修改
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (10)ATF MMU转换表
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2)(2.10) LTM telemetry
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (day 12)JavaScript学习笔记(数组3)
  • (ZT)一个美国文科博士的YardLife
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)JAVA使用POI操作excel
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (图)IntelliTrace Tools 跟踪云端程序
  • (五)Python 垃圾回收机制
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)Android学习笔记 --- android任务栈和启动模式
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • ******之网络***——物理***
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 发展历程
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 中创建支持集合初始化器的类型
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .Net的C#语言取月份数值对应的MonthName值
  • .net和php怎么连接,php和apache之间如何连接