我正在使用以下脚本来阻止IP从文本文件到Windows防火墙。
我正在使用Windows 2008 R2
@echo off if "%1"=="list" ( netsh advfirewall firewall show rule Blockit | findstr RemoteIP exit/b ) :: Deleting existing block on ips netsh advfirewall firewall delete rule name="Blockit" :: Block new ips (while reading them from blockit.txt) for /f %%i in (blockit.txt) do ( netsh advfirewall firewall add rule name="Blockit" protocol=any dir=in action=block remoteip=%%i netsh advfirewall firewall add rule name="Blockit" protocol=any dir=out action=block remoteip=%%i ) :: call this batch again with list to show the blocked IPs call %0 list
问题是,这个脚本正在为每个阻塞的IP创build一个单独的规则。
有没有办法创build更less的规则与禁止在同一规则的多个ips? 据我记得,每个规则最多允许200个禁止的ips。 所以当发现IP号码201时,它应该创build一个新的规则。 这种方式,如果我们有1000 ips来阻止它将创build只有5规则x 200 ip每个规则,而不是1000规则。
希望有人能帮助我。 谢谢
对于<200 IP的简单情况,您首先需要对文件进行迭代,并将所有IP地址转换为单个string。 然后你可以在循环之外两次调用netsh命令(一次是入站stream量,一次是出站stream量)。
为了能够处理超过200个IP,我在for循环中添加了一个计数器。 一旦超过200个IP,它将调用netsh命令并重置IP计数器,然后继续遍历文件。 最终的结果应该是你以“Blockit n ”格式结束了一系列规则,其中n是一个数字。
我不确定的一个部分是顶部的列表和删除指令。 为了使这些工作正常,脚本需要知道有多less相关的“Blockit”规则存在。 我能想到的最好的方法是列出这些结果,并通过for循环中的findstr来传递结果。 我不确定它是否正常工作。 我会继续努力的,但是我想现在就把它发布,因为它已经快到了 – 希望你可以弄清楚最后一点:)
注意在顶部附近添加了enabledelayedexpansion指令 – 这让我们使用!VAR! 样式variables在初始化期间不会被扩展; 只有在执行。 否则,最终的IPADDRvariables将只包含文本文件中的最后一个IP。
@echo off setlocal enabledelayedexpansion if "%1"=="list" ( SET /A RULECOUNT=0 for /f %%i in ('netsh advfirewall firewall show rule name^=all ^| findstr Blockit') do ( SET /A RULECOUNT+=1 netsh advfirewall firewall show rule Blockit!RULECOUNT! | findstr RemoteIP ) SET "RULECOUNT=" exit/b ) REM Deleting existing block on ips SET /A RULECOUNT=0 for /f %%i in ('netsh advfirewall firewall show rule name^=all ^| findstr Blockit') do ( SET /A RULECOUNT+=1 netsh advfirewall firewall delete rule name="Blockit!RULECOUNT!" ) SET "RULECOUNT=" REM Block new ips (while reading them from blockit.txt) SET /A IPCOUNT=0 SET /A BLOCKCOUNT=1 for /f %%i in (blockit.txt) do ( SET /A IPCOUNT+=1 if !IPCOUNT! == 201 ( netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=in action=block remoteip=!IPADDR! netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=out action=block remoteip=!IPADDR! SET /A BLOCKCOUNT+=1 SET /A IPCOUNT=1 set IPADDR=%%i ) else ( if not "!IPADDR!" == "" ( set IPADDR=!IPADDR!,%%i ) else ( set IPADDR=%%i ) ) ) REM add the final block of IPs of length less than 200 netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=in action=block remoteip=!IPADDR! netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=out action=block remoteip=!IPADDR! SET "IPCOUNT=" SET "BLOCKCOUNT=" SET "IPADDR=" REM call this batch again with list to show the blocked IPs call %0 list
顺便说一下,如果是我,我可能会考虑学习Powershell这种事情(或者实际上在半现代微软平台上的任何脚本)。 一旦你掌握了它,你会发现它比batch file更直观。
(PS – 对于任何batch file的专家阅读,随时提出一个更好的select – 我不是专家本人!)