如何检索.NET中已登录已连接用户的列表?

如何检索.NET中已登录已连接用户的列表?,第1张

如何检索.NET中已登录/已连接用户的列表?

这是我对这个问题的看法

using System;using System.Collections.Generic;using System.Runtime.InteropServices;namespace EnumerateRDUsers{  class Program  {    [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    }    static void Main(string[] args)    {      ListUsers(Environment.MachineName);    }    public static void ListUsers(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); Console.WriteLine("Domain and User: " + Marshal.PtrToStringAnsi(domainPtr) + "\" + Marshal.PtrToStringAnsi(userPtr)); WTSFreeMemory(userPtr);  WTSFreeMemory(domainPtr);          }          WTSFreeMemory(sessionInfoPtr);        }      }      finally      {        WTSCloseServer(serverHandle);      }    }  }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5567501.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存