【问题标题】:Get my application to be allowed access through firewall using c#使用 c# 让我的应用程序被允许通过防火墙访问
【发布时间】:2012-01-26 04:52:09
【问题描述】:

我试图让我的应用程序被允许通过防火墙,因为我必须在主动和被动模式下执行 ftp 不是一个选项,因为服务器没有为此配置。所以我尝试了以下编译好的代码,我使用它执行它:

 MyApp.Classes.INetFwMgr mgr = new MyApp.Classes.INetFwMgr();
    mgr.AuthorizeApplication(Application.ProductName, Application.StartupPath,
        NET_FW_SCOPE_.NET_FW_SCOPE_ALL,
        NET_FW_IP_VERSION_.NET_FW_IP_VERSION_ANY);

以及完成这项工作的班级:

private const string CLSID_FIREWALL_MANAGER = 
"{304CE942-6E39-40D8-943A-B913C40C9CD4}"; 
private static NetFwTypeLib.INetFwMgr GetFirewallManager() 
{ 
Type objectType = Type.GetTypeFromCLSID( 
new Guid(CLSID_FIREWALL_MANAGER)); 
return Activator.CreateInstance(objectType) 
as NetFwTypeLib.INetFwMgr; 
} 


private const string PROGID_AUTHORIZED_APPLICATION = 
"HNetCfg.FwAuthorizedApplication"; 
public bool AuthorizeApplication(string title, string applicationPath, 
NET_FW_SCOPE_ scope, NET_FW_IP_VERSION_ ipVersion) 
{ 
// Create the type from prog id 
Type type = Type.GetTypeFromProgID(PROGID_AUTHORIZED_APPLICATION); 
INetFwAuthorizedApplication auth = Activator.CreateInstance(type) 
as INetFwAuthorizedApplication; 
auth.Name = title; 
auth.ProcessImageFileName = applicationPath; //Getting Access Denied Exception Here
auth.Scope = scope; 
auth.IpVersion = ipVersion; 
auth.Enabled = true; 
NetFwTypeLib.INetFwMgr manager = GetFirewallManager(); 
try 
{ 
manager.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(auth); 
} 
catch (Exception ex) 
{ 
return false; 
} 
return true; 
}

使用上面的代码,但我得到Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) c# 异常在线

auth.ProcessImageFileName = applicationPath;

有什么想法吗?

Edit1:我如何以管理员身份使用代码运行它?

Edit2:我也试过Putting <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> in manifest did not make a difference

P.S.本程序执行上下文可以是Win 7, vista, xp

【问题讨论】:

  • 仅供参考,没有“C#.net”之类的东西。
  • 这段代码的执行上下文是什么?常规程序当然不仅可以强制打开防火墙,这会破坏拥有防火墙的意义。至少需要管理员权限,您通常只能在安装程序中获得这种权限。在服务器场景中,您肯定希望由 LAN 管理员明确授予访问权限。

标签: c# .net com ftp firewall


【解决方案1】:

尝试在防火墙中打开 FTP 端口(端口 20 和 21),看看是否能解决您的问题。

【讨论】:

  • 在 Windows 防火墙中,您可以手动将程序添加到“允许”列表(查找 允许程序或功能通过 Windows 防火墙),也可以手动覆盖特定的 TCP /IP 端口(通常是高级设置)。这取决于您运行的 Windows 版本,哪个选项最容易配置。
  • 我在防火墙中添加了允许连接 20、21 的规则,但 ftp 请求仍然超时
  • 但是我允许程序通过防火墙它可以工作,您对允许我的程序使用代码通过防火墙有什么建议,因为我只发布代码并且程序自行安装在每个客户端系统上。我该怎么做才能让它只添加一次
  • 去看看 Greg 对这个问题的回答——它应该可以帮助你用防火墙做你想做的事情:stackoverflow.com/questions/1242566/…
【解决方案2】:

对于以不同用户身份运行: Run Code as a different user (C#)

关于通过防火墙,您是否与负责防火墙安全的人员/小组谈过?他们可能制定了一些您可以使用的规则。

【讨论】:

  • 我想以编程方式进行,允许 .exe 通过防火墙访问
  • @jaminator - 显然这就是你所追求的,但这样做真的合乎道德吗?
  • 您知道防火墙背后的用途对吗?阻止未经授权的访问。您可以将代码作为不同的用途运行,但您尝试去的地方是否在端口/ACL 级别被阻止并不重要。这是 LAN 管理员可以帮助您解决的问题。您是否有不想与 LAN/防火墙管理员交谈的原因?
【解决方案3】:

防火墙管理是系统级安全功能,必须在用户模式应用程序代码之外完成。配置必须由管理员完成。

编写您编写的代码并假设您的应用程序将以管理员身份运行是一种不好的做法。即使它是由管理员运行的,您现在也有一个“做 FTP 工作”和“做防火墙工作”的应用程序。从来没有这样写过应用程序。

您可以编写与系统防火墙交互的代码,并且该代码必须以提升的权限运行。通常,此类“帮助应用程序”甚至永远不会创建,但因为 Windows(和所有其他操作系统)具有操作系统随附的所有必要管理工具(即 wf.msc)。

【讨论】:

    【解决方案4】:

    我观察到,如果我将 ftp 下载语句的顺序更改为以下 Windows 对话框,则会出现询问 do you want to allow this program access through firewall;如果我单击允许访问,代码将完美运行。

    requestDownload = (FtpWebRequest)WebRequest.Create(uri);
                                requestDownload.UsePassive = false;
                                requestDownload.KeepAlive = false;
                                requestDownload.UseBinary = true;
                                requestDownload.Method = WebRequestMethods.Ftp.DownloadFile;
    
    
                                requestDownload.Credentials = new NetworkCredential(ftpInfoDownload[3], ftpInfoDownload[4]);
    
                                responseDownload = (FtpWebResponse)requestDownload.GetResponse();
                                Stream ftpStream = responseDownload.GetResponseStream();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 2019-08-21
      • 2016-02-23
      相关资源
      最近更新 更多