WTSEnumerateProcesses (wtsapi32)
Last changed: -

The WTSEnumerateProcesses function retrieves information about the active processes on a specified terminal server.

C# Signature:

[DllImport("wtsapi32.dll", SetLastError=true)]
static extern bool WTSEnumerateProcesses(
    IntPtr serverHandle, // Handle to a terminal server.
    Int32  reserved,     // must be 0
    Int32  version,      // must be 1
    ref IntPtr ppProcessInfo, // pointer to array of WTS_PROCESS_INFO
    ref Int32  pCount     // pointer to number of processes

VB Signature:

Private Declare Function WTSEnumerateProcesses Lib "wtsapi32.dll" ( _
     ByVal hServer As Int32, _
     ByVal Reserved As Int32, _
     ByVal Version As Int32, _
     ByRef ppProcessInfo As IntPtr, _
     ByRef pCount As Int32
) As Int32

User-Defined Types:


Alternative Managed API:

Much can be done with the System.Diagnostics.Process class with methods such as GetProcesses, GetProcessByName and GetProcessByID.



Tips & Tricks:

Please add some!

Sample Code:

//C# sample code

//Handle to the server that this code is running on.

private static extern void WTSFreeMemory(IntPtr pMemory);

private static HANDLE WTS_CURRENT_SERVER_HANDLE = (IntPtr)null;

public static WTS_PROCESS_INFO[] WTSEnumerateProcesses()
    IntPtr pProcessInfo = IntPtr.Zero;
    int processCount = 0;

    if (!WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, ref pProcessInfo, ref processCount))
        return null;

    IntPtr pMemory = pProcessInfo;
    WTS_PROCESS_INFO[] processInfos = new WTS_PROCESS_INFO[processCount];
    for (int i = 0; i < processCount; i++)
        processInfos[i] = (WTS_PROCESS_INFO)Marshal.PtrToStructure(pProcessInfo, typeof(WTS_PROCESS_INFO));
        pProcessInfo = (IntPtr)((long)pProcessInfo + Marshal.SizeOf(processInfos[i]));

    return processInfos;

//VB sample code
Dim strucProcessInfo As WTS_PROCESS_INFO
Dim ptrProcessInfo As IntPtr
Dim lngPtrPos As Long
Dim intReturn As Integer
Dim intCount As Integer
Dim intProcessCount As Integer
Dim strProcessName As String

intReturn = WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, ptrProcessInfo, intProcessCount)
If intReturn > 0 Then
    'Get the length in bytes of each structure...
    lngPtrPos = ptrProcessInfo.ToInt32()

    For intCount = 0 To intProcessCount - 1
        strucProcessInfo = Marshal.PtrToStructure(New IntPtr(lngPtrPos), strucProcessInfo.GetType)
        'ProcessName is merely a pointer to the string - convert it to the full string...
        strProcessName = Marshal.PtrToStringAnsi(New IntPtr(strucProcessInfo.ProcessName))

        Console.WriteLine ("Process Name: " & strProcessName)
        Console.WriteLine ("Process ID: " & strucProcessInfo.ProcessID)
        Console.WriteLine ("Session ID: " & strucProcessInfo.SessionID)

        'Now move on the pointer to the next member of the array...
        lngPtrPos = lngPtrPos + Len(strucProcessInfo)
End If

Call WTSFreeMemory(ptrProcessInfo)