今天用户反馈了一个问题,运行程序弹了个框
这个只有程序第一次运行会出来,之后就不会了。
当然改个程序名字,又会弹出来。
强烈怀疑是写到了注册表,果然被我找到了。
“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules”里面有详细信息
(每个人可能不一样,cmd打开regedit,ctrl+f,搜程序路径即可)
我模仿着加了一条。(改了程序名字和路径),结果没鸟用。
找了一下午之后,终于找到了解决方法
netsh advfirewall firewall 这个可以
netsh advfirewall firewall add rule ?
用法: add rule name=<string> dir=in|out action=allow|block|bypass [program=<program path>] [service=<service short name>|any] [description=<string>] [enable=yes|no (default=yes)] [profile=public|private|domain|any[,...]] [localip=any|<IPv4 address>|<IPv6 address>|<subnet>|<range>|<list>] [remoteip=any|localsubnet|dns|dhcp|wins|defaultgateway| <IPv4 address>|<IPv6 address>|<subnet>|<range>|<list>] [localport=0-65535|<port range>[,...]|RPC|RPC-EPMap|IPHTTPS|any (default=a ny)] [remoteport=0-65535|<port range>[,...]|any (default=any)] [protocol=0-255|icmpv4|icmpv6|icmpv4:type,code|icmpv6:type,code| tcp|udp|any (default=any)] [interfacetype=wireless|lan|ras|any] [rmtcomputergrp=<SDDL string>] [rmtusrgrp=<SDDL string>] [edge=yes|deferapp|deferuser|no (default=no)] [security=authenticate|authenc|authdynenc|authnoencap|notrequired (default=notrequired)]
备注:
- 将新的入站或出站规则添加到防火墙策略。 - 规则名称应该是唯一的,且不能为 "all"。 - 如果已指定远程计算机或用户组,则 security 必须为 authenticate、authenc、authdynenc 或 authnoencap。 - 为 authdynenc 设置安全性可允许系统动态协商为匹配 给定 Windows 防火墙规则的通信使用加密。 根据现有连接安全规则属性协商加密。 选择此选项后,只要入站 IPSec 连接已设置安全保护, 但未使用 IPSec 进行加密,计算机就能够接收该入站连接的第一个 TCP 或 UDP 包。 一旦处理了第一个数据包,服务器将重新协商连接并对其进行升级,以便所 有后续通信都完全加密。 - 如果 action=bypass,则 dir=in 时必须指定远程计算机组。 - 如果 service=any,则规则仅应用到服务。 - ICMP 类型或代码可以为 "any"。 - Edge 只能为入站规则指定。 - AuthEnc 和 authnoencap 不能同时使用。 - Authdynenc 仅当 dir=in 时有效。 - 设置 authnoencap 后,security=authenticate 选项就变成可选参数。
示例:
为不具有封装的 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
为 TCP 端口 80 通信添加需要安全和加密的入站规则: netsh advfirewall firewall add rule name="Require Encryption for Inbound TCP/80" protocol=TCP dir=in localport=80 security=authdynenc action=allow
为 messenger.exe 添加需要安全的入站规则: netsh advfirewall firewall add rule name="allow messenger" dir=in program="c:\program files\messenger\msmsgs.exe" security=authenticate action=allow
为 SDDL 字符串标识的组 acmedomain\scanners 添
|
最后,我写的脚本如下:
netsh advfirewall firewall add rule name="test" dir=in program="E:\项目相关\代码\kuasheng\bin\test12.exe" security=authnoencap action=allow
郁闷,a.bat
set exename=%1
set exename=%exename:"=%
set exepath=%2
set exepath=%exepath:"=%
set mycmd="netsh advfirewall firewall show rule name=%1"
for /f "delims=" %%a in ('%mycmd%') do (
echo %%a | findstr /c:"%exename%" && goto finish || goto job
)
:job
echo not exist
netsh advfirewall firewall add rule name="%exename%" dir=in program="%exepath%" security=authnoencap action=allow
:finish
pause
执行WinExec("a.bat test E:/项目相关/代码/kuasheng/bin/test12.exe",SW_SHOW);
报错 包含无效的字符或长度
netsh advfirewall firewall add rule name="test" dir=in program="E:/项目相关/代码/kuasheng/bin/test12.exe" security=authnoencap action=allow
正常,原因不明。。郁闷。
另外win10 需要提升脚本权限
@echo off title 获取管理员权限 mode con cols=100 lines=20 color 3f
:: 开始获取管理员权限 setlocal set uac=~uac_permission_tmp_%random% md "%SystemRoot%\system32\%uac%" 2>nul if %errorlevel%==0 ( rd "%SystemRoot%\system32\%uac%" >nul 2>nul ) else ( echo set uac = CreateObject^("Shell.Application"^)>"%temp%\%uac%.vbs" echo uac.ShellExecute "%~s0","","","runas",1 >>"%temp%\%uac%.vbs" echo WScript.Quit >>"%temp%\%uac%.vbs" "%temp%\%uac%.vbs" /f del /f /q "%temp%\%uac%.vbs" & exit ) endlocal :: 完成获取,下面可以开始写你自己的代码了
echo. echo 原理:先尝试在系统目录下临时新建一个文件夹,若已获取管理员权限或是运行在XP等不需要管理员权限的 echo 老系统时,是可以新建成功的,此时只需删除这个临时新建的文件夹就好了,否则通过创建一个临时 echo vbs脚本获取管理员权限,然后再删除这个临时vbs脚本文件。 echo. echo 提示:当获取管理员目录后,你的批处理运行目录会发生变化,为保证目录准确, echo 可通过 cd 切换目录,例“cd /d %%~dp0”切换回批处理所在目录 echo. echo 当前运行目录: %cd%\ echo 批处理所在目录:%~dp0 echo. echo 例:切换回批处理所在目录 echo cd /d %%~dp0 echo.
cd /d %~dp0
REM 把你需要运行的脚本放到下面就可以了
|