27 Stimmen

C# HttpListener ohne Verwendung von netsh zur Registrierung eines URI

Meine Anwendung verwendet einen kleinen Webserver, um einige Dateien zu speichern und eine Webschnittstelle für die Fernverwaltung zu haben. Im Moment muss der Benutzer netsh verwenden, um den URI wie folgt zu registrieren

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

Das ist für den Durchschnittsnutzer kein Spaß. Ich möchte, dass das Programm in der Lage ist, jeden vom Benutzer angegebenen Port aus meinem Programm heraus zu überwachen, ohne dass der Endbenutzer die Eingabeaufforderung verwenden muss. Gibt es eine Möglichkeit, dies zu erreichen, indem ich einfach Process.Start verwende und die Eingabeaufforderung selbst ausführe?

34voto

chillitom Punkte 23318

Ich habe dies geschrieben, um die Berechtigungen zu erhöhen und http-ACL-Einträge über netsh .

Die Benutzer werden aufgefordert, Änderungen an ihrem System vorzunehmen, aber das ist besser als nichts. Vielleicht möchten Sie dies als Reaktion auf eine 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();
    }
}

1voto

Damien Punkte 676

Wenn Sie einen HTTPListener verwenden, müssen Sie httpconfig.exe oder netsh verwenden, um Ihren HTTPListener zu konfigurieren, denn:

A. AFAIK gibt es keine API, um dies von C# aus zu tun, nur die Befehlszeilentools

B. Standardmäßig können nur SYSTEM oder die lokale Administratorengruppe auf http-Präfixe hören

Also... wenn Ihre Anwendung unter dem Benutzerkonto läuft, müssen Sie explizit Zugriff gewähren (mit httpcfg.exe oder netsh), weil Ihr HTTPHandler die HTTP.sys verwendet, um Ports mit dem laufenden Webserver zu teilen (so können Sie Ihre eigene Webanwendung auf Port 80 hosten, während IIS auch auf Port 80 läuft).

Eine bessere Lösung wäre es, einen eingebetteten Webserver zu verwenden, der auf dem benötigten Port lauscht. Dies wird nicht funktionieren, wenn eine andere Anwendung (z. B. IIS) den Port bereits verwendet, aber da dieser HTTP.sys nicht für die Portfreigabe verwendet, gibt es keine Sicherheitseinschränkungen bezüglich des Benutzerkontos, das den Port öffnet/abhört. Da Sie möchten, dass der Benutzer seinen eigenen Port angibt, scheint es akzeptabel, auf einem anderen Port als Port 80 zu laufen.

Mein Unternehmen stellt ein kommerzielles Produkt namens Neokernel Web Server ( http://www.neokernel.com ), die ASP.NET ausführt und mit der Sie den Server programmatisch starten/stoppen und Konfigurationen festlegen können; Sie können diese Assembly in die Anwendung einbetten und verteilen.

Es gibt auch den Cassini-Quellcode, den Sie verändern und einbetten können. Er ist kostenlos, hat aber einige Nachteile wie keine Protokollierung oder SSL-Unterstützung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X