Domanda

La mia applicazione utilizza un piccolo server web per server alcuni file e avere un'interfaccia Web per l'amministrazione da remoto. In questo momento l'utente deve utilizzare netsh per registrare l'URI in questo modo

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

Il che non è divertente per l'utente medio. Vorrei che il programma potesse ascoltare su qualsiasi porta specificata dall'utente dal mio programma senza che l'utente finale abbia bisogno di utilizzare il prompt dei comandi. C'è comunque per realizzare questo a corto di semplice utilizzo di Process.Vert ed Esecuzione dei comandi?

È stato utile?

Soluzione

L'ho scritto per elevare i permini e aggiungere voci ACL HTTP Netsh.

Gli utenti verranno richiesti di apportare modifiche al massimo del sistema, ma è meglio di niente. Potresti volerlo in risposta a un Indirizzo AccessDenieDException

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

Altri suggerimenti

Se si utilizza un httplistener, è necessario utilizzare httpconfig.exe o netsh per configurare il tuo httplistener, perché:

A. AFAIK Non esiste API per farlo da C#, solo gli strumenti della riga di comando

B. Per impostazione predefinita solo il sistema o il gruppo di amministratori locali possono ascoltare i prefissi HTTP

Quindi ... se la tua app è in esecuzione sotto l'account dell'utente, è necessario concedere esplicitamente l'accesso (utilizzando httpcfg.exe o netsh) perché il tuo httphandler utilizza http.sys per condividere le porte con il Webserver in esecuzione (in modo da poter ospitare il tuo App Web sulla porta 80 mentre IIS è in esecuzione anche sulla porta 80).

Una soluzione migliore potrebbe essere quella di utilizzare un server Web incorporato effettivo per ascoltare la porta necessaria. Questo non funzionerà se un'altra applicazione (ad esempio IIS) sta già utilizzando la porta, ma poiché ciò non utilizza Http.sys per la condivisione delle porte, non ci sono restrizioni di sicurezza su quale account utente si sta aprendo /ascoltando sulla porta . Poiché si desidera che l'utente specifichi la propria porta, sembra accettabile funzionare su un'altra porta oltre alla porta 80.

La mia azienda crea un prodotto commerciale chiamato Neokernel Web Server (http://www.nekernel.com) che esegue ASP.NET e consente di avviare/arrestare a livello di programmazione il server e impostare le configurazioni; È possibile incorporare e distribuire questo assembly con l'applicazione.

C'è anche il codice sorgente Cassini che puoi modificare e incorporare, è gratuito ma ha un paio di svantaggi come nessuna registrazione o supporto SSL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top