最简单的实现方式莫过于调用DMD指令(netsh advfirewall)指令,对于NSIS来说,调用执行指令是非常简单的。我们这里就是采用的这种方式。关于netsh advfirewall的详细用法和参数说明,我们这里就不详述了。
NSIS的相关脚本有:
1、ExecWait "$INSTDIR\nsis.bat" //可以等待 不可以隐藏窗口
2、nsExec::Exec "$INSTDIR\nsis.bat" //可以等待 可以隐藏窗口
3、ExecShell Open "$INSTDIR\nsis.bat" "" SW_HIDE // 不可以等待 可以隐藏窗口
4、ExecCmd::exec "$INSTDIR\nsis.bat" // 不可以等待 可以隐藏窗口 ( Pop $0、 ExecCmd::wait $0 等待)
我们这里使用的是nsExec::Exec,直接上代码:
Section -RePort nsExec::Exec 'netsh advfirewall firewall add rule name="XXXX" dir=in program="$INSTDIR\XXXX.exe" protocol=tcp localport=xxxx action=allow' Pop $0 ${If} $0 != 0 MessageBox MB_OK|MB_ICONSTOP "打开xxxx端口失败!请手动开放此端口。" ${EndIf} SectionEnd
nsExec::Exec 'netsh advfirewall firewall delete rule name="CPRR"'
兼容性问题:只适用于 Vista 及以上版本的操作系统。XP, 2003无法使用。