С# HttpListener без использования netsh для регистрации URI

Мое приложение использует небольшой веб-сервер для хранения некоторых файлов и имеет веб-интерфейс для удаленного администрирования. Прямо сейчас пользователь должен использовать netsh для регистрации URI следующим образом.

netsh http add urlacl url=http://+:1233/ user=Chris-PC\Chris

Что не доставляет удовольствия обычному пользователю. Я бы хотел, чтобы программа могла прослушивать любой порт, указанный пользователем из моей программы, без необходимости использования конечным пользователем командной строки. Есть ли способ выполнить это, если не использовать Process.Start и запустить командную строку самостоятельно?


person Christopher Tarquini    schedule 06.04.2010    source источник
comment
Я так понимаю, вы знаете, что командная строка не будет работать в Windows XP, верно?   -  person Rowland Shaw    schedule 06.04.2010
comment
Насколько я знаю, это только для Vista и Win7.   -  person Christopher Tarquini    schedule 06.04.2010
comment
См. этот вопрос здесь: stackoverflow.com/questions/6851161/ Для этого существует Win32 API.   -  person Travis    schedule 23.12.2011


Ответы (2)


Я написал это, чтобы повысить разрешения и добавить записи http ACL через netsh.

Пользователям будет предложено внести изменения в свою систему, но это лучше, чем ничего. Возможно, вы захотите сделать это в ответ на AddressAccessDeniedException.

public static class NetAclChecker
{
    public static void AddAddress(string address)
    {
        AddAddress(address, Environment.UserDomainName, Environment.UserName);
    }

    public static void AddAddress(string address, string domain, string user)
    {
        string args = string.Format(@"http add urlacl url={0} user={1}\{2}", address, domain, user);

        ProcessStartInfo psi = new ProcessStartInfo("netsh", args);
        psi.Verb = "runas";
        psi.CreateNoWindow = true;
        psi.WindowStyle = ProcessWindowStyle.Hidden;
        psi.UseShellExecute = true;

        Process.Start(psi).WaitForExit();
    }
}
person chillitom    schedule 12.04.2012
comment
1. На WinXP тоже работает? 2. Если вы хотите добавить acl, это здорово, как проверить, добавлен ли еще конкретный acl? - person Przemysław Michalski; 23.03.2014

Если вы используете HTTPListener, вы должны использовать httpconfig.exe или netsh для настройки вашего HTTPListener, потому что:

A. Насколько я знаю, для этого нет API для C#, только инструменты командной строки.

Б. По умолчанию только СИСТЕМА или локальная группа администраторов могут прослушивать префиксы http.

Итак... если ваше приложение работает под учетной записью пользователя, вам необходимо явно предоставить доступ (используя httpcfg.exe или netsh), потому что ваш HTTPHandler использует HTTP.sys для совместного использования портов с работающим веб-сервером (так что вы можете разместить свой собственный веб-приложение на порту 80, в то время как IIS также работает на порту 80).

Лучшим решением может быть использование реального встроенного веб-сервера для прослушивания нужного вам порта. Это не сработает, если другое приложение (например, IIS) уже использует порт, но, поскольку оно НЕ использует HTTP.sys для совместного использования портов, нет никаких ограничений безопасности в отношении того, какая учетная запись пользователя открывает/прослушивает порт. . Поскольку вы хотите, чтобы пользователь указал свой собственный порт, кажется приемлемым запустить его на другом порту, кроме порта 80.

Моя компания производит коммерческий продукт под названием веб-сервер Neokernel (http://www.neokernel.com), который работает ASP.NET и позволяет программно запускать/останавливать сервер и устанавливать конфигурации; вы можете встраивать и распространять эту сборку вместе с приложением.

Существует также исходный код Cassini, который вы можете изменить и внедрить, он бесплатный, но имеет пару недостатков, таких как отсутствие ведения журнала или поддержка SSL.

person Damien    schedule 06.05.2010
comment
API для их программного изменения — HttpSetServiceConfiguration - person Mitch; 26.10.2015