对于非管理员用户,localhost上的HttpAddUrl失败

时间:2011-07-17 00:26:10

标签: c++ http localhost winhttp

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

这涉及致电HttpAddUrl(hRequestQueue, L"http://localhost:80/", NULL)

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

回答我自己的问题,但找到了解决方法:IANA port numbers州端口49152-65535用于动态/私人目的。端口上的localhost HttpAddUrl> = 49152适用于非管理员。

答案 2 :(得分:1)

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

http://localhost:8080/

适用于非管理员用户。在您的情况下,您尝试侦听端口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/

Windows Communication Foundation(WCF)使用此URL,它通常构造表单的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具有控制对1024以下端口的访问的ACL,但应注意WinSock API没有限制。

如果要使用WinSock在端口80上打开侦听套接字,则无需成为管理员。只有Http api具有ACL。