• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            悲情土仔一生

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              14 隨筆 :: 0 文章 :: 74 評論 :: 0 Trackbacks

            [翻譯]利用C#獲取終端服務(Terminal Services)會話的閑置時間

            作者:Tuuzed(土仔)   發表于:2008年2月29日
            版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明
            http://www.shnenglu.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)


            posted on 2008-02-29 01:07 土仔 閱讀(4328) 評論(2)  編輯 收藏 引用 所屬分類: 土仔編程

            評論

            # re: [翻譯]利用C#獲取終端服務(Terminal Services)會話的閑置時間 2008-12-29 16:21 北京時間
            斷開時間  回復  更多評論
              

            # re: [翻譯]利用C#獲取終端服務(Terminal Services)會話的閑置時間 2011-03-03 18:49 Binyao
            我用你的代碼在2008R2上面運行,但 ret 永遠都不=1啊,為什么?急啊,我的郵箱是v-bxu@microsoft.com
            msn: xbyhoo@hotmail.com

            ret = WinStationQueryInformationW(
            hServer,
            sessionId,
            (uint)WINSTATIONINFOCLASS.WinStationInformation,
            pwsInfo,
            (uint)Marshal.SizeOf(typeof(WINSTATIONINFORMATIONW)),
            ref RetLen);

            if (ret == 1)
            {
            wsInfo = (WINSTATIONINFORMATIONW)Marshal.PtrToStructure(
            pwsInfo,
            typeof(WINSTATIONINFORMATIONW));
            WTSCloseServer(hServer);
            RetWsInfo.ConnectTime = FileTimeToDateTime(wsInfo.ConnectTime);
            RetWsInfo.CurrentTime = FileTimeToDateTime(wsInfo.CurrentTime);
            RetWsInfo.DisconnectTime = FileTimeToDateTime(wsInfo.DisconnectTime);
            RetWsInfo.LastInputTime = FileTimeToDateTime(wsInfo.LastInputTime);
            RetWsInfo.LoginTime = FileTimeToDateTime(wsInfo.LoginTime);
            RetWsInfo.SessionId = (int)wsInfo.SessionId;
            }  回復  更多評論
              

            亚洲午夜久久久久妓女影院| 亚洲精品乱码久久久久66| 精品国产青草久久久久福利| 精品视频久久久久| 亚洲国产精品久久电影欧美| 国产精品成人精品久久久| 色婷婷综合久久久久中文| 国产成人无码精品久久久久免费| 久久精品免费全国观看国产| 久久久久久a亚洲欧洲aⅴ| 亚洲日韩欧美一区久久久久我| 久久国产精品成人免费| 久久久久亚洲AV成人网人人网站 | 97精品依人久久久大香线蕉97 | 99久久精品九九亚洲精品| 伊人久久大香线蕉无码麻豆| 91精品日韩人妻无码久久不卡| 伊人久久大香线蕉综合影院首页| 久久精品成人免费国产片小草| 无码精品久久久天天影视| 久久综合九色欧美综合狠狠 | 亚洲另类欧美综合久久图片区| 久久婷婷五月综合97色| 久久精品综合网| 久久久久亚洲AV无码专区首JN| 热综合一本伊人久久精品| 国内精品久久久久影院网站| 久久r热这里有精品视频| 久久久久亚洲AV无码永不| 亚洲中文字幕无码一久久区| 国产精品一区二区久久精品涩爱| 久久99热这里只有精品国产| 国产精品久久久久一区二区三区| 2021少妇久久久久久久久久| 色狠狠久久AV五月综合| 午夜精品久久久久久中宇| 麻豆亚洲AV永久无码精品久久| 久久综合噜噜激激的五月天| 婷婷久久香蕉五月综合加勒比 | 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久亚洲欧洲国产综合|