zoukankan      html  css  js  c++  java
  • C# 获取所有已登录系统的用户名

    [DllImport("wtsapi32.dll")]
    static extern IntPtr WTSOpenServer([MarshalAs(UnmanagedType.LPStr)] string pServerName);
    
    [DllImport("wtsapi32.dll")]
    static extern void WTSCloseServer(IntPtr hServer);
    
    [DllImport("wtsapi32.dll")]
    static extern Int32 WTSEnumerateSessions(
        IntPtr hServer,
        [MarshalAs(UnmanagedType.U4)] Int32 Reserved,
        [MarshalAs(UnmanagedType.U4)] Int32 Version,
        ref IntPtr ppSessionInfo,
        [MarshalAs(UnmanagedType.U4)] ref Int32 pCount);
    
    [DllImport("wtsapi32.dll")]
    static extern void WTSFreeMemory(IntPtr pMemory);
    
    [DllImport("wtsapi32.dll")]
    static extern bool WTSQuerySessionInformation(
        IntPtr hServer, int sessionId, WTS_INFO_CLASS wtsInfoClass, out IntPtr ppBuffer, out uint pBytesReturned);
    
    [StructLayout(LayoutKind.Sequential)]
    private struct WTS_SESSION_INFO
    {
        public Int32 SessionID;
    
        [MarshalAs(UnmanagedType.LPStr)]
        public string pWinStationName;
    
        public WTS_CONNECTSTATE_CLASS State;
    }
    
    public enum WTS_INFO_CLASS
    {
        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 static List<string> GetLoginedUsers(string serverName)
    {
        IntPtr serverHandle = IntPtr.Zero;
        List<string> resultList = new List<string>();
        serverHandle = WTSOpenServer(serverName);
    
        try
        {
            IntPtr sessionInfoPtr = IntPtr.Zero;
            IntPtr userPtr = IntPtr.Zero;
            IntPtr domainPtr = IntPtr.Zero;
            Int32 sessionCount = 0;
            Int32 retVal = WTSEnumerateSessions(serverHandle, 0, 1, ref sessionInfoPtr, ref sessionCount);
            Int32 dataSize = Marshal.SizeOf(typeof(WTS_SESSION_INFO));
            IntPtr currentSession = sessionInfoPtr;
            uint bytes = 0;
    
            if (retVal != 0)
            {
                for (int i = 0; i < sessionCount; i++)
                {
                    WTS_SESSION_INFO si = (WTS_SESSION_INFO)Marshal.PtrToStructure((System.IntPtr)currentSession, typeof(WTS_SESSION_INFO));
                    currentSession += dataSize;
    
                    WTSQuerySessionInformation(serverHandle, si.SessionID, WTS_INFO_CLASS.WTSUserName, out userPtr, out bytes);
                    WTSQuerySessionInformation(serverHandle, si.SessionID, WTS_INFO_CLASS.WTSDomainName, out domainPtr, out bytes);
    
                    var domain = Marshal.PtrToStringAnsi(domainPtr);
                    var username = Marshal.PtrToStringAnsi(userPtr);
                    
                    if(!string.IsNullOrWhiteSpace(username))
                        resultList.Add(username);
    
                    WTSFreeMemory(userPtr);
                    WTSFreeMemory(domainPtr);
                }
    
                WTSFreeMemory(sessionInfoPtr);
            }
        }
        finally
        {
            WTSCloseServer(serverHandle);
        }
    
        return resultList;
    }
    
    void Main()
    {
        GetLoginedUsers(Environment.MachineName).Dump();
    }
    
    // Define other methods and classes here
  • 相关阅读:
    完成一个MVC+Nhibernate+Jquery-EasyUI信息发布系统
    SQL Server监控清单
    三大线性排序之基数排序
    使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
    复制中的大批量更新
    碎片解决方案
    老猫总结的如何发布文件到手机中
    FMX对象释放
    MFC 窗口重绘问题
    如何将内存中的位图数据绘制在DC上
  • 原文地址:https://www.cnblogs.com/nanfei/p/14005654.html
Copyright © 2011-2022 走看看