我的应用程序使用一个小的networking服务器来服务器上的一些文件,并有远程pipe理的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(); } }
如果您使用HTTPlistner,则必须使用httpconfig.exe或netsh来配置HTTPlistner,因为:
A. AFAIK C#没有这样做的API,只有命令行工具
B.默认情况下只有SYSTEM或本地管理员组可以监听http前缀
因此,如果您的应用程序在用户帐户下运行,则需要明确授予访问权限(使用httpcfg.exe或netsh),因为您的HTTPHandler使用HTTP.sys与正在运行的Web服务器共享端口(所以您可以托管自己的web应用程序在端口80上,同时IIS也在端口80上运行)。
更好的解决方案可能是使用实际的嵌入式Web服务器来侦听您需要的端口。 如果另一个应用程序(例如IIS)已经在使用该端口,这将不起作用,但由于这不会使用HTTP.sys进行端口共享,所以没有关于哪个用户帐户在端口上打开/侦听的安全限制。 因为您希望用户指定他们自己的端口,似乎可以接受除端口80之外的另一个端口上运行。
我公司制作一个名为Neokernel Web server( http://www.neokernel.com )的商业产品,它运行ASP.NET,让你以编程方式启动/停止服务器并设置配置; 您可以在应用程序中嵌入和分发该程序集。
还有卡西尼源代码,您可以修改和嵌入,它是免费的,但有一些缺点,如无记录或SSL支持。