簡體   English   中英

C#HttpListener沒有使用netsh來注冊URI

[英]C# HttpListener without using netsh to register a URI

我的應用程序使用一個小型Web服務器來為某些文件提供服務,並具有遠程管理的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();
    }
}

如果您使用的是HTTPListener,則必須使用httpconfig.exe或netsh配置HTTPListener,因為:

A. AFAIK沒有用於從C#執行此操作的API,只有命令行工具

B.默認情況下,只有SYSTEM或本地Administrators組可以偵聽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支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM