Opt("TrayIconHide", 1) #include #include #include Global $sBufer, $iS = 0 Global Const $WTSUserName = 5 ;* Global Const $WTS_CURRENT_SERVER_HANDLE = 0 $Form = GUICreate("Диспетчер сеансов терминального сервера", 413, 429, 315, 122, BitOR($GUI_SS_DEFAULT_GUI, $DS_MODALFRAME)) $ListView = GUICtrlCreateListView("ID|Имя пользователя|Сессия|Компьютер|info", 8, 8, 395, 413, -1, BitOR($WS_EX_CLIENTEDGE, $LVS_EX_FULLROWSELECT)) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) $ListViewcontext = GUICtrlCreateContextMenu($ListView) $MenuItemSendMesage = GUICtrlCreateMenuItem("Отправить сообщение", $ListViewcontext) $MenuItemExit = GUICtrlCreateMenuItem("Выход", $ListViewcontext) $MenuItemTscon = GUICtrlCreateMenuItem("Подключить", $ListViewcontext) $MenuItemDiscon = GUICtrlCreateMenuItem("Отключить", $ListViewcontext) $MenuItemShadow = GUICtrlCreateMenuItem("Удаленное управление", $ListViewcontext) GUISetState(@SW_SHOW) $hServer = $WTS_CURRENT_SERVER_HANDLE Local $aRet = DllCall('Wtsapi32.dll', 'BOOL', 'WTSEnumerateSessionsEx', 'HANDLE', $hServer, 'DWORD*', 1, 'DWORD', 0, 'PTR*', 0, 'DWORD*', 0) If @error Or Not IsArray($aRet) Or $aRet[0] = 0 Then Exit Local $Offset = 0, $tInfo Local Const $TAG_WTS_SESSION_INFO_1 = 'DWORD ExecEnvId;uint State;DWORD SessionId;PTR SessionState;PTR HostName;PTR UserName;PTR DomainName;PTR FarmName;' For $i = 1 To $aRet[5] $tInfo = DllStructCreate($TAG_WTS_SESSION_INFO_1, $aRet[4] + $Offset) $Offset += DllStructGetSize($tInfo) $iExecEnvId = DllStructGetData($tInfo, 'ExecEnvId') $iState = DllStructGetData($tInfo, 'State') $iSessionId = DllStructGetData($tInfo, 'SessionId') $iSessionState = DllStructGetData(DllStructCreate("char[" & 1024 & "]", DllStructGetData($tInfo, 'SessionState')), 1) $iSessionState = StringReplace($iSessionState, "0", "Отключен") $iUserName = DllStructGetData(DllStructCreate("char[" & 1024 & "]", DllStructGetData($tInfo, 'UserName')), 1) $iDomainName = DllStructGetData(DllStructCreate("char[" & 1024 & "]", DllStructGetData($tInfo, 'DomainName')), 1) $iFarmName = DllStructGetData(DllStructCreate("char[" & 1024 & "]", DllStructGetData($tInfo, 'FarmName')), 1) GUICtrlCreateListViewItem("" & $iSessionId & "|" & $iUserName & "|" & $iSessionState & "|" & $iDomainName & "|" & $tInfo, $ListView) Next DllCall('Wtsapi32.dll', 'BOOL', 'WTSFreeMemoryEx', 'UINT', 2, 'PTR', $aRet[4], 'ULONG', $aRet[5]) Func WTSLogoffSession($SessionId, $hServer = $WTS_CURRENT_SERVER_HANDLE, $bWait = False) Local $aRet = DllCall('Wtsapi32.dll', 'BOOL', 'WTSLogoffSession', 'HANDLE', $hServer, 'DWORD', $SessionId, 'BOOL', $bWait) If @error Or Not IsArray($aRet) Or $aRet[0] = 0 Then Return SetError(1, 0, 0) Return $aRet[0] EndFunc ;==>WTSLogoffSession Func GetID() $id = GUICtrlRead(GUICtrlRead($ListView)) $id = StringLeft($id, StringInStr($id, "|") - 1) Return $id EndFunc ;==>GetID While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $MenuItemExit WTSLogoffSession(GetID()) Exit Case $MenuItemShadow Run("mstsc /shadow:" & GetID() & " /control /noConsentPrompt") Exit Case $MenuItemDiscon Run("Tsdiscon " & GetID()) Exit Case $MenuItemTscon Run("Tscon " & GetID()) Exit Case $MenuItemSendMesage $Zagol = "Сообщение от администратора сервера" $Text = "Текст сообщения" DllCall('Wtsapi32.dll', 'BOOL', 'WTSSendMessage', 'HANDLE', $hServer, 'DWORD', GetID(), 'LPTSTR', $Zagol, 'DWORD', StringLen($Zagol) _ , 'LPTSTR', $Text, 'DWORD', StringLen($Text), 'DWORD', 1, 'DWORD', 0, 'DWORD*', 10, 'BOOL', False) Exit EndSwitch WEnd