C# HttpListenerException“;“拒绝访问”;非管理员

C# HttpListenerException“;“拒绝访问”;非管理员,c#,exception,httplistener,non-admin,C#,Exception,Httplistener,Non Admin,我已经编写了一个C#应用程序,它使用HttpListener来侦听HTTP请求——显然!我使用的名称空间前缀也是使用netsh为当前用户注册的(正如SO上的每个人所建议的) 问题是,尽管使用了netsh,我的应用程序仍然会对非管理员用户抛出“访问被拒绝”异常。操作系统是Windows7 更新:当我使用非管理员用户运行应用程序时,它看起来好像我的应用程序没有执行netsh命令。我的代码有问题吗?没有抛出异常 AddAddress("http://localhost:8400/", Envi

我已经编写了一个C#应用程序,它使用
HttpListener
来侦听HTTP请求——显然!我使用的名称空间前缀也是使用
netsh
为当前用户注册的(正如SO上的每个人所建议的)

问题是,尽管使用了netsh,我的应用程序仍然会对非管理员用户抛出“访问被拒绝”异常。操作系统是Windows7

更新:当我使用非管理员用户运行应用程序时,它看起来好像我的应用程序没有执行
netsh
命令。我的代码有问题吗?没有抛出异常

    AddAddress("http://localhost:8400/", Environment.UserDomainName, Environment.UserName);

    HttpListener _listener = new HttpListener();
    _listener.Prefixes.Add("http://localhost:8400/");
    _listener.Start();

    ...

    /** method stolen from an SO thread. sorry can't remember the author **/
    static void AddAddress(string address, string domain, string user)
    {
        string args = string.Format(@"http add urlacl url={0}", address) + " user=\"" + 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();
    }

我在做HttpListener时使用的行是:

netsh http add urlacl url=http://+:8008/ user=Everyone listen=yes
用户可以是单个用户或用户组。因此,如果您只希望管理员具有访问权限,例如:

netsh http add urlacl url=http://+:8008/ user=Administrators listen=yes
您可以通过以下命令获得帮助:

netsh http add urlacl help

请注意,
url=
是可选的。此外,旧版本的命令要求listen参数为true或false。当前版本使用“是”或“否”。

这可能是因为Windows 7不允许用户模式应用程序在端口80(默认为HTTP)上创建侦听器。看到这个答案:谢谢。我没有使用端口80。我还刚刚发布了我的代码。我怀疑您的
netsh
未能添加所需的映射。或者可能是因为您使用的是
locolhast
,而不是
localhost
。或者这只是你问题中的一个输入错误?所以编辑器不允许我输入localhost,所以我不得不更改它!另外,当我在命令提示符下运行相同的netsh命令时,我会收到一条消息,说明名称空间已经注册。因此,我假设netsh成功了。在命令提示符下输入
netshhttpshowurlacl
,然后找到您所做的输入。确保倾听是肯定的。我记得,您必须在用户名后添加“listen=true”。根据以下说明,用户组在所有Windows平台上都不可用:。但是,看起来用户=每个人都这么做了!!!但这是哪里记录的?!!!!我在这上面浪费了两天!httpcfg(WinXP)也有类似的功能吗?谢谢@user1936026:我不熟悉httpcfg,但是如果我必须使用它,我可能会从中的示例开始。根据帮助,listen接受yes | no value not true | false。如果使用listen=true,它对我不起作用。@tafoo85:旧版本的Windows使用true/false。较新的版本使用是/否。或者可能是另一种方式。很高兴您找到了修复方法。@CharlieSalts:据我所知,非管理员不可能成功执行此命令。