首页 > 其他分享 >NSIS 脚本,安装时添加防火墙规则

NSIS 脚本,安装时添加防火墙规则

时间:2024-08-30 18:16:40浏览次数:10  
标签:Dim netsh firewall INSTDIR 防火墙 NSIS 添加 advfirewall ruleName

场景

在 Windows 上运行需要访问网络或者提供网络服务的程序,需要防火墙放行。默认情况下,在首次运行程序时,可能会有如下弹窗,只有用户点击运行才能继续使用网络。部分情况,可能是直接被拦截,都没有这个提示。

Windows 防火墙规则 | Microsoft Learn

如果出现问题,手动处理的话,可以在 Windows 防火墙的高级设置中,添加入站或出站规则,或者配置 “允许应用或功能通过 Windows Defender 防火墙”。

这里介绍的是,如果在应用安装时(使用 NSIS 打包),自动添加防火墙规则,避免上述问题。

netsh advfirewall

基本思路是使用 netsh advfirewall 命令来进行防火墙规则的添加,

添加规则命令参考:

netsh advfirewall firewall add rule name="ruleName" program="C:\Program Files\7-Zip\7z.exe" action=allow dir=in enable=yes

移除规则命令参考(卸载时调用):

netsh advfirewall firewall delete rule name="ruleName" 

关于 netsh advfirewall 的更多资料

Use netsh advfirewall firewall context - Windows Server | Microsoft Learn

在 NSIS 中集成上述 netsh 命令

在 NSIS 脚本中,可以通过 ExecWait 直接执行命令,参考如下

#define FIREWALL_NAME "my dicom viewer"

Function .onInstSuccess
  ExecWait 'netsh advfirewall firewall add rule name="${FIREWALL_NAME}" program="$INSTDIR\DicomViewer.exe" dir=in action=allow'
  ExecWait 'netsh advfirewall firewall add rule name="${FIREWALL_NAME}" program="$INSTDIR\DicomViewer.exe" dir=out action=allow'
FunctionEnd

Function un.onUninstSuccess
  ExecWait 'netsh advfirewall firewall delete rule name="${FIREWALL_NAME}"'
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从您的计算机移除"
FunctionEnd

上述写法能成功执行,但是有个问题,在执行时,会打开 CMD 命令行窗口。看起来的效果就是会有黑框框一闪而过,如果是内部使用的工程板软件,勉强可以接受,如果是面向用户的软件,这个问题还需要进一步处理。

改进 CMD 命令行窗口的闪烁

这里使用的方式是,在 NSIS 中,调用 vbs 脚本,可以做到没有命令行窗口。

添加规则的脚本如下

Dim arg1
arg1 = WScript.Arguments(0)

Dim shell
Set shell = CreateObject("WScript.Shell")

Dim ruleName
ruleName = "my dicom viewer"

