#include <Array.au3>
Global Const $WTS_CURRENT_SERVER_HANDLE = 0
Global Const $WTS_CURRENT_SESSION = -1
Global Const $WTSUserName = 5
$aData = WTSEnumerateSessions()
_ArrayDisplay($aData,'Массив текущих сессий',-1,0,'','|','№|SessionId|SessionName')
Func WTSEnumerateSessions($hServer = $WTS_CURRENT_SERVER_HANDLE)
Local $aRet = DllCall('Wtsapi32.dll', 'BOOL', 'WTSEnumerateSessions', 'HANDLE', $hServer, 'DWORD', 0, 'DWORD', 1, 'PTR*', 0, 'DWORD*', 0)
If @error Or Not IsArray($aRet) Or $aRet[0] = 0 Then Return SetError(1, 0, 0)
Local $Offset = 0, $tInfo
Local Const $TAG_WTS_SESSION_INFO = 'DWORD SessionId;PTR WinStationName;UINT State;'
Local Enum $iSessionId,$iUserName,$iLAST
Local $aOut[$aRet[5]][$iLAST]
For $i = 1 To $aRet[5]
$tInfo = DllStructCreate($TAG_WTS_SESSION_INFO, $aRet[4] + $Offset)
$Offset += DllStructGetSize($tInfo)
$aOut[$i - 1][$iSessionId] = DllStructGetData($tInfo, 'SessionId')
$aOut[$i - 1][$iUserName] = WTSQuerySessionInformation($aOut[$i - 1][$iSessionId])
Next
DllCall('Wtsapi32.dll', 'NONE', 'WTSFreeMemory', 'PTR', $aRet[4])
Return SetError(0,0,$aOut)
EndFunc
Func WTSQuerySessionInformation($SessionId = $WTS_CURRENT_SESSION, $WTSInfoClass = $WTSUserName, $hServer = $WTS_CURRENT_SERVER_HANDLE)
Local $aRet = DllCall('Wtsapi32.dll', 'BOOL', 'WTSQuerySessionInformation', 'HANDLE', $hServer, 'DWORD', $SessionId, 'UINT', $WTSInfoClass, 'PTR*', 0, 'DWORD*', 0)
If @error Or Not IsArray($aRet) Or $aRet[0] = 0 Then Return SetError(1, 0, 0)
Local $sOut = DllStructGetData(DllStructCreate('char[' & $aRet[5] & ']', $aRet[4]), 1)
DllCall('Wtsapi32.dll', 'NONE', 'WTSFreeMemory', 'PTR', $aRet[4])
Return SetError(0, 0, $sOut)
EndFunc