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

24
我编写了一个使用HttpListener监听HTTP请求的C#应用程序。显然,我使用的命名空间前缀也已经为当前用户注册了,就像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();
    }

这很可能是由于Windows 7不允许用户模式应用程序在端口80上创建侦听器(这是HTTP的默认端口)导致的。请参见此答案:https://dev59.com/RW865IYBdhLWcg3wCqBA#4115328 - Matthew
谢谢。我没有使用80端口。我也刚刚发布了我的代码。 - Mossi
1
我怀疑你的 netsh 没能成功添加你想要的映射。或许是因为你使用了 locolhast 而不是 localhost。还是说这只是你问题中的一个打字错误? - Jim Mischel
1
在命令提示符下输入“netsh http show urlacl”,并找到您所做的条目。确保Listen为Yes。据我回忆,您必须在用户名后添加“listen=true”。 - Jim Mischel
我不明白这个。当我运行你的命令时,我没有看到我的非管理员用户出现在任何地方。但是运行"netsh http add"命令会显示:不能创建一个已经存在的文件。这是我在命令提示符中运行的内容:netsh http add urlacl url=http://localhost:8400/ user="mycomp-01\standard user"。 - Mossi
显示剩余2条评论
1个回答

46

我在使用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。


11
根据提供的帮助文档,listen 参数只能接受 yes|no 值而不是 true|false。当我尝试使用 listen=true 时,它对我没有起作用。 - tafoo85
3
旧版本的 Windows 使用 true/false,而新版本使用 yes/no。或者说可能是相反的。很高兴您找到了解决方法。 - Jim Mischel
2
@CharlieSalts:据我所知,非管理员无法成功执行此命令。 - Jim Mischel
我知道这是一个旧帖子 - 但其他人可能会受益。听起来你的客户需要运行本地应用程序。安装应用程序不涉及管理员吗?你可能有机会将netsh命令纳入安装过程,并获得你想要的结果。 - increddibelly
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接