Ich schreibe einen HTTP-Server in C #.
Wenn ich versuche, die Funktion auszuführen, HttpListener.Start()
bekomme ich ein HttpListenerException
Sprichwort
"Zugriff abgelehnt".
Wenn ich die App im Admin-Modus unter Windows 7 starte, funktioniert sie einwandfrei.
Kann ich es ohne Admin-Modus laufen lassen? wenn ja wie? Wenn nicht, wie kann ich die App nach dem Start in den Admin-Modus ändern?
using System;
using System.Net;
namespace ConsoleApplication1
{
class Program
{
private HttpListener httpListener = null;
static void Main(string[] args)
{
Program p = new Program();
p.Server();
}
public void Server()
{
this.httpListener = new HttpListener();
if (httpListener.IsListening)
throw new InvalidOperationException("Server is currently running.");
httpListener.Prefixes.Clear();
httpListener.Prefixes.Add("http://*:4444/");
try
{
httpListener.Start(); //Throws Exception
}
catch (HttpListenerException ex)
{
if (ex.Message.Contains("Access is denied"))
{
return;
}
else
{
throw;
}
}
}
}
}
windows-7
c#-4.0
uac
httplistener
Randall Flagg
quelle
quelle
Antworten:
Ja, Sie können HttpListener im Nicht-Administratormodus ausführen. Sie müssen lediglich Berechtigungen für die jeweilige URL erteilen. z.B
Die Dokumentation ist hier .
quelle
httpListener.Prefixes.Add("http://*:4444/");
halber muss die in dieser Codezeile angegebene URL genau mit der imnetsh
Befehl angegebenen übereinstimmen . Zum Beispiel hatte ichhttpListener.Prefixes.Add("http://127.0.0.1:80/");
den gleichennetsh
Befehl wie Sie, und die HttpListenerException wird weiterhin ausgelöst. Ich musste mich ändernhttpListener.Prefixes.Add("http://+:80/");
Danke für deine Hilfe @Darrel Miller, weil du mich auf den richtigen Weg gebracht hast, um das herauszufinden!The parameter is incorrect
Fehlermeldung angezeigt . Beispiel:url=http://+:80/
http://localhost:80/
? Ich habe eine Desktop-Anwendung, die eine Anfrage unter einer solchen URL erhalten muss, und es scheint eine Schande zu sein, dass ein Administrator sie auf 50 Desktops installiert, nur für diesen einen Zweck.Sie können nicht, es muss mit erhöhten Berechtigungen beginnen. Sie können es mit dem
runas
Verb neu starten , wodurch der Benutzer aufgefordert wird, in den Administratormodus zu wechselnEDIT: Eigentlich stimmt das nicht; HttpListener kann ohne erhöhte Berechtigungen ausgeführt werden, Sie müssen jedoch die Berechtigung für die URL erteilen, die Sie abhören möchten. Siehe Darrel Millers Antwort für Details.
quelle
Wenn Sie
http://localhost:80/
als Präfix verwenden, können Sie http-Anforderungen abhören, ohne dass Administratorrechte erforderlich sind.quelle
http://localhost:80/
und einen "Zugriff verweigert" erhalten.httpListener.Prefixes.Add("http://*:4444/");
zeigt zwar einenAccess Denied
Fehler,httpListener.Prefixes.Add("http://localhost:4444/");
funktioniert aber ohne Probleme. Microsoft scheintlocalhost
von diesen Einschränkungen ausgeschlossen zu sein. Interessanterweise wirdhttpListener.Prefixes.Add("http://127.0.0.1:4444/");
immer noch ein Fehler "Zugriff verweigert" angezeigt. Das einzige, was funktioniert, istlocalhost:{any port}
Die Syntax war für mich falsch, Sie müssen die Anführungszeichen einfügen:
ansonsten habe ich "Der Parameter ist falsch" erhalten
quelle
/
in der URL angebenWenn Sie das Flag "user = Everyone" verwenden möchten, müssen Sie es an Ihre Systemsprache anpassen. In Englisch ist es wie erwähnt:
Auf Deutsch wäre es:
quelle
Als Alternative, für die weder Elevation noch Netsh erforderlich sind, können Sie beispielsweise auch TcpListener verwenden.
Das Folgende ist ein modifizierter Auszug dieses Beispiels: https://github.com/googlesamples/oauth-apps-for-windows/tree/master/OAuthDesktopApp
Die Lese- und Schreibmethoden sind:
quelle
new UTF8Encoding(false)
, der das Ausgeben einer Stückliste deaktiviert. Ich habe dies bereits in der Antwort geändertSie können Ihre Anwendung als Administrator starten, wenn Sie Ihrem Projekt Anwendungsmanifest hinzufügen.
Fügen Sie Ihrem Projekt einfach ein neues Element hinzu und wählen Sie "Anwendungsmanifestdatei". Ändern Sie das
<requestedExecutionLevel>
Element in:quelle
Standardmäßig definiert Windows das folgende Präfix, das allen zur Verfügung steht: http: // +: 80 / Temporary_Listen_Addresses /
So können Sie Ihre
HttpListener
Via registrieren :Prefixes.Add("http://+:80/Temporary_Listen_Addresses/" + Guid.NewGuid().ToString("D") + "/";
Dies führt manchmal zu Problemen mit Software wie Skype, die standardmäßig versucht, Port 80 zu verwenden.
quelle
Sie verwenden "*", um das folgende cmd als Administrator auszuführen
no use +, muss * verwenden, da Sie * angeben: 4444 ~.
https://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx
quelle
.Add("http://+:9000/")
Ich hatte auch ein ähnliches Problem. Wenn Sie bereits eine URL reserviert haben, müssen Sie zuerst die URL löschen, um sie im Nicht-Administrator-Modus auszuführen. Andernfalls schlägt sie mit dem Fehler "Zugriff verweigert" fehl.
quelle