Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.NET中检索已登录/已连接用户的列表?_C#_.net_Windows Services_Login - Fatal编程技术网

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

C# 如何在.NET中检索已登录/已连接用户的列表?,c#,.net,windows-services,login,C#,.net,Windows Services,Login,以下是场景: 您有一个Windows服务器,用户可以通过RDP远程连接到该服务器。您希望您的程序(作为服务运行)知道当前连接的用户。这可能包括也可能不包括交互式控制台会话 请注意,这与仅检索当前交互用户不同 我猜有某种API访问终端服务来获取这些信息?好的,我自己问题的一个解决方案 您可以使用WMI检索正在运行的进程的列表。您还可以查看这些流程的所有者。如果您查看“explorer.exe”的所有者(并删除重复项),您将得到一个登录用户列表。使用系统; using System; using S

以下是场景:

您有一个Windows服务器,用户可以通过RDP远程连接到该服务器。您希望您的程序(作为服务运行)知道当前连接的用户。这可能包括也可能不包括交互式控制台会话

请注意,这与仅检索当前交互用户不同


我猜有某种API访问终端服务来获取这些信息?

好的,我自己问题的一个解决方案

您可以使用WMI检索正在运行的进程的列表。您还可以查看这些流程的所有者。如果您查看“explorer.exe”的所有者(并删除重复项),您将得到一个登录用户列表。

