WTSDisconnectSession (wtsapi32)
Last changed: RT-ICA557PG-185.236.200.23

.
Summary
The WTSDisconnectSession function disconnects the logged-on user from the specified Terminal Services session without closing the session. If the user subsequently logs on to the same terminal server, the user is reconnected to the same session.

C# Signature:

     [DllImport("wtsapi32.dll", SetLastError = true)]
     static extern bool WTSDisconnectSession(IntPtr hServer, int sessionId, bool bWait);

VB Signature:

     <DllImport("wtsapi32.dll", SetLastError:=True)> _
     Private Shared Function WTSDisconnectSession(ByVal hServer As IntPtr, ByVal SessionId As Integer, ByVal bWait As Boolean) As Boolean
    End Function

User-Defined Types:

None.

Notes:

Note that you cannot disconnect the console session.

To indicate the current session, specify WTS_CURRENT_SESSION. To retrieve the identifiers of all sessions on a specified terminal server, use the WTSEnumerateSessions function.

To be able to disconnect another user's session, you need to have the Disconnect permission.

Tips & Tricks:

Please add some!

Sample Code:

    Friend Function DissconnectSession(ByVal ServerName As String, ByVal SessionID As Integer) As Boolean
    Dim RetVal As Boolean
    Dim ptrOpenedServer As IntPtr
    Try
        ptrOpenedServer = WTSOpenServer(ServerName)
        RetVal = WTSDisconnectSession(ptrOpenedServer, SessionID, False)

    Catch ex As Exception
        Throw New Exception(ex.Message & vbCrLf & System.Runtime.InteropServices.Marshal.GetLastWin32Error)
    Finally
        Try
        WTSCloseServer(ptrOpenedServer)
        Catch ex As Exception
        End Try
    End Try
    Return RetVal
    End Function

Alternative Managed API:

Do you know one? Please contribute it!

Constants:

WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero
WTS_CURRENT_SESSION = -1

Switch User:

[DllImport("wtsapi32.dll", SetLastError = true)]
static extern bool WTSDisconnectSession(IntPtr hServer, int sessionId, bool bWait);
public static void SwitchUser()
{
    WTSDisconnectSession(IntPtr.Zero, -1, false);
}

Documentation