Могу ли я прослушивать порт (используя HttpListener или другой .NET-код) в Vista, не требуя прав администратора?[дубликат]
-
05-07-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
- Доступ к HttpListener Запрещен 10 ответов
Я использую HttpListener, чтобы разрешить пользователю настраивать прокси-сервер на определяемом пользователем порту.Когда я запускаю HttpListener, я получаю исключение, если приложение не запущено с правами администратора в Vista.
Из того, что я прочитал, это ожидаемое поведение - для начала прослушивания порта требуются права администратора.Но я уверен, что есть способы обойти это, поскольку я запускаю множество программ (например, Skype), которые прослушивают порт, не требуя прав администратора.
Есть ли способ сделать это с помощью HttpListener?Если нет, могу ли я выполнить другие вызовы API в .NET-коде для настройки порта?
Решение
Я никогда не использовал HttpListener, но из вашего описания это больше похоже на то, что вы хотите прослушивать обычный TCP-порт, вместо того, чтобы встраивать свое приложение в пространство имен URL сервера (что, по-видимому, и делает HttpListener).Вы должны иметь возможность использовать обычные функции сокета (System.Net.Sockets.TcpListener) для открытия и прослушивания TCP-порта, не требуя прав администратора.Я почти уверен, что Skype не использует HttpListener .
Другие советы
Хотя вы можете написать свой собственный HTTP-сервер, используя обычный TCP / IP (это относительно просто), проще использовать HttpListener, который использует преимущества HTTP.SYS функциональности, добавленной в Windows XP SP2.
Однако, HTTP.SYS добавляет концепцию списков управления доступом URL.Отчасти это связано с тем, что HTTP.SYS позволяет вам привязываться к подпространствам имен на порту 80.Прямое использование TCP / IP позволяет избежать этого требования, но означает, что вы не можете привязаться к порту, который уже используется.
В Windows XP вы можете использовать HttpCfg.exe программу для настройки ACL URL, предоставляющую вашей учетной записи пользователя право привязки к определенному URL.Это есть в примерах Platform SDK.
В Windows Vista HTTPCFG по-прежнему поддерживается, но функциональность была перенесена в NETSH:
netsh http show urlacl
...покажет список существующих ACL URL-адресов.Списки управления доступом выражены в SDDL.
netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\User listen=yes
...настроит пространство имен MyURI таким образом, чтобы ДОМЕН \ Пользователь мог прослушивать запросы.
Если вам нужно обрабатывать запросы только с вашего собственного компьютера (обычно в целях тестирования), вы можете написать локальный хост вместо * в префиксе.
Например, вместо "http://*:9669/" вы можете написать "http://localhost:9669/".Это прекрасно работает с HttpListener и не требует прав администратора (по крайней мере, в Windows 7).
Что ж, мне приходилось сталкиваться с чем-то подобным.Мой компьютер находится в домене с ограниченным доступом, поэтому у меня нет прав администратора.После некоторых исследований и чтения я нашел эту тему, и подсказки 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 как не-администратор (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"
[...]
Пусть это поможет кому-нибудь найти эту тему.
В XP вам приходилось использовать командную строку (httpcfg), чтобы сначала открыть порт, иначе это не сработало бы для не-администраторов.
Видишь здесь - на странице объясняется проблема, и есть застежка - молния внизу, чтобы сделать его пригодным для использования.