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

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

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

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

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

4b9b3361

Ответ 1

Я написал это, чтобы поднять perms и добавить записи 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();
    }
}

Ответ 2

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

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

В. По умолчанию только SYSTEM или локальная группа "Администраторы" могут прослушивать http-префиксы

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

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

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

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