【问题标题】:HttpAddUrl on localhost fails for non-admin users非管理员用户在本地主机上的 HttpAddUrl 失败
【发布时间】:2017-08-10 23:42:41
【问题描述】:

使用 Windows HTTP API,我在 localhost 上运行 HTTP 文件服务器。

这涉及到调用HttpAddUrl(hRequestQueue, L"http://localhost:80/", NULL)

除非用户以管理员身份运行应用程序,否则此操作会失败并显示 ERROR_ACCESS_DENIED。对于没有管理员权限的用户,我需要此功能。 (无论如何,运行 localhost 服务器的用户有什么问题?这只是为了用户自己。)

我发现hotfix for Vista and XP 似乎旨在解决这个问题,但对于 Windows 7 没有任何内容。文章暗示它已在 Vista SP1 中修复,我有 Windows 7 SP1,但它仍然是一个问题 - 修复没有它到 Windows 7?

我还能做些什么来让服务器为非管理员运行?

【问题讨论】:

    标签: c++ http localhost winhttp


    【解决方案1】:

    回答我自己的问题,但找到了解决方法:IANA port numbers 状态端口 49152-65535 用于动态/私有目的。 HttpAddUrl 用于端口 >= 49152 上的 localhost 对于非管理员可以正常工作。

    【讨论】:

    • 但是http://127.0.0.1:50000http://192.168.x.y:50000(本地网络地址)仍然需要管理员权限:(
    【解决方案2】:

    这必须在系统级别进行配置,因为 HTTP API 使用 http.sys(内核驱动程序)。您可以使用以管理员权限执行的 netsh.exe 命令来授予用户或应用程序访问权限:

    netsh http add urlacl url=http://localhost:80/ user=EVERYONE listen=yes delegate=no
    

    【讨论】:

      【解决方案3】:

      默认情况下,端口1-1024 需要管理权限。否则你会得到错误代码 5 (ACCESS_DENIED)。如果您尝试绑定到 1024 以上的端口,例如:

      http://localhost:8080/
      

      适用于非管理员用户。在您的情况下,您尝试侦听端口 80,HttpServer API 限制为管理员。

      Windows 中的一切都由访问控制列表 (ACL) 控制;这包括使用 HttpServer 时允许的侦听端口。您可以通过运行显示 http 使用的当前 ACL:

      >netsh http show urlacl
      

      如果您这样做,您会看到很多 ACL 已经由各种系统定义。

      Windows 通信基础

      一个 ACL 条目特别有趣:

      Reserved URL            : http://+:80/Temporary_Listen_Addresses/
         User: \Everyone
            Listen: Yes
            Delegate: No
            SDDL: D:(A;;GX;;;WD)
      

      每个人都有权在端口80 上监听,只要你住在:

      /Temporary_Listen_Addresses/
      

      此 url 由 Windows Communication Foundation (WCF) 使用,它通常构造以下形式的 URL:

      http://+:80/Temporary_Listen_Addresses/{random-guid}/
      

      这也意味着,如果你真的想要80端口,你可以用你自己的监听,例如:

      http://localhost:80/Temporary_Listen_Addresses/64E3DCC6-FE47-4A86-87F4-48D2E1B44AE9/ 
      

      只要没有人使用 80 端口(我在看你的 Skype!),你就会得到它。

      WinSock 监听套接字不需要管理员

      虽然 HttpServer API 有 ACL 控制对 1024 以下端口的访问,但应注意 WinSock API 没有限制。

      如果你想使用 WinSock 在端口80 上打开一个监听套接字,你不需要是管理员。只有Http api 具有ACL。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-13
        • 1970-01-01
        • 1970-01-01
        • 2015-07-14
        • 1970-01-01
        相关资源
        最近更新 更多