Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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 внизу, чтобы сделать его пригодным для использования.