使用系统;
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace TerminalServices
{
    class TSManager
    {
    [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);

    [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_CONNECTSTATE_CLASS
    {
        WTSActive,
        WTSConnected,
        WTSConnectQuery,
        WTSShadow,
        WTSDisconnected,
        WTSIdle,
        WTSListen,
        WTSReset,
        WTSDown,
        WTSInit
    } 

    public static IntPtr OpenServer(String Name)
    {
        IntPtr server = WTSOpenServer(Name);
        return server;
    }
    public static void CloseServer(IntPtr ServerHandle)
    {
        WTSCloseServer(ServerHandle);
    }
    public static List<String> ListSessions(String ServerName)
    {
        IntPtr server = IntPtr.Zero;
        List<String> ret = new List<string>();
        server = OpenServer(ServerName);

        try
        {
        IntPtr ppSessionInfo = IntPtr.Zero;

        Int32 count = 0;
        Int32 retval = WTSEnumerateSessions(server, 0, 1, ref ppSessionInfo, ref count);
        Int32 dataSize = Marshal.SizeOf(typeof(WTS_SESSION_INFO));

        Int32 current = (int)ppSessionInfo;

        if (retval != 0)
        {
            for (int i = 0; i < count; i++)
            {
            WTS_SESSION_INFO si = (WTS_SESSION_INFO)Marshal.PtrToStructure((System.IntPtr)current, typeof(WTS_SESSION_INFO));
            current += dataSize;

            ret.Add(si.SessionID + " " + si.State + " " + si.pWinStationName);
            }

            WTSFreeMemory(ppSessionInfo);
        }
        }
        finally
        {
        CloseServer(server);
        }

        return ret;
    }
    }
}
使用System.Collections.Generic; 使用系统文本; 使用System.Runtime.InteropServices; 命名空间终端服务 { 班级经理 { [DllImport(“wtsapi32.dll”)] 静态外部IntPtr WTSOpenServer([Marshallas(UnmanagedType.LPStr)]字符串pServerName); [DllImport(“wtsapi32.dll”)] 静态外部无效WTSCloseServer(IntPtr hServer); [DllImport(“wtsapi32.dll”)] 静态外部Int32 WTSEnumerateSessions( IntPtr服务器, [Marshallas(UnmanagedType.U4)]Int32保留, [Marshallas(UnmanagedType.U4)]Int32版本, 参考IntPtr ppSessionInfo, [Marshallas(UnmanagedType.U4)]ref Int32 pCount; [DllImport(“wtsapi32.dll”)] 静态外部无效WTSFreeMemory(IntPtr pMemory); [StructLayout(LayoutKind.Sequential)] 私有结构WTS\u会话\u信息 { 公共Int32会话ID; [Marshallas(UnmanagedType.LPStr)] 公共字符串pInstallationName; 公共WTS_CONNECTSTATE_CLASS State; } 公共枚举WTS_连接状态_类 { 是的, WTS连接, WTSConnectQuery, WTSShadow, WTS断开连接, 西德尔, WTSListen, WTSReset, WTSDown, WTSInit } 公共静态IntPtr OpenServer(字符串名称) { IntPtr server=WTSOpenServer(名称); 返回服务器; } 公共静态void CloseServer(IntPtr ServerHandle) { WTSCloseServer(服务器句柄); } 公共静态列表ListSessions(字符串服务器名) { IntPtr server=IntPtr.Zero; List ret=新列表(); server=OpenServer(ServerName); 尝试 { IntPtr ppSessionInfo=IntPtr.Zero; Int32计数=0; Int32 retval=WTSEnumerateSessions(服务器、0、1、引用ppSessionInfo、引用计数); Int32 dataSize=Marshal.SizeOf(typeof(WTS_SESSION_INFO)); Int32当前=(int)ppSessionInfo; 如果(返回值!=0) { for(int i=0;i
以下是我对这个问题的看法:

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);
      }

    }

  }
}
使用系统;
使用System.Collections.Generic;
使用System.Runtime.InteropServices;
命名空间枚举用户
{
班级计划
{
[DllImport(“wtsapi32.dll”)]
静态外部IntPtr WTSOpenServer([Marshallas(UnmanagedType.LPStr)]字符串pServerName);
[DllImport(“wtsapi32.dll”)]
静态外部无效WTSCloseServer(IntPtr hServer);
[DllImport(“wtsapi32.dll”)]
静态外部Int32 WTSEnumerateSessions(
IntPtr服务器,
[Marshallas(UnmanagedType.U4)]Int32保留,
[Marshallas(UnmanagedType.U4)]Int32版本,
参考IntPtr ppSessionInfo,
[Marshallas(UnmanagedType.U4)]ref Int32 pCount;
[DllImport(“wtsapi32.dll”)]
静态外部无效WTSFreeMemory(IntPtr pMemory);
[DllImport(“wtsapi32.dll”)]
静态外部布尔WTSQuerySessionInformation(
IntPtr hServer、int sessionId、WTS_INFO_类wtsInfoClass、out IntPtr ppBuffer、out uint pBytesReturned);
[StructLayout(LayoutKind.Sequential)]
私有结构WTS\u会话\u信息
{
公共Int32会话ID;
[Marshallas(UnmanagedType.LPStr)]
公共字符串pInstallationName;
公共WTS_CONNECTSTATE_CLASS State;
}
公共枚举WTS\u信息\u类
{
中国程序,
WTS应用程序名称,
WTSWorkingDirectory,
WTSOEMId,
WTSSessionId,
苏瑟南,
WTSWinStationName,
WTSDomainName,
WTS连接状态,
WTSClientBuildNumber,
WTSClientName,
WTSClientDirectory,
WTSClientProductId,
WTSClientHardwareId,
WTSClientAddress,
WTSClientDisplay,
WTSClientProtocolType
}
公共枚举WTS_连接状态_类
{
是的,
WTS连接,
WTSConnectQuery,
WTSShadow,
WTS断开连接,
西德尔,
WTSListen,
WTSReset,
WTSDown,
WTSInit
}
静态void Main(字符串[]参数)
{
ListUsers(Environment.MachineName);
}
publicstaticvoidlistusers(字符串serverName)
{
IntPtr serverHandle=IntPtr.Zero;
列表结果列表=新列表();
serverHandle=WTSOpenServer(serverName);
尝试
{
IntPtr sessioninfo=IntPtr.Zero;
IntPtr userPtr=IntPtr.Zero;
IntPtr domainPtr=IntPtr.Zero;
Int32 sessionCount=0;
Int32 retVal=WTSEnumerateSessions(serverHandle,0,1,ref sessionInfo ptr,ref sessionCount);
Int32 dataSize=Marshal.SizeOf(typeof(WTS_SESSION_INFO));
IntPtr currentSession=sessioninfo;
uint字节=0;
如果(返回值!=0)
{
for(int i=0;iusing System;
using System.Security.Principal;
using Cassia;

namespace CassiaSample
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            ITerminalServicesManager manager = new TerminalServicesManager();
            using (ITerminalServer server = manager.GetRemoteServer("your-server-name"))
            {
                server.Open();
                foreach (ITerminalServicesSession session in server.GetSessions())
                {
                    NTAccount account = session.UserAccount;
                    if (account != null)
                    {
                        Console.WriteLine(account);
                    }
                }
            }
        }
    }
}