• Windows任务管理 连接用户登录信息 通用类[C#版]


    通用类名[ComputerLoginUserInfo.cs] 代码如下:

    代码
    using System;

    //---引用
    using System.Runtime.InteropServices;
    using System.Text;

    /// <summary>
    /// Windows 任务管理器登录用户信息
    /// author:Stone_W
    /// date:2011.1.14
    /// </summary>
    public class ComputerLoginUserInfo
    {
    #region 本机连接用户信息API封装
    public class TSControl
    {
    [DllImport(
    "wtsapi32", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool WTSEnumerateSessions(int hServer, int Reserved,
    int Version, ref long ppSessionInfo, ref int pCount);
    [DllImport(
    "wtsapi32.dll")]
    public static extern void WTSFreeMemory(System.IntPtr pMemory);
    [DllImport(
    "wtsapi32.dll")]
    public static extern bool WTSLogoffSession(int hServer, long SessionId, bool bWait);
    [DllImport(
    "Wtsapi32.dll")]
    public static extern bool WTSQuerySessionInformation(
    System.IntPtr hServer,
    int sessionId, WTSInfoClass wtsInfoClass,
    out StringBuilder ppBuffer, out int pBytesReturned);
    public enum WTSInfoClass
    {
    WTSInitialProgram,
    WTSApplicationName,
    WTSWorkingDirectory,
    WTSOEMId,
    WTSSessionId,
    WTSUserName,
    WTSWinStationName,
    WTSDomainName,
    WTSConnectState,
    WTSClientBuildNumber,
    WTSClientName,
    WTSClientDirectory,
    WTSClientProductId,
    WTSClientHardwareId,
    WTSClientAddress,
    WTSClientDisplay,
    WTSClientProtocolType
    }
    public enum WTS_CONNECTSTATE_CLASS
    {
    WTSActive,
    WTSConnected,
    WTSConnectQuery,
    WTSShadow,
    WTSDisconnected,
    WTSIdle,
    WTSListen,
    WTSReset,
    WTSDown,
    WTSInit,
    }

    public struct WTS_SESSION_INFO
    {
    public int SessionID;
    [MarshalAs(UnmanagedType.LPTStr)]
    public string pWinStationName;
    public WTS_CONNECTSTATE_CLASS state;
    }

    public static WTS_SESSION_INFO[] SessionEnumeration()
    {
    //Set handle of terminal server as the current terminal server
    int hServer = 0;
    bool RetVal;
    long lpBuffer = 0;
    int Count = 0;
    long p;
    WTS_SESSION_INFO Session_Info
    = new WTS_SESSION_INFO();
    WTS_SESSION_INFO[] arrSessionInfo;
    RetVal
    = WTSEnumerateSessions(hServer, 0, 1, ref lpBuffer, ref Count);
    arrSessionInfo
    = new WTS_SESSION_INFO[0];
    if (RetVal)
    {
    arrSessionInfo
    = new WTS_SESSION_INFO[Count];
    int i;
    p
    = lpBuffer;
    for (i = 0; i < Count; i++)
    {
    arrSessionInfo[i]
    = (WTS_SESSION_INFO)Marshal.PtrToStructure(new IntPtr(p),
    Session_Info.GetType());
    p
    += Marshal.SizeOf(Session_Info.GetType());
    }
    WTSFreeMemory(
    new IntPtr(lpBuffer));
    }
    else
    {
    //Insert Error Reaction Here
    }
    return arrSessionInfo;
    }
    }
    #endregion

    public System.Collections.Generic.List<ComputerLoginUserInfoModel> ComputerLoginUserInfoList;
    public ComputerLoginUserInfo()
    {
    #region 查询代码
    TSControl.WTS_SESSION_INFO[] pSessionInfo
    = TSControl.SessionEnumeration();
    ComputerLoginUserInfoModel cum
    = null;
    ComputerLoginUserInfoList
    = new System.Collections.Generic.List<ComputerLoginUserInfoModel>();
    for (int i = 0; i < pSessionInfo.Length; i++)
    {
    if ("RDP-Tcp" != pSessionInfo[i].pWinStationName)
    {
    try
    {
    int count = 0;
    IntPtr buffer
    = IntPtr.Zero;
    StringBuilder userName
    = new StringBuilder(); // 用户名
    StringBuilder clientUser = new StringBuilder(); // 客户端名
    StringBuilder stateType = new StringBuilder(); // 会话类型

    bool userNameBool = TSControl.WTSQuerySessionInformation(IntPtr.Zero,
    pSessionInfo[i].SessionID, TSControl.WTSInfoClass.WTSUserName,
    out userName, out count);
    bool clientUserBool = TSControl.WTSQuerySessionInformation(IntPtr.Zero,
    pSessionInfo[i].SessionID, TSControl.WTSInfoClass.WTSClientName,
    out clientUser, out count);
    bool stateTypeBool = TSControl.WTSQuerySessionInformation(IntPtr.Zero,
    pSessionInfo[i].SessionID, TSControl.WTSInfoClass.WTSWinStationName,
    out stateType, out count);
    if (userNameBool && clientUserBool && stateTypeBool)
    {
    cum
    = new ComputerLoginUserInfoModel();
    cum.UserName
    = userName.ToString();
    cum.ClientUserName
    = clientUser.ToString();
    cum.SessionType
    = stateType.ToString();
    }
    ComputerLoginUserInfoList.Add(cum);
    }
    catch (Exception ex) { }
    }
    }
    #endregion
    }



    }
    public class ComputerLoginUserInfoModel
    {
    #region 用户信息字段
    private string userName;
    private string clientUserName;
    private string sessionType;

    /// <summary>
    /// 会话类型
    /// </summary>
    public string SessionType
    {
    get { return sessionType; }
    set { sessionType = value; }
    }
    /// <summary>
    /// 客户端名
    /// </summary>
    public string ClientUserName
    {
    get { return clientUserName; }
    set { clientUserName = value; }
    }
    /// <summary>
    /// 登录用户名
    /// </summary>
    public string UserName
    {
    get { return userName; }
    set { userName = value; }
    }
    #endregion
    }

    使用:ComputerLoginUserInfo uif = new ComputerLoginUserInfo();
          foreach (ComputerLoginUserInfoModel item in uif.ComputerLoginUserInfoList)
          {
              Response.Write(item.UserName);
          }

     ps:尊重劳动人民成果,技术是共享的,但如果引用代码请注明出处谢谢.

    [引用地址:http://www.cnblogs.com/stone_w/archive/2011/01/14/1935219.html] 

    关注下面二维码,订阅更多精彩内容。
    微信打赏
    关注公众号(加好友):

  • 相关阅读:
    Spark源码走读6——Shuffle
    Spark源码走读5——Storage
    使用Gradle构建Android应用的渠道包
    轻松搞定面试中的二叉树题目
    QT中使用微软Speech API实现语音识别
    QT 相关资源(书籍、论坛、博客等。。。)整理...
    使用Cscope阅读大型工程Linux内核的源代码教程
    搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门
    RSA算法原理(二)
    RSA算法原理(一)
  • 原文地址:https://www.cnblogs.com/vipstone/p/1935219.html
Copyright © 2020-2023  润新知