2

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

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

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

我找到了一个针对 Vista 和 XP 的修补程序,似乎旨在解决这个问题,但对于 Windows 7 没有任何内容。文章暗示它已在 Vista SP1 中修复,我有 Windows 7 SP1,但它仍然是一个问题 - 修复没有成功吗到 Windows 7?

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

4

3 回答 3

9

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

于 2011-07-17T13:40:31.760 回答
5

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

netsh http add urlacl url=http://localhost:80/ user=EVERYONE listen=yes delegate=no
于 2011-09-27T09:55:44.730 回答
3

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

http://localhost:8080/

它适用非管理员用户。在您的情况下,您尝试侦听 port 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 在 port 上打开一个监听套接字80,你不需要是管理员。只有Httpapi 具有 ACL。

于 2017-08-10T14:15:35.587 回答