使用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?
我还能做些什么让服务器为非管理员运行吗?
答案 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。
一个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!),你就会得到它。
虽然HttpServer API具有控制对1024
以下端口的访问的ACL,但应注意WinSock API没有限制。
如果要使用WinSock在端口80
上打开侦听套接字,则无需成为管理员。只有Http
api具有ACL。