我需要为我正在编写的应用程序的出站连接打开 Windows 防火墙。
我能找到的最佳答案在这里:
http://www.shafqatahmed.com/2008/01/controlling-win.html
http://www.vincenzo.net/isxkb/index.php?title=Adding_a_rule_to_the_Windows_firewall
问题是该方法仅创建 inbound 规则,而不是 outbound 规则。 (C# 和 InnoSetup 脚本都使用相同的方法。)这对我来说完全没用。
Windows 防火墙的默认行为是允许出站流量,但这并不能保证有人不会更改它。
我更愿意在安装程序中执行此操作(使用 InnoSetup),而不是在 C# 中执行此操作。
我错过了什么吗?
有人知道如何创建出站规则吗?
如果您需要为您的应用程序添加一些例外,您可以使用netsh。
在命令行中写入(对于XP):
netsh firewall add allowedprogram ?
在命令行中写入(W7):
netsh advfirewall firewall add rule ?
此差异是因为 netshfirewall 命令已弃用。相反,我们必须使用命令 netsh advfirewall 防火墙。
有关使用命令 netsh advfirewall 防火墙而不是 netsh 防火墙命令的更多信息,我们可以在知识库中看到:http://go.microsoft.com/fwlink/?linkid=121488
示例:
为messenger.exe添加没有安全封装的传入流量规则:
netsh advfirewall firewall add rule name="allow messenger" dir=in program="c:\programfiles\messenger\msmsgs.exe" security=authnoencap action=allow
添加80端口出站流量规则:
netsh advfirewall firewall add rule name="allow80" protocol=TCP dir=out localport=80 action=block
通过端口 80 向 TCP 的入站流量添加安全和流量加密规则:
netsh advfirewall firewall add rule name="Require Encryption for Inbound TCP/80" protocol=TCP dir=in localport=80 security=authdynenc action=allow
TechNet 可以: 在 Windows 7、Windows Vista、Windows Server 2008 或 Windows Server 2008 R2 上创建出站端口规则
虽然我假设您打算以编程方式创建此类规则,但如果是这种情况,您可能会对以编程方式使用组策略对象感兴趣。
最后,如果您计划在安装过程中执行此操作,InnoSetup 应该能够在安装时合并必要的注册表项。
netsh的问题是它无法在某些 Windows 版本(例如 Windows Vista Basic)上运行。这就是为什么最好在不使用 netsh 的情况下添加异常。 本文包含示例 Inno Setup 代码。
netsh firewall add allowedprogram <path> <name>
netsh firewall add allowedprogram ?
这些可以在 [Run]
部分或通过致电
Exec
来完成。请注意,这在 Windows 7 中已被弃用;如果您仅针对 Vista/2008 或更高版本,则应该使用
netsh advfirewall firewall
来代替。微软有一篇文章关于从前者到后者的转换,但我仍然需要支持XP,所以我没有这样做。
netsh
部分执行
[Run]
。此示例为任何可执行文件打开端口 80:
[Run]
; Remove firewall exception first when upgrading
Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall delete rule name=""My WWW Server"" "; Flags: runhidden
; Add firewall exception
Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall add rule name=""My WWW Server"" protocol=TCP dir=in localport=80 action=allow "; Flags: runhidden
[UninstallRun]
Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall delete rule name=""My WWW Server"" "; Flags: runhidden; RunOnceId: "RemoveFirewallExc"