Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在Vista上监听端口(使用HttpListener或其他.NET代码)而不需要管理员权限吗?_.net_Windows Vista_Permissions - Fatal编程技术网

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

我可以在Vista上监听端口(使用HttpListener或其他.NET代码)而不需要管理员权限吗?,.net,windows-vista,permissions,.net,Windows Vista,Permissions,我使用HttpListener允许用户在用户定义的端口上设置代理。启动HttpListener时,如果应用程序未在Vista中以管理员权限运行,则会出现异常 据我所知,开始监听端口需要管理员权限。但我相信有办法解决这个问题,因为我运行了很多程序(比如Skype),它们可以在端口上监听,而不需要管理员升级 有没有办法用HttpListener做到这一点?如果没有,我可以在.NET代码中进行其他API调用来设置端口吗?我从未使用过HttpListener,但从您的描述来看,它更像是要在常规TCP端口

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

据我所知,开始监听端口需要管理员权限。但我相信有办法解决这个问题,因为我运行了很多程序(比如Skype),它们可以在端口上监听,而不需要管理员升级


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

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

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


请参阅-该页解释了该问题,底部有一个可供使用的选项。

虽然您可以使用普通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的权限。它在平台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命名空间,以便域\用户可以侦听请求。

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


例如,代替“http://*:9669/”您可以编写http://localhost:9669/". 这在HttpListener上运行良好,并且不需要管理权限(至少在Windows 7上是这样)。

我必须处理类似的问题。我的计算机位于受限域中,因此我没有管理员权限。经过一些研究和阅读,我发现这个线程和netsh提示让我使用临时acl绑定来开发测试。在我的计算机上,这些规则是存在的

有一个条目:

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

因此,我可以将HttpListener用作非管理员(Jeder):


希望这能帮助任何人找到这条线索。

哇,我不知道!从您提供的链接来看,它似乎没有任何意义(在Windows 10上,看起来您无需在某些端口上注册即可完成此操作。不确定确切的端口范围,但对我来说,端口5000-10000无需注册即可工作,以非管理员用户身份运行。更高的端口需要
netsh http add urlac
来注册URL(以管理员身份运行一次或在安装过程中运行).有意思-我认为这是最好的计划。我将处理HTTP请求,因此很难放弃HttpListener,但我认为这是最好的主意。到目前为止,我发现了两个可能有用的链接:管理员必须打开防火墙。哇。4个月后你回来编辑你帖子中的一个单词?令人印象深刻,先生:)这就是我在这种情况下所需要的:netsh http add urlacl url=http://*:8080/user=\Everyone listen=yes您仍然需要管理员权限来运行这些命令以启用端口。是的,但您只需要在安装时执行一次。三年后我发现这个答案很有用。如果您收到消息为“访问被拒绝”“的
HttpListenerException
,则该端口可能已被其他进程使用。在使用ServiceHost的Windows 10中,我无法确认这一点。当使用特定IP设置基地址时,在netstat中我可以看到它将绑定到0.0.0.0,因此需要提升权限。很好的发现!我认为@Don01001100对此的评论与这个答案有关。因此,如果你得到一个“被拒绝访问”的消息,请考虑使用端口80的另一个应用程序(如IIS、Apache、Skype……)。
    [...]
        Reservierte URL            : http://+:80/Temporary_Listen_Addresses/
            Benutzer: \Jeder
                Abhören: Yes
                Delegieren: No
                SDDL: D:(A;;GX;;;WD)
    [...]
    [...]
    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"
    [...]