[翻译]利用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. 基于visual Studio2013解决C语言竞赛题之0805成绩输出

     题目

  2. gitflow 在windows下的安装方法

    Git flow是git的一个扩展集,它基于Vincent Driessen的分支模型,可以用来简化代码的版本发布流程. 本文讲述如何为msysgit安装git flow. 下载getopt.exe ...

  3. Fix Windows 7 Msvcp71.dll And Msvcr71.dll Missing Error

    Fix Windows 7 Msvcp71.dll And Msvcr71.dll Missing Error Fix Msvcp71.dll And Msvcr71.dll Missing Erro ...

  4. XLSTransformer生成excel文件简单演示样例

    项目结构图: 项目中所用到的jar,能够到http://www.findjar.com/index.x下载 ExcelUtil类源代码: package util; import java.io.IO ...

  5. Swift - 给图片添加滤镜效果(棕褐色老照片滤镜,黑白滤镜)

    Core Image是一个强大的滤镜处理框架.它除了可以直接给图片添加各种内置滤镜,还能精确地修改鲜艳程度, 色泽, 曝光等,下面通过两个样例演示如何给UIImage添加滤镜. 1,棕褐色滤镜  -  ...

  6. bash on windows

    bash on windows 今年微软Build 2016大会最让开发人员兴奋的消息之一,就是在Windows上可以原生运行Linux bash,对开发人员来说,这是一个喜闻乐见的消息. 1 安装 ...

  7. 四个流行的Java连接池之Proxool篇

    Proxool是一个JavaSQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装.可以非常简单的移植到现存的代码中.完全可配置.快速,成熟,健壮.可以透明地为你现存的JDBC驱 ...

  8. JVM类加载过程学习总结

    JVM类加载过程学习总结 先不说JVM类加载的原理,先看实例: NormalTest类,包含了一个静态代码块,执行的任务就是打印一句话. /** * 在正常类加载条件下,看静态代码块是否会执行 * @ ...

  9. JSP简单练习-使用JDOM创建xml文件

    注意:在编写代码前,请确保该Web文件夹下的"WEB-INF/lib"下包括jdom.jar包! <%@ page language="java" con ...

  10. iOS开发- 查询项目代码行数

    ...事实上, 这功能也没什么用. 就是查询一个项目总的代码行数. 玩玩倒是能够. 方法: 在终端以下依次输入: cd 项目文件 find . "(" -name "*. ...