C # HttpListener без использования netsh для регистрации URI - PullRequest
20 голосов
/ 06 апреля 2010

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

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

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

Ответы [ 2 ]

31 голосов
/ 12 апреля 2012

Я написал это для повышения разрешений и добавления записей ACL http через 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();
    }
}
1 голос
/ 06 мая 2010

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

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

B. По умолчанию только 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.

...