Получение пакета ICMP в контексте службы в 2008 году - PullRequest
0 голосов
/ 31 марта 2009

Когда мы отправляем пакет из порта udp, мы получаем исключение, если сеть возвращает узел ICMP, недоступный. Исключение не говорит нам ничего полезного (например, содержимое пакета ICMP).

Нет проблем, мы просто послушаем ICMP, и это даст нам необходимую информацию, игнорируя при этом исключение для порта UDP. Итак, откройте необработанный сокет, прослушайте ICMP-пакеты и идите оттуда.

Отлично работает в разработке (Win XP), но в работе на сервере 2008 кажется, что контекст безопасности, в котором работает исполняемый файл, должен иметь права администратора, чтобы иметь возможность открывать необработанный сокет. Это бесполезно для службы. Если я понимаю, что говорит Microsoft, то единственный способ сделать то, что мы хотим, - запустить наш сервис под учетной записью с правами администратора. Для арахиса это похоже на кувалду, не говоря уже о потенциальной дыре в безопасности, связанной с работой службы, работающей в сети, под учетной записью администратора.

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

Кто-нибудь получил какие-либо комментарии / намеки или сочувствие?

Ответы [ 3 ]

1 голос
/ 14 апреля 2009

Вместо того, чтобы прослушивать ответы ICMP на ваши неудачные UDP-отправления, почему бы не послать совершенно новый эхо-запрос ICMP?

Когда вы получите исключение, вы можете вызвать функцию IcmpSendEcho() (из Win32 IP Helper API), чтобы самостоятельно генерировать новый эхо-запрос ICMP. Бит ключа в том, что функция возвращает буфер с эхо-ответом в нем , включая коды состояния, например, IP_DEST_HOST_UNREACHABLE.

Я не думаю, что для этого вам нужны какие-либо особые привилегии, поэтому это должно быть проще, чем прослушивать ответы ICMP с необработанными сокетами.

Вам понадобятся три функции: IcmpCreateFile(), IcmpSendEcho() и IcmpCloseHandle() - PInvoke.net имеет необходимые детали взаимодействия:

http://www.pinvoke.net/default.aspx/icmp/IcmpCreateFile.html http://www.pinvoke.net/default.aspx/icmp/IcmpSendEcho.html http://www.pinvoke.net/default.aspx/icmp/IcmpCloseHandle.html

0 голосов
/ 31 марта 2009

С веб-сайта MSDN :

Чтобы использовать сокет типа SOCK_RAW требует административных привилегий. Пользователи, использующие приложения Winsock которые используют сырые сокеты должны быть членами группы администраторов на локальный компьютер, иначе необработанный сокет вызовы не будут выполнены с кодом ошибки WSAEACCES. В Windows Vista и более поздних версиях доступ к необработанным сокетам осуществляется в создание сокетов. В более ранних версиях Windows, доступ для необработанных сокетов применяется во время другого сокета операции.

Чтобы обойти эту проблему в своем проекте, я создал службу Windows, которая служит сетевым прокси для нашего приложения пользовательского интерфейса. Служба Windows работает под учетной записью локального администратора, чтобы обойти ограничения. Приложение подключается к сервису с помощью WCF, сообщая ему, какой тип сокета открывать и какие фильтры применять. Затем данные отправляются обратно с помощью обратного вызова, используя Protocol Buffers для кодирования (по крайней мере, это план - часть обратного вызова все еще выполняется).

0 голосов
/ 31 марта 2009

У меня точно такая же проблема Прослушивание ICMP-пакетов в C # . На самом деле похоже, что ваша проблема связана с разрешениями Windows, поэтому сообщение не поможет.

Одна область, в которую я планировал углубиться, - это проверить, есть ли в SocketException больше информации, генерируемой UdpListener. Просто кажется неоправданным, что, поскольку Windows использует пакет ICMP для генерации исключения, она не будет записывать информацию в этот пакет где-то.

Как и вы, я не смог далеко продвинуться в получении информации ICMP из информации об исключениях на уровне .Net, но я хочу посмотреть, есть ли что-нибудь еще, что можно получить с помощью Win32 API, например GetLastError или некоторые другие вызовы специально для WinSock32.

...