Posso escutar uma porta (usando HttpListener ou outro código .NET) no Vista sem a necessidade de privilégios de administrador? [duplicado]

StackOverflow https://stackoverflow.com/questions/169904

  •  05-07-2019
  •  | 
  •  

Pergunta

Esta questão já tem uma resposta aqui:

Eu estou usando HttpListener para permitir que um usuário configurar um proxy em uma porta definida pelo usuário. Quando eu iniciar o HttpListener, recebo uma exceção se o aplicativo não está sendo executado com privilégios de administrador no Vista.

Pelo que tenho lido, esse comportamento é esperado - privilégios de administrador são necessários para iniciar a escuta em uma porta. Mas estou certo de que há maneiras de contornar isso, como eu corro abundância de programas (como o Skype) que escutam em uma porta sem a necessidade de elevação para administrador.

Existe uma maneira de fazer isso com HttpListener? Se não, eu posso fazer outras chamadas de API em código .NET para configurar a porta?

Foi útil?

Solução

Eu nunca usei um HttpListener, mas a partir de sua descrição soa mais como você quer escutar uma porta TCP regular, em vez de incorporar a sua aplicação em um namespace URL do servidor (que é o que HttpListener parece fazer). Você deve ser capaz de usar soquete funções regulares (System.Net.Sockets.TcpListener) para abrir e escutar uma porta TCP sem a necessidade de privilégios de administrador. Tenho quase certeza de que o Skype não usar um HttpListener.

Outras dicas

Enquanto você pode escrever seu próprio servidor HTTP usando TCP / IP normal (que é relativamente simples), é mais fácil de usar HttpListener, que aproveita o HTTP.SYS funcionalidades adicionais no Windows XP SP2.

No entanto, HTTP.SYS acrescenta o conceito de URL ACLs. Isto é em parte porque HTTP.SYS permite-lhe ligar-se a sub-namespaces na porta 80. Usando TCP / IP evita diretamente a esse requisito, mas significa que você não pode vincular a uma porta que já está em uso.

No Windows XP, você pode usar o programa Httpcfg.exe para configurar uma URL ACL conceder o usuário conta o direito de se ligam a uma determinada URL. É nas amostras Platform SDK.

No Windows Vista, Httpcfg é ainda suportada, mas a funcionalidade foi absorvida NETSH:

netsh http show urlacl

... irá mostrar uma lista de ACLs URL existentes. As ACLs são expressos em SDDL.

netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\User listen=yes

... irá configurar o namespace MyURI para que domínio \ usuário pode ouvir pedidos.

Se você precisar pedidos tratar apenas de você próprio computador (geralmente para fins de teste), você pode escrever localhost em vez de * no prefixo.

Por exemplo, em vez de "http: // *: 9669 /" você pode escrever "http: // localhost: 9669 /". Esta multa trabalha com HttpListener e não requer privilégios administrativos (pelo menos no Windows 7).

Bem, eu tive que lidar com algo semelhante. Meu computador está em um domínio restrito, então eu não ter privilégios de administrador. Depois de alguma pesquisa e leitura eu achei esta discussão e as sugestões netsh me fez usar ligações acl temporários apenas para o desenvolvimento de testes. No meu computador existe estes regra.

Há esta entrada:

Executar 'netsh http mostra urlacl' (como mostrado acima)

    [...]
        Reservierte URL            : http://+:80/Temporary_Listen_Addresses/
            Benutzer: \Jeder
                Abhören: Yes
                Delegieren: No
                SDDL: D:(A;;GX;;;WD)
    [...]

Para que eu possa usar a como não-admin (Jeder) HttpListener:

    [...]
    HttpListener l = new HttpListener();
    string prefix = "http://+:80/Temporary_Listen_Addresses/";
    l.Prefixes.Add(prefix);
    l.Start(); // does not throw any "Permission Denied/Access Denied/Zugriff verweigert"
    [...]

maio deste ajuda a alguém encontrar esta discussão.

No XP, você tinha que usar uma linha de comando (httpcfg) para abrir a primeira porta, caso contrário ele não iria funcionar para não-administradores.

aqui - a página explica o problema, e há um zip na parte inferior para torná-lo utilizável.

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