Dim command1
command1 = "netsh advfirewall firewall add rule name=""" & ruleName & """ program=""" & arg1 & """ action=allow dir=in enable=yes"
Dim command2
command2 = "netsh advfirewall firewall add rule name=""" & ruleName & """ program=""" & arg1 & """ action=allow dir=out enable=yes"

shell.Run command1, 0, True ' 0 表示静默,True 表示等待命令执行完成
shell.Run command2, 0, True

删除规则的脚本如下

Dim shell
Set shell = CreateObject("WScript.Shell")

Dim ruleName
ruleName = "my dicom viewer"

Dim command1
command1 = "netsh advfirewall firewall delete rule name=""" & ruleName & """ "

shell.Run command1, 0, True ' 0 表示静默,True 表示等待命令执行完成

因为要在安装或者卸载时调用,所以这个文件要被放到安装包中。

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite ifnewer
  File "Script\after-install.vbs"
  File "Script\after-uninstall.vbs"
SectionEnd

在安装成功之后调用

; 安装成功之后调用
Function .onInstSuccess
  ExecWait '"wscript.exe" "$INSTDIR\after-install.vbs" "$INSTDIR\DicomViewer.exe"'
FunctionEnd

在卸载删除全部文件之前调用。因为这里是调用安装目录下的文件,所以不能放在 Function un.onUninstSuccess 中处理,因为那时候,文件都已经被删除了,无法被调用。

Section Uninstall
  Delete "$INSTDIR\uninst.exe"
  Delete "$INSTDIR\DicomViewer.exe"

  ExecWait '"wscript.exe" "$INSTDIR\after-uninstall.vbs" '
  Delete "$INSTDIR\*.*"
  RMDir /r "$INSTDIR"
SectionEnd

注意事项

netsh advfirewall 命令操作,需要管理员权限。通常安装程序会以管理员身份运行,如果不是,则需要注意这个问题。

原文链接:https://www.cnblogs.com/jasongrass/p/18389183

标签:Dim,netsh,firewall,INSTDIR,防火墙,NSIS,添加,advfirewall,ruleName
From: https://www.cnblogs.com/jasongrass/p/18389183

相关文章

  • 给一个块元素添加多张背景图片
    最近做的项目需要用到多张底图(背景图)最开始做的时候能想到的办法只有嵌套多层div然后设置背景图并定位以实现今天重写这块代码发现明明可以很简单的解决!!!话不多说,上代码<divclass="menu"><!--任意内容--></div>先定义元素类名,再在css中设置背景图.menu{backg......
  • 【Azure Policy】添加策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允
    问题描述对Azure上的虚拟机资源,需要进行安全管理。只有指定的IP地址才能够通过RDP/SSH远程到虚拟机上,有如下几点考虑:1)使用AzurePolicy服务,扫描订阅中全部的网络安全组(NSG:NetworkSecurityGroup)资源2)判断入站规则,判断是否是3389,22端口3)判断源地址是否是被允许的I......
  • 安全:linux禁止响应ping,不使用防火墙
    一,永久性关闭响应ping查看默认是否允许ping:[root@bloggsapi]#cat/proc/sys/net/ipv4/icmp_echo_ignore_all0 说明:(0表示允许,1表示禁止)编辑sysctl.conf[root@bloggsapi]#vi/etc/sysctl.conf增加一行:#ignorepingnet.ipv4.icmp_echo_ignore_all=1使生效:[root......
  • KubeSphere 添加节点
    首先感谢这份博客https://my.oschina.net/u/4197945/blog/15510668  作者:运维有术星主 参考KubeSphere官网文档:https://www.kubesphere.io/zh/docs/v3.4/devops-user-guide/how-to-use/pipelines/create-a-pipeline-using-graphical-editing-panel/ 此份文档记录配置过......
  • 华为防火墙6620E SNMP 强制使用V2C 版本
    snmp-agentsnmp-agentlocal-engineid800007DB036D8snmp-agentcommunityreadcipher%^%#wC;_!G+N[i/Q%|Ma!'`<'c,6F*k)sM4}=mPZ!$*LarV}g{7,f\Q!UthyHYdvbR/\ZN,:%^%#snmp-agentcommunitywritecipher%^%#uj2t;*3#wLEAWpZ!l~g%\:)GnIB=<SZ&......
  • Vue2实现应用添加水印的功能
    需求有的情况,我们需要给我们的网页添加水印。我们可以使用第三方库WatermarkDesign。官方地址:https://watermark-design.github.io/watermark/zh/效果示例代码入口文件main.jsimportWatermarkDesignfrom'@watermark-design/vue';Vue.use(WatermarkDesign)vue容器App......
  • 【Azure Policy】添加策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允
    问题描述对Azure上的虚拟机资源,需要进行安全管理。只有指定的IP地址才能够通过RDP/SSH远程到虚拟机上,有如下几点考虑:1)使用AzurePolicy服务,扫描订阅中全部的网络安全组(NSG:NetworkSecurityGroup)资源2)判断入站规则,判断是否是3389,22端口3)判断源地址是否是被允许的I......
  • Windows怎么让防火墙开放端口
    开放端口的方法先从控制面板,进入到WindowsDefender防火墙点击高级设置,点击入站规则点击右边的新建规则,点击端口,点击下一步选择协议类型和端口号点击下一步即可查看是否开放端口成功的方法:进入任务管......
  • 29:函数查询,添加,修改,删除
    #_*_coding:utf-8_*_importosdeffile_handle(filename,backend_data,record_list=None,type='fetch'):#type:fetchappendchangenew_file=filename+'_new'bak_file=filename+'_bak'iftype=='fetch':......
  • 红帽系的linux系统中防火墙--firewalld
    firewalld简介firewalld是RedHat系列Linux发行版(如Fedora、CentOS等)引入的一种动态防火墙管理工具,它充当了Linux内核的Netfilter框架的前端,具体防火墙执行是由内核的netfilter来执行的。firewalld提供了一个基于区域(zone)和服务(service)的简化配置界面,使得管理防火墙规则更......