我的应用程序使用一个小型Web服务器来为某些文件提供服务,并具有远程管理的Web界面 . 现在,用户必须使用netsh来注册URI
netsh http add urlacl url=http://+:1233/ user=Chris-PC\Chris
这对普通用户来说并不好玩 . 我希望程序能够在我的程序中监听用户指定的任何端口,而不需要最终用户使用命令提示符 . 无论如何要完成这个简单的使用Process.Start并自己运行命令提示符?
我写这个来提升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(); } }
如果您使用的是HTTPListener,则必须使用httpconfig.exe或netsh来配置HTTPListener,因为:
A. AFAIK没有用于从C#执行此操作的API,只有命令行工具
B.默认情况下,只有SYSTEM或本地Administrators组可以侦听http前缀
所以...如果您的应用程序在用户帐户下运行,您需要显式授予访问权限(使用httpcfg.exe或netsh),因为您的HTTPHandler使用HTTP.sys与正在运行的Web服务器共享端口(因此您可以托管自己的端口80上的Web应用程序,而IIS也在端口80上运行) .
更好的解决方案可能是使用实际的嵌入式Web服务器来监听您需要的端口 . 如果另一个应用程序(例如IIS)已经在使用该端口,这将不起作用,但由于这不使用HTTP.sys进行端口共享,因此对端口上打开/侦听的用户帐户没有安全限制 . 因为您希望用户指定自己的端口,所以在端口80之外的其他端口上运行似乎是可以接受的 .
我的公司制作了一个名为Neokernel Web Server(http://www.neokernel.com)的商业产品,它运行ASP.NET并允许您以编程方式启动/停止服务器并设置配置;您可以使用该应用程序嵌入和分发此程序集 .
还有Cassini源代码,您可以修改和嵌入,它是免费的,但有一些缺点,如没有日志记录或SSL支持 .
2 回答
我写这个来提升perms并通过netsh添加http ACL条目 .
系统会提示用户在系统中进行更改,但总比没有好 . 您可能希望这样做以响应AddressAccessDeniedException
如果您使用的是HTTPListener,则必须使用httpconfig.exe或netsh来配置HTTPListener,因为:
A. AFAIK没有用于从C#执行此操作的API,只有命令行工具
B.默认情况下,只有SYSTEM或本地Administrators组可以侦听http前缀
所以...如果您的应用程序在用户帐户下运行,您需要显式授予访问权限(使用httpcfg.exe或netsh),因为您的HTTPHandler使用HTTP.sys与正在运行的Web服务器共享端口(因此您可以托管自己的端口80上的Web应用程序,而IIS也在端口80上运行) .
更好的解决方案可能是使用实际的嵌入式Web服务器来监听您需要的端口 . 如果另一个应用程序(例如IIS)已经在使用该端口,这将不起作用,但由于这不使用HTTP.sys进行端口共享,因此对端口上打开/侦听的用户帐户没有安全限制 . 因为您希望用户指定自己的端口,所以在端口80之外的其他端口上运行似乎是可以接受的 .
我的公司制作了一个名为Neokernel Web Server(http://www.neokernel.com)的商业产品,它运行ASP.NET并允许您以编程方式启动/停止服务器并设置配置;您可以使用该应用程序嵌入和分发此程序集 .
还有Cassini源代码,您可以修改和嵌入,它是免费的,但有一些缺点,如没有日志记录或SSL支持 .