41

我正在使用 HttpListener 允许用户在用户定义的端口上设置代理。当我启动 HttpListener 时,如果应用程序没有在 Vista 中以管理员权限运行,则会出现异常。

根据我的阅读,这是预期的行为- 需要管理员权限才能开始侦听端口。但我确信有办法解决这个问题,因为我运行了大量程序(如 Skype),它们在端口上侦听而不需要提升到管理员权限。

有没有办法用 HttpListener 做到这一点?如果没有,我可以在 .NET 代码中调用其他 API 来设置端口吗?

4

5 回答 5

69

虽然您可以使用普通的 TCP/IP(它相对简单)编写自己的 HTTP 服务器,但使用 HttpListener 更容易,它利用了 Windows XP SP2 中添加的 HTTP.SYS 功能。

但是,HTTP.SYS 添加了 URL ACL 的概念。这部分是因为 HTTP.SYS 允许您绑定到端口 80 上的子命名空间。直接使用 TCP/IP 可以避免此要求,但意味着您不能绑定到已经在使用的端口。

在 Windows XP 上,您可以使用 HttpCfg.exe 程序设置 URL ACL,授予您的用户帐户绑定到特定 URL 的权限。它在 Platform SDK 示例中。

在 Windows Vista 上,仍然支持 HTTPCFG,但该功能已被 NETSH 吸收:

netsh http show urlacl

...将显示现有 URL ACL 的列表。ACL 以 SDDL 表示。

netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\User listen=yes

...将配置 MyURI 命名空间,以便 DOMAIN\User 可以监听请求。

于 2008-10-12T09:03:02.210 回答
24

如果您只需要处理来自您自己计算机的请求(通常用于测试目的),您可以在前缀中写入localhost而不是 *。

例如,您可以写成“http://localhost:9669/”,而不是“http://*:9669/”。这适用于 HttpListener 并且不需要管理权限(至少在 Windows 7 上)。

于 2011-03-23T16:24:26.140 回答
9

我从未使用过 HttpListener,但从您的描述来看,这听起来更像是您想在常规 TCP 端口上侦听,而不是将您的应用程序嵌入到服务器 URL 命名空间中(这是 HttpListener 似乎要做的)。您应该能够使用常规套接字函数 (System.Net.Sockets.TcpListener) 打开和侦听 TCP 端口,而无需管理员权限。我几乎可以肯定 Skype 不使用 HttpListener。

于 2008-10-04T07:58:52.120 回答
9

好吧,我不得不处理类似的事情。我的电脑在受限域中,所以我没有管理员权限。经过一些研究和阅读后,我发现了这个线程,并且 netsh 提示让我使用临时 acl 绑定来开发测试。在我的电脑上,这些规则存在。

有这个条目:

运行“netsh http show urlacl”(如上图)

    [...]
        Reservierte URL            : http://+:80/Temporary_Listen_Addresses/
            Benutzer: \Jeder
                Abhören: Yes
                Delegieren: No
                SDDL: D:(A;;GX;;;WD)
    [...]

所以我可以将 HttpListener 用作非管理员(Jeder):

    [...]
    HttpListener l = new HttpListener();
    string prefix = "http://+:80/Temporary_Listen_Addresses/";
    l.Prefixes.Add(prefix);
    l.Start(); // does not throw any "Permission Denied/Access Denied/Zugriff verweigert"
    [...]

愿这有助于任何人找到这个线程。

于 2011-07-12T12:00:16.030 回答
2

在 XP 中,您必须先使用命令行 (httpcfg) 打开端口,否则非管理员无法使用。

请参阅此处- 该页面解释了该问题,底部有一个拉链以使其可用。

于 2008-10-04T08:45:24.350 回答