Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Определение факта подключения/отключения локального компьютера к определённому адресу

7
25 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Как можно динамически отследить факт подключения компьютера к определённым адресам?
Суть состоит в том, что у нас несколько человек подключаются к виртуальным машинам по RDP через MSTSC, и если на ту машину, куда уже кто-то подключен, подключится ещё один человек, второго выкинет. Хочу написать программу, которая отслеживает эти подключения (может, есть вариант через MSTSC отследить) и сообщает остальным о статусе виртуалок.
260
25 июня 2015 года
Ramon
1.1K / / 16.08.2003
Поставьте в вм серверную версию выня и никого "выкидывать" не будет.
85K
25 июня 2015 года
Иван Лазарев
18 / / 25.06.2015
1) Чтобы не блокировало, используйте mstsc в shadow режиме, тогда не будет выкидывать
2) Лично у меня на работе есть схожая проблема, но у нас важную сессию постоянно кто-то закрывает, и из-за этого перестают выполняться 1С обработки по расписанию. Я написал костыль: программа по таймеру получает список запущенных процессов на удаленной машине (win api не скажу, могу с .net помочь), если флаговый процесс (то есть специальный, написанный мной и висящий в автозагрузке) не запущен - программа считает, что сессия закрыта и запускает mstsc с параметрами. В вашем случае можно поступить также: если флаговый процесс запущен - значит, кто-то уже сидит. Если этот кто-то потом нажмет на выход или сессия отвалится по истечении времени неактивности, процесс будет снят системой, если в списке запущенных он отсутствует - значит, вход свободен
7
25 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
У нас система серверная, Windows Server 2008. Только это уже не от нас зависит, сервера в Москве, и там что поставили, то и будет стоять.
Суть в том, что заходить надо под одним пользователем — под разными-то не кидало бы.

Я вижу 2 решения: либо через мистический и неизвестный мне MSTSC API узнавать, подключен ли текущий компьютер к виртуалке, либо периодически запускать перечисление всех подключений (как NetStat, надо узнать функции) и на основании их анализа уже делать выводы. В 1-м случае я вообще не ознакомлен с темой, во 2-м — сейчас буду пытаться что-то накопать (но если есть выход лучше, типа оповещений о подключении, которые можно перехватить/подписаться на них, то я был бы рад).
85K
25 июня 2015 года
Иван Лазарев
18 / / 25.06.2015
Цитата: @pixo $oft
У нас система серверная, Windows Server 2008. Только это уже не от нас зависит, сервера в Москве, и там что поставили, то и будет стоять.
Суть в том, что заходить надо под одним пользователем — под разными-то не кидало бы.

Я вижу 2 решения: либо через мистический и неизвестный мне MSTSC API узнавать, подключен ли текущий компьютер к виртуалке, либо периодически запускать перечисление всех подключений (как NetStat, надо узнать функции) и на основании их анализа уже делать выводы. В 1-м случае я вообще не ознакомлен с темой, во 2-м — сейчас буду пытаться что-то накопать (но если есть выход лучше, типа оповещений о подключении, которые можно перехватить/подписаться на них, то я был бы рад).

Огород не городите. Никаких "MSTSC API" в природе не существует. Shadow mode вам в помощь. Если по каким-то причинам у вас бан в гугле, то вот хорошая ссылка: http://habrahabr.ru/post/147273/

7
25 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Огород не городите. Никаких "MSTSC API" в природе не существует. Shadow mode вам в помощь. Если по каким-то причинам у вас бан в гугле, то вот хорошая ссылка: http://habrahabr.ru/post/147273/

Так-то есть большой раздел по RDS, поэтому я не советовал бы столь радикально выражаться :D
Эту самую ссылку я нашёл, но:
0) там сказано про взаимодействие с локальным пользователем, а у нас все пользователи удалённо подключаются;
1) на наших виртуалках установлена WS 2008;
2) никаких id сеансов у нас нет, да и как мы их узнаем, если для этого подключаться надо?

260
25 июня 2015 года
Ramon
1.1K / / 16.08.2003
Цитата: @pixo $oft
У нас система серверная, Windows Server 2008. Только это уже не от нас зависит, сервера в Москве, и там что поставили, то и будет стоять.
Суть в том, что заходить надо под одним пользователем — под разными-то не кидало бы.

Я вижу 2 решения: либо через мистический и неизвестный мне MSTSC API узнавать, подключен ли текущий компьютер к виртуалке, либо периодически запускать перечисление всех подключений (как NetStat, надо узнать функции) и на основании их анализа уже делать выводы. В 1-м случае я вообще не ознакомлен с темой, во 2-м — сейчас буду пытаться что-то накопать (но если есть выход лучше, типа оповещений о подключении, которые можно перехватить/подписаться на них, то я был бы рад).

