我的应用程序使用一个小型网络服务器来提供一些文件,并有一个用于远程管理的网络界面。现在用户必须像这样使用 netsh 来注册 URI
netsh http add urlacl url=http://+:1233/ user=Chris-PC\Chris
这对普通用户来说并不好玩。我希望程序能够监听用户从我的程序指定的任何端口,而最终用户不需要使用命令提示符。除了自己使用 Process.Start 和运行命令提示符之外,有没有办法完成这个任务?
我的应用程序使用一个小型网络服务器来提供一些文件,并有一个用于远程管理的网络界面。现在用户必须像这样使用 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 上,而 IIS 也在端口 80 上运行)。
更好的解决方案可能是使用实际的嵌入式 Web 服务器来监听您需要的端口。如果另一个应用程序(例如 IIS)已经在使用该端口,这将不起作用,但由于它不使用 HTTP.sys 进行端口共享,因此对于打开/侦听端口的用户帐户没有安全限制. 因为您希望用户指定他们自己的端口,所以在端口 80 之外的另一个端口上运行似乎是可以接受的。
我的公司制造了一个名为 Neokernel Web Server ( http://www.neokernel.com ) 的商业产品,它运行 ASP.NET,让您以编程方式启动/停止服务器并设置配置;您可以将此程序集与应用程序一起嵌入和分发。
还有您可以修改和嵌入的 Cassini 源代码,它是免费的,但有一些缺点,例如不支持日志记录或 SSL。