我可以在Vista上监听端口(使用HttpListener或其他.NET代码)而无需管理员权限吗?

时间:2008-10-04 07:14:51

标签: .net windows-vista permissions

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

根据我的阅读,this is expected behavior - 需要管理员权限才能开始侦听端口。但是我确信有很多方法可以解决这个问题,因为我运行了大量的程序(如Skype),这些程序可以监听端口而无需升级到管理员。

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

5 个答案:

答案 0 :(得分:66)

虽然您可以使用普通的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可以监听请求。

答案 1 :(得分:22)

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

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

答案 2 :(得分:10)

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

答案 3 :(得分:7)

我必须处理类似的事情。我的电脑位于受限制的域中,因此我没有管理员权限。经过一些研究和阅读后,我发现这个线程和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"
    [...]

这可以帮助任何人找到这个帖子。

答案 4 :(得分:2)

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

请参阅here - 该页面解释了该问题,底部有一个zip可供其使用。