[翻译]利用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)

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

  1. 利用python获取nginx服务的ip以及流量统计信息

    #!/usr/bin/python #coding=utf8 log_file = "/usr/local/nginx/logs/access.log" with open(log ...

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

    利用未公开API获取终端会话闲置时间(Idle Time)和登入时间(Logon Time)作者:Tuuzed(土仔)   发表于:2008年3月3日23:12:38 版权声明:可以任意转载,转载时请 ...

  3. 利用百度翻译API,获取翻译结果

    利用百度翻译API,获取翻译结果 translate.py #!/usr/bin/python #-*- coding:utf-8 -*- import sys reload(sys) sys.set ...

  4. XP 终端服务组件 恢复补丁包 terminal service patch

    terminal 终端服务组件恢复包 下载地址(点击) winconnect server xp软件 下载地址(点击)

  5. Docker入门(四):服务(Services)

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  6. 1.利用consul实现k8s服务自动发现

    标题 : 1.利用consul实现k8s服务自动发现 目录 : 微服务架构设计 序号 : 1 ] } } ] } } ​ - consul自身支持ACL,但目前,Helm图表不支持其中一些功能,需要额 ...

  7. 利用卷影拷贝服务提取ntds.dit

    0x01 前言 通常情况下,即使拥有管理员权限,也无法读取域控制器中的C:\Windows\NTDS\ntds.dit文件.那么什么是ntds.dit呢? ntds.dit文件是一个数据库,用于存储A ...

  8. 利用node构建本地服务

    利用node构建本地服务 首先安装下node.js,地址为https://nodejs.org/en/,然后安装npm. node.js的中文api地址http://nodeapi.ucdok.com ...

  9. 虚拟桌面基础架构(VDI)与终端服务和传统PC对比

    VDI(Virtual Desktop Infrastructure),即虚拟桌面基础架构,正迅速成为一个热门词汇,它将颠覆企业向终端用户交付应用的游戏规则.这篇专题就是想通过VDI与两种传统技术的对 ...

随机推荐

  1. cocos2d-x游戏开发系列教程-中国象棋00-前言

    象棋描述 在说代码之前,我们先让象棋效果登场,以方便大家对代码的理解 欢迎界面 中国象棋程序,运行起来的第一个界面是一个欢迎界面,该欢迎界面在停留一秒后进入游戏界面 游戏主界面 新局:所有棋子归位,状 ...

  2. 每天4个linux命令--步骤一

     1 :Linux的诞生 Linux由芬兰赫尔辛基大学的Linus Torvalds创建 1991年10月,Linux第一个公开版 0.02版发布 1994年3月,Linux 1.0版发布 Linus ...

  3. 全陷阱破解:在Linux环境下的Jenkins中持续集成Androidproject

    本方案以 RHEL / Centos 64位Linux操作系统为例,由于这是眼下最常见的server环境. 一.安装Java SDK. 建议,不要使用诸如yum之类的玩意自己主动安装,由于openJD ...

  4. 关于Linux路由表的route命令(转)

    查看 Linux 内核路由表 使用下面的 route 命令可以查看 Linux 内核路由表. # route Destination  Gateway      Genmask          Fl ...

  5. Linux经常使用命令(十二) - less

    less 工具也是对文件或其他输出进行分页显示的工具.应该说是linux正统查看文件内容的工具.功能极其强大. less 的使用方法比起 more 更加的有弹性.使用了 less 时.更easy用来查 ...

  6. 前端project师,确定你的目标吧!无能的人才管他叫命运

    导语: 你为自己定过一个不靠谱的目标,是20年前的事了吧. 长大你想干什么?你的回答是什么?现在实现了吗? 如今,你每天都坐在同一个格子间的同一个电脑前,会不会感到每天都像是在复印,感到前途是模糊的, ...

  7. RHEL Server 6.3下MySQL5.5.25a源码安装

    OS:RHEL Server 6.3 MySQL:mysql-5.5.25a.tar.gz 相关依赖包: ncurses-5.9.tar.gz bison-2.5.tar.gz 安装MySQL 一.安 ...

  8. 施用 maven shade plugin 解决 jar 或类的多版本冲突

    施用 maven shade plugin 解决 jar 或类的多版本冲突   使用 maven shade plugin 解决 jar 或类的多版本冲突java 应用经常会碰到的依赖的三方库出现版本 ...

  9. 基于visual Studio2013解决面试题之0709求方

     题目

  10. 基于visual Studio2013解决C语言竞赛题之1094纵横图

        题目 解决代码及点评 /************************************************************************/ /* ...