HttpAddUrl на localhost не работает для пользователей без прав администратора - PullRequest
2 голосов
/ 17 июля 2011

Использование Windows HTTP API. Я запускаю файловый сервер HTTP на localhost.

Это включает вызов HttpAddUrl(hRequestQueue, L"http://localhost:80/", NULL).

С ошибкой ERROR_ACCESS_DENIED, если пользователь не запускает приложение.как администраторМне нужен этот функционал для пользователей, которые не имеют прав администратора.(В любом случае, что не так с пользователем, работающим с сервером localhost? Это только для самого пользователя.)

Я нашел исправление для Vista и XP , которое, похоже, нацелено на решение этой проблемы, но в этом нет ничегодля Windows 7. В статье подразумевается, что это было исправлено в Vista SP1, и у меня Windows 7 SP1, и это все еще проблема - не удалось ли исправить это в Windows 7?

Есть ли что-то еще, что я могу сделать, чтобызаставить сервер работать без прав администратора?

Ответы [ 3 ]

5 голосов
/ 27 сентября 2011

Это необходимо настроить на системном уровне, поскольку HTTP API использует http.sys (драйвер ядра).Вы можете использовать команду netsh.exe, выполняемую с правами администратора, чтобы предоставить доступ пользователю или приложению:

netsh http add urlacl url=http://localhost:80/ user=EVERYONE listen=yes delegate=no
3 голосов
/ 17 июля 2011

Отвечая на мой вопрос, но нашел обходной путь: Номера портов IANA Состояния портов 49152-65535 предназначены для динамических / частных целей.HttpAddUrl для локального хоста через порт> = 49152 отлично работает для не администраторов.

1 голос
/ 10 августа 2017

Порты 1 - 1024 по умолчанию требуют административного доступа.В противном случае вы получите код ошибки 5 (ACCESS_DENIED).Если вы попытаетесь подключиться к порту выше 1024, например:

http://localhost:8080/

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

Все в Windows контролируется списками контроля доступа (ACL);это включает порты прослушивания, разрешенные при использовании HttpServer.Вы можете отобразить текущие ACL, используемые http, запустив:

>netsh http show urlacl

Если вы сделаете это, вы увидите множество ACL, уже определенных различными системами.

Windows Communication Foundation

Одна запись ACL особенно интересна:

Reserved URL            : http://+:80/Temporary_Listen_Addresses/
   User: \Everyone
      Listen: Yes
      Delegate: No
      SDDL: D:(A;;GX;;;WD)

Всем предоставляется право прослушивать порт 80, пока вы живете.из:

/Temporary_Listen_Addresses/

Этот URL-адрес используется Windows Communication Foundation (WCF), который обычно создает URL-адрес в виде:

http://+:80/Temporary_Listen_Addresses/{random-guid}/

Это также означает, что если вы на самом деле хотите порт 80, вы можете слушать его самостоятельно, например:

http://localhost:80/Temporary_Listen_Addresses/64E3DCC6-FE47-4A86-87F4-48D2E1B44AE9/ 

Пока никто не использует порт 80 (я смотрю на ваш Skype!), вы будетеполучите.

Для прослушивающих сокетов WinSock не требуется admin

. Хотя HttpServer API имеет ACL, управляющие доступом к портам ниже 1024, следует отметить, что WinSock API не имеет ограничений.1041 *

Если вы хотите использовать WinSock для открытия прослушивающего сокета на порту 80, вам не нужно быть администратором.ACL имеет только Http API.

...