2010-04-06 100 views
19

我的应用程序使用小型网络服务器来管理某些文件,并具有用于远程管理的Web界面。现在,用户必须使用netsh的注册URI,像这样C#HttpListener不使用netsh来注册URI

netsh http add urlacl url=http://+:1233/ user=Chris-PC\Chris 

这对普通用户毫无乐趣。我希望程序能够从我的程序中监听用户指定的任何端口,而不需要最终用户使用命令提示符。无论如何,只要使用Process.Start和自己运行命令提示符就可以完成这一步。

+0

我想你知道该命令行不会在Windows XP上运行,对不对? – 2010-04-06 08:00:52

+0

是啊,据我所知它只适用于Vista和Win7 – 2010-04-06 16:49:14

+2

在这里看到这个问题: http://stackoverflow.com/questions/6851161/net-or-win32-equivalent-of-netsh-http-add-urlacl - 命令 有一个Win32 API来做到这一点。 – Travis 2011-12-22 23:58:27

回答

27

我写这个来提升perms并通过netsh添加http ACL条目。

用户将被提示对系统进行更改,但总比没有好。您可能希望在响应这样做是为了一个AddressAccessDeniedException

public static class NetAclChecker 
{ 
    public static void AddAddress(string address) 
    { 
     AddAddress(address, Environment.UserDomainName, Environment.UserName); 
    } 

    public static void AddAddress(string address, string domain, string user) 
    { 
     string args = string.Format(@"http add urlacl url={0} user={1}\{2}", address, domain, user); 

     ProcessStartInfo psi = new ProcessStartInfo("netsh", args); 
     psi.Verb = "runas"; 
     psi.CreateNoWindow = true; 
     psi.WindowStyle = ProcessWindowStyle.Hidden; 
     psi.UseShellExecute = true; 

     Process.Start(psi).WaitForExit(); 
    } 
} 
+0

这很好用! – 2014-02-02 01:50:17

+0

1.它也可以在WinXP上运行吗? 2.如果你想添加acl这很好,如何检查是否添加了具体的acl呢? – UGEEN 2014-03-23 19:46:05

2

如果您使用的是HTTPListener,你必须使用httpconfig.exe或netsh的配置你HTTPListener,因为:

A. AFAIK有从C#这样做,只有命令行工具

没有API

B.默认情况下只有系统或本地Administrators组可以收听到http前缀

所以...如果你的应用程序在用户的帐户下运行,你需要明确授予访问权(使用httpcfg.exe或netsh的),因为你的HTTPHandler使用HTTP.sys与运行的网络服务器共享端口(所以你可以托管你自己的我们b端口80上的应用程序,同时IIS也在端口80上运行)。

更好的解决方案可能是使用实际的嵌入式Web服务器来侦听您所需的端口。如果另一个应用程序(例如IIS)已经在使用该端口,这将不起作用,但由于此功能不使用HTTP.sys进行端口共享,因此没有关于哪个用户帐户在端口上打开/侦听的安全限制。因为您希望用户指定自己的端口,所以似乎可以在除端口80之外的另一个端口上运行。

我的公司生产一种名为Neokernel Web Server的商业产品(http://www.neokernel.com),它运行ASP.NET并允许以编程方式启动/停止服务器并设置配置;您可以将该程序集与应用程序一起嵌入和分发。

还有卡西尼源代码,您可以修改和嵌入,它是免费的,但有一些缺点,如无日志记录或SSL支持。

+5

以编程方式更改这些API是[HttpSetServiceConfiguration](http://msdn.microsoft.com/en-us/library/aa364503%28v=vs.85%29.aspx) – Mitch 2015-10-25 22:43:19