Pergunta

Meu aplicativo usa um pequeno servidor da web para servir alguns arquivos e ter uma interface da Web para administração remotamente. No momento, o usuário tem que usar o netsh para registrar o URI como assim

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

O que não é divertido para o usuário médio. Gostaria que o programa pudesse ouvir em qualquer porta especificada pelo usuário do meu programa sem que o usuário final precise usar o prompt de comando. Existe alguma maneira de conseguir isso com falta de apenas usar o processo.

Foi útil?

Solução

Eu escrevi isso para elevar as perms e adicionar entradas HTTP ACL através netsh.

Os usuários serão solicitados a fazer alterações no topo do seu sistema, mas é melhor do que nada. Você pode querer fazer isso em resposta a um EndereçoAccessdeniedException

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();
    }
}

Outras dicas

Se você estiver usando um httplistener, precisará usar httpconfig.exe ou netsh para configurar seu httplistener, porque:

A. Afaik Não há API para fazer isso de C#, apenas as ferramentas da linha de comando

B. Por padrão, o sistema somente ou o grupo de administradores locais podem ouvir prefixos HTTP

Então ... se o seu aplicativo estiver em execução na conta do usuário, você precisará conceder acesso explicitamente (usando httpcfg.exe ou netsh) porque seu httphandler usa o http.sys para compartilhar portas com o servidor da web em execução (para que você possa hospedar seu próprio Web App na porta 80 enquanto o IIS também está em execução na porta 80).

Uma solução melhor pode ser usar um servidor web incorporado real para ouvir na porta que você precisa. Isso não funcionará se outro aplicativo (por exemplo, IIS) já estiver usando a porta, mas como isso não usa o http.sys para compartilhar portas, não há restrições de segurança sobre qual conta de usuário está abrindo /ouvindo na porta . Como você deseja que o usuário especifique sua própria porta, parece aceitável executar em outra porta além da porta 80.

Minha empresa faz um produto comercial chamado Neokernel Web Server (http://www.neokernel.com) que executa asp.net e permite iniciar/interromper programaticamente o servidor e definir configurações; Você pode incorporar e distribuir esta montagem com o aplicativo.

Há também o código -fonte da Cassini que você pode modificar e incorporar, é gratuito, mas possui algumas desvantagens, como nenhum suporte ou suporte SSL.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top