以编程方式将应用程序添加到Windows防火墙

我有一个通过ClickOnce安装和更新的应用程序。 应用程序通过FTP下载文件,因此需要添加到Windows防火墙的例外。 由于ClickOnce的工作方式,EXE的path随着每次更新而改变,所以exception也需要改变。 对防火墙进行更改的最佳方式是什么?以便最终用户看不到它?

(该应用程序是用C#编写的)

不知道这是否是最好的方式,但运行netsh应该工作:

netsh防火墙添加allowedprogram C:\ MyApp \ MyApp.exe MyApp启用

我认为这需要pipe理员权限,虽然,显而易见的原因:)

编辑:我只是不知道ClickOnce知道你是否可以通过它运行外部程序。

可以从防火墙访问数据,查看以下文章。

  • Windows XP SP2防火墙控制器
  • 使用C#通过COM Interop控制Windows防火墙

真正的问题是ClickOnce沙箱是否允许这种访问? 我的猜测是,它不会。 也许你可以使用web服务? (有关ClickOnce中数据访问方法的更多信息,请参阅在ClickOnce应用程序中访问本地数据和远程数据 )

我发现这篇文章有一个完整的包装类,包括操作Windows防火墙。 将应用程序添加到Windows防火墙上的例外列表中

ClickOnce沙箱没有出现任何问题。

在“Wayback机器”上可find“将应用程序添加到Windows防火墙上的例外列表”的无效链接:

http://web.archive.org/web/20070707110141/http://www.dot.net.nz/Default.aspx?tabid=42&mid=404&ctl=Details&ItemID=8

我知道的最简单的方法就是使用netsh ,只要删除规则并重新创build规则,或者设置一个端口规则(如果你的规则是固定的)。
这是一个描述防火墙上下文选项的页面。

答案是您只允许受信任的软件以pipe理员权限运行。 有时软件必须具有pipe理员权限,并对系统进行敏感更改。 你可能有一个只读的硬盘,否则…

这个答案可能迟到了。 这是我最终使用的:

http://support.microsoft.com/kb/947709

假设我们正在使用Visual Studio安装程序 – >安装项目 – 在安装的程序集中需要一个像这样的安装程序类,然后确保在安装阶段为“主要输出”添加自定义操作。

using System.Collections; using System.ComponentModel; using System.Configuration.Install; using System.IO; using System.Diagnostics; namespace YourNamespace { [RunInstaller(true)] public class AddFirewallExceptionInstaller : Installer { protected override void OnAfterInstall(IDictionary savedState) { base.OnAfterInstall(savedState); var path = Path.GetDirectoryName(Context.Parameters["assemblypath"]); OpenFirewallForProgram(Path.Combine(path, "YourExe.exe"), "Your program name for display"); } private static void OpenFirewallForProgram(string exeFileName, string displayName) { var proc = Process.Start( new ProcessStartInfo { FileName = "netsh", Arguments = string.Format( "firewall add allowedprogram program=\"{0}\" name=\"{1}\" profile=\"ALL\"", exeFileName, displayName), WindowStyle = ProcessWindowStyle.Hidden }); proc.WaitForExit(); } } }