标题: [文件操作] 如何限制批处理的启动次数 [打印本页]
作者: GAGATOSHUT 时间: 2015-1-25 10:38 标题: 如何限制批处理的启动次数
比如我要开启一个程序脚本,那么在进程中就会有一个cmd.exe的进程
这个进程是属于我这个脚本的,那么问题来了
如果只能打开一个cmd.exe,我的意思就是说,只能打开一个批处理脚本
因为有时候我打开了,最小化,放在任务栏中,有时候不知道已经开启了,我就会再次打开一个
这样时间长了,就会打开很多很多的批处理,我不想这样
在帖子中我发现了一个代码,但是是限制自身的二次开启,和我的有的一样,我的是限制批处理格式的脚本二次开启(cmd.exe)
另附上源代码,以供分析之用:- @echo off
- %1 %0 : 3>>%0||exit
- echo 运行过程中无法启动第二个此脚本
- pause
复制代码
作者: GAGATOSHUT 时间: 2015-1-25 10:40
回复 1# GAGATOSHUT
如果=如何
作者: pcl_test 时间: 2015-1-25 13:50
本帖最后由 pcl_test 于 2015-1-25 14:00 编辑
回复 1# GAGATOSHUT
请以管理员身份运行该批处理,因为需写入注册表,如果被杀软拦截,请选择允许运行或先退出杀软- @echo off
- reg delete "HKCR\.bat" /f >nul
- echo 已无法运行其他bat文件!
- echo 按任意键将结束并恢复正常&pause>nul
- reg add "HKCR\.bat" /ve /t REG_SZ /d "batfile" /f >nul
- exit
复制代码
作者: GAGATOSHUT 时间: 2015-1-25 15:07
回复 3# pcl_test
首先谢谢你的回复,你的代码我运行后,还是能开启第二个批处理文件,你看看是否还有其他办法
作者: pcl_test 时间: 2015-1-25 15:56
回复 4# GAGATOSHUT
嗯,只针对双击打开bat有效
作者: pcl_test 时间: 2015-1-25 17:38
本帖最后由 pcl_test 于 2015-1-25 17:40 编辑
回复 4# GAGATOSHUT
这个是直接禁止cmd.exe再运行- @echo off
- reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\cmd.exe" /v "Debugger" /t REG_SZ /d "C:\\cmdtemp.exe" /f >nul
- echo 已无法运行cmd.exe!
- echo 按任意键将结束并恢复正常&pause>nul
- reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\cmd.exe" /f >nul
- exit
复制代码
作者: bailong360 时间: 2015-1-25 17:47
- @echo off
- for /f "skip=2 tokens=*" %%i in ('wmic process where name^="cmd.exe" get Commandline ^|findstr "%~nx0"') do (
- set jud=%%i
- if defined jud exit
- )
- pause
- rem 只能同时运行skip-1个CMD
复制代码
以前写过一个..
作者: 再世情緣 时间: 2015-1-25 19:05
本帖最后由 再世情緣 于 2015-1-25 19:13 编辑
- @echo off&set /a "i=0"
- for /f "tokens=1,2" %%a in ('tasklist /v /nh /fi "imagename eq cmd.exe" 2^>nul') do (
- echo.[ %%a ] [ %%b ]
- set /a "i=+1"
- )
- echo.当前 CMD 进程数 [ %i% ]
- pause.
复制代码
为毛明明我只打开了一次,却获取到2个CMD进程,但是,在任务管理器里只有一个CMD进程啊。。
再次打开,获取到3个CMD进程,与上个窗口对比,只有一个CMD ID一样。。。
作者: CrLf 时间: 2015-1-25 21:58
回复 8# 再世情緣
for /f "tokens=1,2" %%a in ('tasklist /v /nh /fi "imagename eq cmd.exe" 2^>nul') do ...
这里实际上是从 cmd /c tasklist /v /nh /fi "imagename eq cmd.exe" 2^>nul 的输出中获取输入的,所以会有两个 cmd.exe
作者: 再世情緣 时间: 2015-1-25 22:06
回复 9# CrLf
哦。。。谢谢了。。
作者: CrLf 时间: 2015-1-25 22:46
这个需求太诡异了
无非先判断再创建和判断重复则杀掉两种思路,想过去只有几种做法:
1、autoexec.bat 判断是否有多个 cmd.exe
2、将 cmd 改名为 隐藏boss.exe,映像劫持 cmd.exe 到一个脚本中判断不存在 隐藏boss.exe 进程则执行 隐藏boss.exe
3、开机运行一个程序循环监控是否存在cmd进程,存在多个 cmd.exe 则将新增的 cmd 结束
4、劫持进程创建,或在系统关键 dll 中篡改 createprocess 等函数
作者: tmplinshi 时间: 2015-1-25 22:49
本帖最后由 tmplinshi 于 2015-1-25 22:52 编辑
我以前收藏的两个代码:(具体是什么意思不要问我,我也不知道。)- :: http://demon.tw/reverse/cmd-internal-redirect.html
-
- @echo off 2>con 3>&2 4>>%0
- echo single instance batch
- echo http://demon.tw
- pause
复制代码
- :: http://www.enun.net/?p=1419
-
- @echo off
- %1 %0 : 3>>%0
- pause
复制代码
作者: CrLf 时间: 2015-1-26 00:11
本帖最后由 CrLf 于 2015-1-26 00:27 编辑
回复 12# tmplinshi
我去,这些人转载都当作原创的么...
http://bbs.bathome.net/viewthread.php?tid=16369
原理见6楼
记得 demon 有个不用 exit 的版本,没找到,依稀记得和句柄备份有关,不知道会不会是像这样:- @echo off 2>nul 3>nul 4>>%0
- dir
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |