不使用netsh注册URI的C#HttpListener

27

我的应用程序使用一个小型的Web服务器来提供一些文件,并具有远程管理的Web界面。现在,用户必须使用netsh注册URI,方法如下:

netsh http add urlacl url=http://+:1233/ user=Chris-PC\Chris

对于普通用户来说这并不好玩。我希望程序能够在我的程序中监听任何由用户指定的端口,而无需终端用户使用命令提示符。有没有其他方法可以实现这一点,而不仅仅是使用Process.Start并自己运行命令提示符?


你应该知道命令行在Windows XP上不能工作,是吧? - Rowland Shaw
据我所知,它只适用于Vista和Win7。 - Christopher Tarquini
2
看这个问题的链接: https://dev59.com/P2w15IYBdhLWcg3wD3np有一个Win32 API可以做到这点。 - Travis
2个回答

34

我写了这段代码,使用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();
    }
}

1
  1. 它也能在WinXP上工作吗?
  2. 如果你想添加acl,那很好,如何检查是否已经添加了具体的acl?
- Przemysław Michalski

1

如果您正在使用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支持。


7
这些内容的编程修改可以通过API HttpSetServiceConfiguration 实现。 - Mitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接