Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Wykonaj jeśli użytkownik zalogowany


Rekomendowane odpowiedzi

Opublikowano

using System;

using System.Collections.Generic;

using System.Text;

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(

System.IntPtr hServer, int sessionId, WTS_INFO_CLASS wtsInfoClass, out System.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("<INSERT SERVERNAME HERE>");

}

 

public static IntPtr OpenServer(String Name)

{

IntPtr server = WTSOpenServer(Name);

return server;

}

public static void CloseServer(IntPtr ServerHandle)

{

WTSCloseServer(ServerHandle);

}

public static void ListUsers(String ServerName)

{

IntPtr serverHandle = IntPtr.Zero;

List<String> resultList = new List<string>();

serverHandle = OpenServer(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));

Int32 currentSession = (int)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

{

CloseServer(serverHandle);

}

 

}

 

}

}

źródło:
http://stackoverflow.com/questions/132620/how-do-you-retrieve-a-list-of-logged-in-connected-users-in-net

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...