Могу ли я слушать порт (используя HttpListener или другой код .NET) на Vista, не требуя административных привилегий администратора?
Я использую HttpListener, чтобы позволить пользователю настроить прокси-сервер на определенном пользователем порте. Когда я запускаю HttpListener, я получаю исключение, если приложение не работает под правами администратора в Vista.
Из того, что я прочитал, это ожидаемое поведение - необходимы права администратора, чтобы начать прослушивание через порт. Но я уверен, что есть способы обойти это, поскольку я запускаю много программ (например, Skype), которые прослушивают порт, не требуя повышения до администратора.
Есть ли способ сделать это с помощью HttpListener? Если нет, могу ли я сделать другие вызовы API в .NET-коде для настройки порта?
Ответы
Ответ 1
Я никогда не использовал HttpListener, но из вашего описания это похоже на то, что вы хотите прослушивать обычный TCP-порт, вместо того, чтобы внедрять ваше приложение в пространство имен URL-адресов сервера (что, по-видимому, делает HttpListener). Вы должны иметь возможность использовать обычные функции сокетов (System.Net.Sockets.TcpListener), чтобы открывать и прослушивать порт TCP, не требуя прав администратора. Я почти уверен, что Skype не использует HttpListener.
Ответ 2
Хотя вы можете написать свой собственный HTTP-сервер, используя обычный TCP/IP (это относительно просто), проще использовать HttpListener, который использует функциональность HTTP.SYS, добавленную в Windows XP SP2.
Однако HTTP.SYS добавляет концепцию ACL-адресов. Отчасти это связано с тем, что HTTP.SYS позволяет вам связываться с подпространственными пространствами на порту 80. Использование TCP/IP позволяет избежать этого требования, но означает, что вы не можете привязываться к уже используемому порту.
В Windows XP вы можете использовать программу HttpCfg.exe для настройки ACL-адреса, предоставляющего вашей учетной записи пользователя право привязываться к определенному URL-адресу. Это в образцах платформы SDK.
В Windows Vista HTTPCFG по-прежнему поддерживается, но функциональность была включена в NETSH:
netsh http show urlacl
... покажет список существующих списков ACL. Списки ACL выражаются в SDDL.
netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\User listen=yes
... настроит пространство имен MyURI, чтобы DOMAIN\User мог слушать запросы.
Ответ 3
Если вам нужно обрабатывать запросы только с вашего собственного компьютера (обычно для целей тестирования), вы можете написать localhost вместо * в префиксе.
Например, вместо "http://*: 9669/" вы можете написать "http://localhost: 9669/". Это отлично работает с HttpListener и не требует административных привилегий (по крайней мере, в Windows 7).
Ответ 4
Ну, мне пришлось иметь дело с чем-то подобным. Мой компьютер находится в ограниченном домене, поэтому у меня нет прав администратора. После некоторых исследований и чтения я нашел эту нить, и подсказки netsh заставили меня использовать временные привязки acl только для разработки тестов. На моем компьютере это правило существует.
В этой записи:
Запустите 'netsh http show urlacl' (как показано выше)
[...]
Reservierte URL : http://+:80/Temporary_Listen_Addresses/
Benutzer: \Jeder
Abhören: Yes
Delegieren: No
SDDL: D:(A;;GX;;;WD)
[...]
Поэтому я могу использовать HttpListener как non-admin (Jeder):
[...]
HttpListener l = new HttpListener();
string prefix = "http://+:80/Temporary_Listen_Addresses/";
l.Prefixes.Add(prefix);
l.Start(); // does not throw any "Permission Denied/Access Denied/Zugriff verweigert"
[...]
Пусть это поможет любому найти эту тему.
Ответ 5
В XP вам нужно было использовать командную строку (httpcfg), чтобы сначала открыть порт, иначе он не будет работать для не-админов.
Смотрите здесь - страница объясняет проблему, и есть zip внизу, чтобы сделать его пригодным для использования.