Могу ли я прослушивать порт (используя HttpListener или другой код .NET) в Vista, не требуя привилегий администратора?

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

Из того, что я прочитал, это ожидаемое поведение - администратор необходимы привилегии, чтобы начать прослушивание порта. Но я уверен, что есть способы обойти это, поскольку я запускаю множество программ (например, Skype), которые прослушивают порт, не требуя повышения прав администратора.

Есть ли способ сделать это с помощью HttpListener? Если нет, могу ли я сделать другие вызовы API в коде .NET для настройки порта?


person Jon Galloway    schedule 04.10.2008    source источник
comment
Вау, я не знала об этом! Судя по предоставленной вами ссылке, похоже, что это не так. :(   -  person leppie    schedule 04.10.2008
comment
В Windows 10 похоже, что вы можете сделать это без регистрации на определенных портах. Не уверен в точном диапазоне портов, но для меня порты 5000-10000 работают без регистрации, работая как пользователь без прав администратора. Более высокие порты требуют netsh http add urlac для регистрации URL-адресов (запускаемых от имени администратора один раз или во время установки).   -  person Rick Strahl    schedule 06.03.2019


Ответы (5)


Я никогда не использовал HttpListener, но из вашего описания это больше похоже на то, что вы хотите прослушивать обычный TCP-порт, вместо того, чтобы встраивать свое приложение в пространство имен URL-адресов сервера (что, по-видимому, делает HttpListener). Вы должны иметь возможность использовать обычные функции сокетов (System.Net.Sockets.TcpListener) для открытия и прослушивания TCP-порта без прав администратора. Я почти уверен, что Skype не использует HttpListener.

person Greg Hewgill    schedule 04.10.2008
comment
Интересно - думаю, это лучший план. Я буду обрабатывать HTTP-запросы, поэтому сложно отказаться от HttpListener, но я думаю, что это лучшая идея. Я нашел две ссылки, которые могут помочь: is.gd/3wuX is.gd/3wv2 - person Jon Galloway; 04.10.2008
comment
Однако администратору придется открыть брандмауэр. - person js2010; 18.12.2020

Хотя вы можете написать свой собственный HTTP-сервер, используя обычный TCP / IP (это относительно просто), проще использовать HttpListener, который использует преимущества функциональности HTTP.SYS, добавленной в Windows XP SP2.

Однако HTTP.SYS добавляет концепцию списков ACL URL. Частично это связано с тем, что HTTP.SYS позволяет вам выполнять привязку к подпространствам имен на порту 80. Использование TCP / IP напрямую позволяет избежать этого требования, но означает, что вы не можете выполнить привязку к уже используемому порту.

В Windows XP вы можете использовать программу HttpCfg.exe для настройки URL ACL, предоставляя вашей учетной записи право на привязку к определенному URL. Это в примерах Platform SDK.

В Windows Vista HTTPCFG по-прежнему поддерживается, но функциональность была поглощена NETSH:

netsh http show urlacl

... покажет список существующих URL-адресов ACL. Списки ACL выражаются в SDDL.

netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\User listen=yes

... настроит пространство имен MyURI так, чтобы DOMAIN \ User мог прослушивать запросы.

person Roger Lipscombe    schedule 12.10.2008
comment
ух ты. вы вернулись через 4 месяца, чтобы отредактировать одно слово в своем сообщении? впечатляет, сэр :) - person Jeff Atwood; 08.02.2009
comment
Это то, что мне нужно в моей ситуации: netsh http add urlacl url = http: // *: 8080 / user = \ Every listen = yes - person pwhe23; 02.05.2018
comment
Тем не менее, вам по-прежнему нужны права администратора для запуска этих команд, чтобы включить порты. - person Rick Strahl; 03.03.2019
comment
Что ж, да, но вам нужно сделать это только один раз, во время установки. - person Roger Lipscombe; 03.03.2019

Если вам нужно обрабатывать запросы только с вашего собственного компьютера (обычно в целях тестирования), вы можете написать localhost вместо * в префиксе.

Например, вместо http: // *: 9669 / можно написать http: // localhost: 9669 /. Это отлично работает с HttpListener и не требует прав администратора (по крайней мере, в Windows 7).

person Lu55    schedule 23.03.2011
comment
Я нашел этот ответ полезным более трех лет спустя. Если вы получили HttpListenerException с сообщением Access is denied, возможно, порт уже используется другим процессом. - person Don 01001100; 27.06.2014
comment
Здесь, в Windows 10 с использованием ServiceHost, я не могу этого подтвердить. При установке базового адреса с определенным IP-адресом в netstat я вижу, что он все равно будет привязан к 0.0.0.0, что потребует повышенных привилегий. - person nl-x; 25.08.2016

Ну мне пришлось иметь дело с чем-то подобным. Мой компьютер находится в ограниченном домене, поэтому у меня нет прав администратора. После некоторого исследования и чтения я нашел эту ветку, и подсказки 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"
    [...]

Пусть это поможет любому найти эту ветку.

person rob    schedule 12.07.2011
comment
Отличная находка! Я думаю, что @Don01001100 прокомментировал это answer связан с этим ответом. Итак, рассмотрите другое приложение (например, IIS, Apache, Skype, ...), использующее порт 80, если вы получаете сообщение Access is denied-message. - person ischas; 29.07.2014

В XP вам нужно было использовать командную строку (httpcfg), чтобы сначала открыть порт, иначе это не сработает для пользователей, не являющихся администраторами.

См. здесь - на странице объясняется проблема, и есть zip внизу, чтобы его можно было использовать.

person Marc Gravell    schedule 04.10.2008