Под одним пользователем - вы что-то явно делаете не так и решаете проблему которую не нужно решать. Создать группу пользователей раздать ей права и прекратить заниматься странным.

7
25 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Ramon
Под одним пользователем - вы что-то явно делаете не так и решаете проблему которую не нужно решать. Создать группу пользователей раздать ей права и прекратить заниматься странным.

Мне это затруднительно объяснить. Суть в том, что этот пользователь берётся из нашей программы — он там является администратором (что-то типа сквозной идентификации, что ли). Соответственно, все операции должны делаться только через него.
Собственно, суть моего вопроса несколько иная — как сделать вышеописанное?

85K
25 июня 2015 года
Иван Лазарев
18 / / 25.06.2015
Цитата: @pixo $oft

Это сервисы WMI, а не "MSTSC API" - еще человека найдите, который грамотно сможет запрос составить к счетчикам производительности, я бы с таким пообщался.

Цитата: @pixo $oft
там сказано про взаимодействие с локальным пользователем, а у нас все пользователи удалённо подключаются

А вы почитайте дальше третьей строки - например, там, где про доменные настройки пользователя написано и настраивается взаимодействие с залогиненным сеансом

7
25 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Это сервисы WMI, а не "MSTSC API" - еще человека найдите, который грамотно сможет запрос составить к счетчикам производительности, я бы с таким пообщался

По ходу, не только я не умею читать дальше 3-й строки…☺
WMI — это самая малость того, что там можно сделать. Функции WTS, может, и не совсем то, что мне нужно, но я их в оборот возьму, сейчас буду исследовать.

85K
25 июня 2015 года
Иван Лазарев
18 / / 25.06.2015
Цитата: @pixo $oft
Это сервисы WMI, а не "MSTSC API" - еще человека найдите, который грамотно сможет запрос составить к счетчикам производительности, я бы с таким пообщался

По ходу, не только я не умею читать дальше 3-й строки…☺
WMI — это самая малость того, что там можно сделать. Функции WTS, может, и не совсем то, что мне нужно, но я их в оборот возьму, сейчас буду исследовать.

WMI - это огромная платформа, на ее базе построено большое количество унаследованных сервисов, не разводите флуд. Того, что было озвучено в этой теме для решения вашей проблемы более чем достаточно

7
25 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Я ему про Фому, он мне про Ерёму… О WMI там дан раздел в конце, а что это такое и каких масштабов, я прекрасно знаю.
Буду разбираться с функциями WTS пока, тем более, есть и поважнее дела.
10
26 июня 2015 года
Freeman
3.2K / / 06.03.2004
Я быстренько погуглил и нашел, что нужно последовательно вызвать WTSOpenServer, WTSQuerySessionInformation и WTSCloseServer, чтобы получить инфу о сеансе. Вот только не понял, можно ли это сделать с удаленной машины, поскольку оно хочет NetBIOS-имя сервера. Хотя если доступ к RDP через VPN, должно быть просто.
7
26 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Freeman
Я быстренько погуглил и нашел, что нужно последовательно вызвать WTSOpenServer, WTSQuerySessionInformation и WTSCloseServer, чтобы получить инфу о сеансе. Вот только не понял, можно ли это сделать с удаленной машины, поскольку оно хочет NetBIOS-имя сервера. Хотя если доступ к RDP через VPN, должно быть просто.

Собственно, я поверхностно это тоже пробежал, только времени не было вчера это закодить. Доступ у нас через VPN, да, поэтому надеюсь на положительный исход моих попыток ☺

1.8K
27 июня 2015 года
Kuzya
184 / / 19.03.2008
еще вариант, купить терминалные лицензии на сервер по количеству подключаемых пользвателей, но я так понимаю вам такой вариант не светит
7
27 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Kuzya
еще вариант, купить терминалные лицензии на сервер по количеству подключаемых пользвателей, но я так понимаю вам такой вариант не светит

Именно, т.е. у меня в наличии только то, что есть.

Начал пробовать через WTS, и сразу проблемы. В описании WTSOpenServer сказано, что ошибку надо проверять не по нулю, а по результату исполнения какой-нибудь функции. Пробовал через WTSEnumerateServers (потому что для WTSQuerySessionInformation нужен id сессии, который я пока не разбирался, как получить), так она возвращает ошибку, в то время как с WTS_CURRENT_SERVER_HANDLE всё работает отлично. ЧЯДНТ? Или каким ещё образом мне проверить валидность дескриптора открытого сервера?
Стучался и по имени (например, vm-name-00.dmn), и по IP, и даже "\\" в начале добавлял — всё равно не хочет!

