C#HTTPLISTENER无需使用NetSh注册URI
-
24-09-2019 - |
题
我的应用程序使用小型网络服务器来填写某些文件,并具有远程管理的Web界面。目前,用户必须使用NetSH像这样注册URI
netsh http add urlacl url=http://+:1233/ user=Chris-PC\Chris
对于普通用户来说,这没什么好玩的。我希望该程序能够在我的程序中从我的程序中指定的任何端口聆听,而无需最终用户使用命令提示符。无论如何,是否可以完成仅使用process.start和运行命令提示的简短工作?
解决方案
我写了这篇文章来提升perms并通过 网络.
用户将被提示将更改最高的系统更改,但总比没有好。您可能想对此做到这一点 adversAccessDeniedException
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,因为:
答:AFAIK没有C#这样做的API,只有命令行工具
B.默认情况下,仅系统或本地管理员组可以收听HTTP前缀
因此...如果您的应用在用户帐户下运行,则需要明确授予访问(使用httpcfg.exe或netsh),因为您的httphandler使用http.sys与运行的Weberver共享端口(因此您可以托管自己的托管端口80上的Web应用程序也在端口80上运行时)。
一个更好的解决方案可能是使用实际嵌入式Web服务器在所需的端口上侦听。如果另一个应用程序(例如IIS)已经使用了端口,这将无法使用,但是由于这不使用http.sys进行端口共享,因此对端口上的用户帐户打开 /侦听的安全限制没有安全限制。因为您希望用户指定自己的端口,所以在端口80以外的另一个端口上运行似乎可以接受。
我公司生产的商业产品称为Neokernel Web服务器(http://www.neokernel.com)运行ASP.NET,可以使您通过编程方式启动/停止服务器并设置配置;您可以使用应用程序嵌入和分发此组件。
还有您可以修改和嵌入的Cassini源代码,它是免费的,但有几个缺点,例如没有记录或SSL支持。