对于非管理员,HttpListenerException“访问被拒绝”

时间:2013-02-19 16:23:35

标签: c# exception httplistener non-admin

我编写了一个使用HttpListener来监听HTTP请求的C#应用​​程序 - 显然!我使用的命名空间前缀也是使用netsh为当前用户注册的(正如所有人在SO上所建议的那样)。

问题是尽管使用netsh我的应用程序仍然会为非管理员用户抛出“访问被拒绝”例外。操作系统是Windows 7。

更新:当我使用非管理员用户运行它时,好像我的应用程序没有执行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();
    }

1 个答案:

答案 0 :(得分:31)

我在做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。当前版本使用yes或no。