对于非admin用户,本地主机上的HttpAddUrl失败

HttpAddUrl on localhost fails for non-admin users

本文关键字:主机 HttpAddUrl 失败 于非 admin 用户      更新时间:2023-10-16

使用Windows HTTP API,我在本地主机上运行HTTP文件服务器。

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

对于ERROR_ACCESS_DENIED,除非用户以管理员身份运行应用程序,否则此操作将失败。我需要这个功能的用户谁没有管理权限。(用户运行本地主机服务器有什么问题?这只是为了用户自己)

我找到了Vista和XP的热修复程序,似乎旨在解决这个问题,但Windows 7没有。这篇文章暗示这个问题在Vista SP1中已经修复了,而我用的是Windows 7 SP1,它仍然是一个问题——修复没有在Windows 7中实现吗?

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

回答我自己的问题,但发现了一个解决方法:IANA端口号状态端口49152-65535是用于动态/私人目的。

HttpAddUrl for localhost on a port>= 49152对于非管理员工作良好。

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

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

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

http://localhost:8080/

it 用于非管理员用户。在你的情况下,你试图监听端口80, HttpServer API限制管理员。

Windows中的一切都由访问控制列表(acl)控制;这包括使用HttpServer时允许的监听端口。

命令用于显示http使用的当前acl。
>netsh http show urlacl

如果您这样做,您将看到许多已经由各种系统定义的acl。

Windows Communication Foundation

有一个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通信基金会(WCF)使用,它通常构造一个如下形式的url:

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

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

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

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

WinSock监听套接字不需要admin

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

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