85K
27 июня 2015 года
Иван Лазарев
18 / / 25.06.2015
Цитата: @pixo $oft
ЧЯДНТ?

Счетчики производительности на сервере включены? Ошибку в студию

7
27 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Включены, скорее всего. Только я не знаю, где и какие смотреть.
Ошибки конкретной нет, ибо WTSOpenServer ошибки не возвращает в любом случае, а WTSEnumerateServers просто возвращает false.
10
28 июня 2015 года
Freeman
3.2K / / 06.03.2004
На StackOverflow, на TechNet.
7
28 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Казалось бы, такая, на первый взгляд, несложная задача на поверку оказалась не такой уж и несложной.

Итак, по порядку.
Цитата: Freeman
На StackOverflow, на TechNet

Там, считай, ничего полезного нет. По 1-й ссылке ему не помогли, разве что процитировали участок MSDN. По 2-й ссылке — я поставил указанное значение в 1 на локальной машине (на сервере уже 1), перезагрузился, но ничего не изменилось.
Для тестирования использовал вот такой код:

 
Код:
HANDLE hWTS=WTSOpenServer("<SrvName>.<SrvDomain>");PWTS_SESSION_INFO pSess=0;DWORD dwCount=0;
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);
}
Возвращает также 5, т.е. доступ запрещён. Читая MSDN (тот участок, что процитировали по одной из ссылок), я понял, что надо как-то настроить права на удалённой машине. Но там у всех групп пользователей, перечисленных в оснастке удалённого управления, есть право Query. Может, там нет нужных групп пользователей?
Раскладка. Сервер состоит в домене, вход на него по RDP осуществляется через одну учётную запись. Мой компьютер в домене не состоит, подключаюсь по удалёнке через VPN. Исходя из этого, какого пользователя мне требуется добавить в разрешения? (там же вроде есть какая-то группа типа анонимных, прошедших проверку и в этом роде)
260
28 июня 2015 года
Ramon
1.1K / / 16.08.2003
Вот смотрите, вы в очередной раз собрали полный букет отрицательных фидбеков. И казалось бы логичным решением должно быть то, что должно было быть сделано в самом начале, а именно проектирование програмного комплекса. Остановитесь и подумайте, а не занимайтесь решением того, что с очень большой вероятностью и решать то не нужно.

PS: А теперь время забросать меня говном со словами мол все уже написано осталось только собрать вместе.
7
29 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Ramon
А теперь время забросать меня говном со словами мол все уже написано осталось только собрать вместе

Какашками закидывать не собирался, а вот поинтересоваться, что ты имел в виду, хочу.

Что ты подразумевал под отрицательными фидбеками? Да и с проектированием не всё так плохо — решение есть, но только надо понять, как его заставить работать. Т.к. поиск мне пока не дал ответа на вопрос, я узнаю у тех, кто может знать, как же избежать ошибки 5 «Доступ запрещён», например.

260
29 июня 2015 года
Ramon
1.1K / / 16.08.2003
  • Т.н. "выкидывание" => попытка узнать, а не сидит ли там кто (это мы еще не рассматриваем случай когда оба узнали что там никто не сидит и решили параллельно подключиться, внезапно "решение" не является "решением")
  • Активная борьба с правами и иной машинерией предназначенной совсем для другого

Вам мало негативных обратных связей? Они всю дорогу намекают пересмотреть решения, но планомерно игнорируются.
7
29 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Иных простых решений я не могу предположить. Даже размещение на сервере приложения, которое бы отслеживало все подключения, уже не то — придётся делать это на каждой машине, в то время как вариант с WTSOpenServer/… видится самым простейшим, надо только разобраться, как избежать "access denied",
Собственно, вся суть как раз и состоит в том, чтобы узнавать это без «выкидывания».
85K
30 июня 2015 года
Иван Лазарев
18 / / 25.06.2015
Цитата: @pixo $oft
Включены, скорее всего. Только я не знаю, где и какие смотреть.

в реестре по пути [HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services PerfProc Performance] нужно удалить ключ "Disable Performance Counters" и после этого пробовать подключаться. Перезагрузка не нужна
зы движок форума слеши глотает, поэтому пробелами отделил секции

7
30 июня 2015 года
@pixo $oft
3.4K / / 20.09.2006
Нет там такого параметра, ни на сервере, ни у меня. Ошибка 5 ("Access denied") по-прежнему случается при вызове функций WTS…().

Пиши двойной слэш, как в сях ;-)
327
04 июля 2015 года
UserNet2008
748 / / 03.04.2010
Цитата:
сервера в Москве

Порт он и на луне порт.
Проверям порт, если открыт , то другим вилы.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог