我的应用程序使用一个小型的Web服务器来提供一些文件,并具有远程管理的Web界面。现在,用户必须使用netsh注册URI,方法如下:
netsh http add urlacl url=http://+:1233/ user=Chris-PC\Chris
对于普通用户来说这并不好玩。我希望程序能够在我的程序中监听任何由用户指定的端口,而无需终端用户使用命令提示符。有没有其他方法可以实现这一点,而不仅仅是使用Process.Start并自己运行命令提示符?
我的应用程序使用一个小型的Web服务器来提供一些文件,并具有远程管理的Web界面。现在,用户必须使用netsh注册URI,方法如下:
netsh http add urlacl url=http://+:1233/ user=Chris-PC\Chris
对于普通用户来说这并不好玩。我希望程序能够在我的程序中监听任何由用户指定的端口,而无需终端用户使用命令提示符。有没有其他方法可以实现这一点,而不仅仅是使用Process.Start并自己运行命令提示符?
我写了这段代码,使用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. 据我所知,没有API可以从C#中执行此操作,只有命令行工具
B. 默认情况下,只有SYSTEM或本地管理员组可以侦听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支持。