我正在研究一个 VBScript,当系统条件满足时显示一个消息框(它运行一个循环,每次迭代后都会进入休眠状态)。
问题:我注意到,当我运行脚本时,它实际上并没有显示在任务管理器中(编辑:在“进程”选项卡中),除非它之前显示过消息框(此后它会显示为“Microsoft ® Windows Based Script Host”正如我所料)。
仅供参考:我正在按名称排序搜索任务管理器,然后在“后台进程”下查看。
隐藏 VBScript 会带来一些问题,原因如下:
- 我无法轻易终止该进程:无论是在开发过程中还是为了更改常量值
- 我不知道该进程是否正在运行,也不知道运行了多少次。我只是对大约 20 个消息框感到惊讶,因为我在处理该脚本时已经多次运行了该脚本。
- 它看起来总体上是不安全的,因为脚本可以在不被看到的情况下运行。
这是正常的吗?我是不是漏掉了什么?有没有办法强制 wscript 进程始终显示在任务管理器中(编辑:在“进程”选项卡中)?
编辑:@garbb 指出,您可以在“详细信息”选项卡中看到所有正在运行的 VBScript。这实际上解决了我的大部分问题。不过,我仍然很好奇:为什么“进程”选项卡在显示第一个消息框之前不列出正在运行的 VBScript?它们是独立的进程,对吧?这为恶意脚本留下了隐蔽的空间(除非用户检查“详细信息”选项卡)。
答案1
我不知道您或这里的其他成员是否可以从这个旧的 vbscript 中获得帮助来选择正在运行的 vbscript 并想要终止它。
因此我将其命名为:
Wscript_Killer_选择器
Option Explicit
Dim Title,Copyright,fso,ws,LogFile,temp,PathLogFile,OutPut,Count,strComputer
Copyright = " ["& chr(169) &" Hackoo 2014 ]"
Title = " Processes "& DblQuote("Wscript.exe") &" Running"
Set fso = CreateObject("Scripting.FileSystemObject")
Set ws = CreateObject( "Wscript.Shell" )
LogFile="Process_WScript.txt"
temp = ws.ExpandEnvironmentStrings("%temp%")
PathLogFile = temp & "\" & LogFile
Set OutPut = fso.CreateTextFile(temp & "\" & LogFile,1)
Count = 0
strComputer = "."
Call Find("wscript.exe")
Call Explorer(PathLogFile)
'----------------------------------------------------------------------------------------------
Function Explorer(File)
Dim ws
Set ws = CreateObject("wscript.shell")
ws.run "Explorer "& File & "\",1,True
end Function
'----------------------------------------------------------------------------------------------
Sub Find(MyProcess)
Dim colItems,objItem,Process,Question
Set colItems = GetObject("winmgmts:").ExecQuery("Select * from Win32_Process " _
& "Where Name like '%"& MyProcess &"%' AND NOT commandline like '%" & wsh.scriptname & "%'",,48)
For Each objItem in colItems
Count= Count + 1
'Extracting the path of the script from the command line
Process = Trim(Mid(objItem.CommandLine,InStr(objItem.CommandLine,""" """) + 2))
Process = Replace(Process,chr(34),"")
Question = MsgBox ("Do you want to stop this script : "& DblQuote(Process) &" ?" ,VBYesNO+VbQuestion,Title+Copyright)
If Question = VbYes then
objItem.Terminate(0)' Kill this process
OutPut.WriteLine DblQuote(Process)
else
Count= Count - 1 'decrement the counter by -1
End if
Next
OutPut.WriteLine String(100,"-")
OutPut.WriteLine count & Title & " have been killed !"
End Sub
'----------------------------------------------------------------------------------------------
Function DblQuote(Str)
DblQuote = Chr(34) & Str & Chr(34)
End Function
'----------------------------------------------------------------------------------------------