Определение факта подключения/отключения локального компьютера к определённому адресу
Суть состоит в том, что у нас несколько человек подключаются к виртуальным машинам по RDP через MSTSC, и если на ту машину, куда уже кто-то подключен, подключится ещё один человек, второго выкинет. Хочу написать программу, которая отслеживает эти подключения (может, есть вариант через MSTSC отследить) и сообщает остальным о статусе виртуалок.
2) Лично у меня на работе есть схожая проблема, но у нас важную сессию постоянно кто-то закрывает, и из-за этого перестают выполняться 1С обработки по расписанию. Я написал костыль: программа по таймеру получает список запущенных процессов на удаленной машине (win api не скажу, могу с .net помочь), если флаговый процесс (то есть специальный, написанный мной и висящий в автозагрузке) не запущен - программа считает, что сессия закрыта и запускает mstsc с параметрами. В вашем случае можно поступить также: если флаговый процесс запущен - значит, кто-то уже сидит. Если этот кто-то потом нажмет на выход или сессия отвалится по истечении времени неактивности, процесс будет снят системой, если в списке запущенных он отсутствует - значит, вход свободен
Суть в том, что заходить надо под одним пользователем — под разными-то не кидало бы.
Я вижу 2 решения: либо через мистический и неизвестный мне MSTSC API узнавать, подключен ли текущий компьютер к виртуалке, либо периодически запускать перечисление всех подключений (как NetStat, надо узнать функции) и на основании их анализа уже делать выводы. В 1-м случае я вообще не ознакомлен с темой, во 2-м — сейчас буду пытаться что-то накопать (но если есть выход лучше, типа оповещений о подключении, которые можно перехватить/подписаться на них, то я был бы рад).
Суть в том, что заходить надо под одним пользователем — под разными-то не кидало бы.
Я вижу 2 решения: либо через мистический и неизвестный мне MSTSC API узнавать, подключен ли текущий компьютер к виртуалке, либо периодически запускать перечисление всех подключений (как NetStat, надо узнать функции) и на основании их анализа уже делать выводы. В 1-м случае я вообще не ознакомлен с темой, во 2-м — сейчас буду пытаться что-то накопать (но если есть выход лучше, типа оповещений о подключении, которые можно перехватить/подписаться на них, то я был бы рад).
Огород не городите. Никаких "MSTSC API" в природе не существует. Shadow mode вам в помощь. Если по каким-то причинам у вас бан в гугле, то вот хорошая ссылка: http://habrahabr.ru/post/147273/
Так-то есть большой раздел по RDS, поэтому я не советовал бы столь радикально выражаться :D
Эту самую ссылку я нашёл, но:
0) там сказано про взаимодействие с локальным пользователем, а у нас все пользователи удалённо подключаются;
1) на наших виртуалках установлена WS 2008;
2) никаких id сеансов у нас нет, да и как мы их узнаем, если для этого подключаться надо?
Суть в том, что заходить надо под одним пользователем — под разными-то не кидало бы.
Я вижу 2 решения: либо через мистический и неизвестный мне MSTSC API узнавать, подключен ли текущий компьютер к виртуалке, либо периодически запускать перечисление всех подключений (как NetStat, надо узнать функции) и на основании их анализа уже делать выводы. В 1-м случае я вообще не ознакомлен с темой, во 2-м — сейчас буду пытаться что-то накопать (но если есть выход лучше, типа оповещений о подключении, которые можно перехватить/подписаться на них, то я был бы рад).
Под одним пользователем - вы что-то явно делаете не так и решаете проблему которую не нужно решать. Создать группу пользователей раздать ей права и прекратить заниматься странным.
Мне это затруднительно объяснить. Суть в том, что этот пользователь берётся из нашей программы — он там является администратором (что-то типа сквозной идентификации, что ли). Соответственно, все операции должны делаться только через него.
Собственно, суть моего вопроса несколько иная — как сделать вышеописанное?
Это сервисы WMI, а не "MSTSC API" - еще человека найдите, который грамотно сможет запрос составить к счетчикам производительности, я бы с таким пообщался.
А вы почитайте дальше третьей строки - например, там, где про доменные настройки пользователя написано и настраивается взаимодействие с залогиненным сеансом
По ходу, не только я не умею читать дальше 3-й строки…☺
WMI — это самая малость того, что там можно сделать. Функции WTS, может, и не совсем то, что мне нужно, но я их в оборот возьму, сейчас буду исследовать.
По ходу, не только я не умею читать дальше 3-й строки…☺
WMI — это самая малость того, что там можно сделать. Функции WTS, может, и не совсем то, что мне нужно, но я их в оборот возьму, сейчас буду исследовать.
WMI - это огромная платформа, на ее базе построено большое количество унаследованных сервисов, не разводите флуд. Того, что было озвучено в этой теме для решения вашей проблемы более чем достаточно
Буду разбираться с функциями WTS пока, тем более, есть и поважнее дела.
Собственно, я поверхностно это тоже пробежал, только времени не было вчера это закодить. Доступ у нас через VPN, да, поэтому надеюсь на положительный исход моих попыток ☺
Именно, т.е. у меня в наличии только то, что есть.
Начал пробовать через WTS, и сразу проблемы. В описании WTSOpenServer сказано, что ошибку надо проверять не по нулю, а по результату исполнения какой-нибудь функции. Пробовал через WTSEnumerateServers (потому что для WTSQuerySessionInformation нужен id сессии, который я пока не разбирался, как получить), так она возвращает ошибку, в то время как с WTS_CURRENT_SERVER_HANDLE всё работает отлично. ЧЯДНТ? Или каким ещё образом мне проверить валидность дескриптора открытого сервера?
Стучался и по имени (например, vm-name-00.dmn), и по IP, и даже "\\" в начале добавлял — всё равно не хочет!
Счетчики производительности на сервере включены? Ошибку в студию
Ошибки конкретной нет, ибо WTSOpenServer ошибки не возвращает в любом случае, а WTSEnumerateServers просто возвращает false.
Итак, по порядку.
Там, считай, ничего полезного нет. По 1-й ссылке ему не помогли, разве что процитировали участок MSDN. По 2-й ссылке — я поставил указанное значение в 1 на локальной машине (на сервере уже 1), перезагрузился, но ничего не изменилось.
Для тестирования использовал вот такой код:
if(WTSEnumerateSessions(hWTS,0,1,&pSess,&dwCount)){
WTSCloseServer(hWTS);
}else{
char szErr[200];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError(),0,szErr,200,0);
MessageBox(0,szErr,"Cannot connect to RDS",MB_ICONERROR);
}
Раскладка. Сервер состоит в домене, вход на него по RDP осуществляется через одну учётную запись. Мой компьютер в домене не состоит, подключаюсь по удалёнке через VPN. Исходя из этого, какого пользователя мне требуется добавить в разрешения? (там же вроде есть какая-то группа типа анонимных, прошедших проверку и в этом роде)
PS: А теперь время забросать меня говном со словами мол все уже написано осталось только собрать вместе.
Какашками закидывать не собирался, а вот поинтересоваться, что ты имел в виду, хочу.
Что ты подразумевал под отрицательными фидбеками? Да и с проектированием не всё так плохо — решение есть, но только надо понять, как его заставить работать. Т.к. поиск мне пока не дал ответа на вопрос, я узнаю у тех, кто может знать, как же избежать ошибки 5 «Доступ запрещён», например.
- Т.н. "выкидывание" => попытка узнать, а не сидит ли там кто (это мы еще не рассматриваем случай когда оба узнали что там никто не сидит и решили параллельно подключиться, внезапно "решение" не является "решением")
- Активная борьба с правами и иной машинерией предназначенной совсем для другого
Вам мало негативных обратных связей? Они всю дорогу намекают пересмотреть решения, но планомерно игнорируются.
Собственно, вся суть как раз и состоит в том, чтобы узнавать это без «выкидывания».
в реестре по пути [HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services PerfProc Performance] нужно удалить ключ "Disable Performance Counters" и после этого пробовать подключаться. Перезагрузка не нужна
зы движок форума слеши глотает, поэтому пробелами отделил секции
Пиши двойной слэш, как в сях ;-)