博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[翻译]利用C#获取终端服务(Terminal Services)会话的闲置时间
阅读量:6508 次
发布时间:2019-06-24

本文共 1634 字,大约阅读时间需要 5 分钟。

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

作者:()   发表于:2008年2月29日
:可以任意转载,转载时请务必以超链接形式标明文章原始出处和信息及。

 


 

原著:Guy Teverovsky 
翻译:土仔Tuuzed
原文出处:原文URL:
本文特别声明:原文版权归原作者Guy Teverovsky所有,本译文可以任意转载, 转载时请务必以超链接形式标明原文出处、译文出处、译者及本声明。
        这一开始就是一个挑战。我的同事正在编写一个程序,用来获取远程计算机终端服务会话的闲置时间。刚开始,我们想到的是利用WMI(译注WMI:Windows Management Instrumentation管理规范),但是那里没有有价值的信息,因此我们开始在Win32 API(译注API:Application Programming Interface应用程序接口)里查找。首先,“”字样令我们觉得有希望,同时里面的函数也引起了我的注意,可是,接下来对枚举类型的注释不得不使得我们又要回到Google中了:

 

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

        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)

你可能感兴趣的文章
Android深度探索读后感 第四章
查看>>
软件名称集合
查看>>
方向导数的计算与梯度
查看>>
软件测试
查看>>
Unity3D插件分享
查看>>
尝试写第一个js插件 图片轮播
查看>>
springboot集成swagger
查看>>
实验吧_加了料的报错注入
查看>>
CF1063F String Journey
查看>>
2019-05-21 SQL学习
查看>>
ios图片适配问题
查看>>
牛客网-约数的个数
查看>>
读书笔记二
查看>>
《软件需求十步走》阅读笔记4
查看>>
第1章 shell编程概述
查看>>
ServletContext中常用方法(getRsource和getResourceAsStream)
查看>>
打印mac地址
查看>>
信号 signal sigaction补充
查看>>
机器学习如何选择模型 & 机器学习与数据挖掘区别 & 深度学习科普
查看>>
OC--内存管理总结
查看>>