求VBS大神修改一个程序监控的脚本

求VBS大神修改一个程序监控的脚本,第1张

2>nul 3>nul&@echo off&cls

'&if "%1"=="h" goto :on

'&start wscript.exe /nologo /e:vbs %0

'&exit

:s=wscript.scriptfullname

:set oshell=createobject("wscript.shell")

:oshell.run "cmd /c"&""""&s&""""&" h",0,false

:on error resume next

:lp

'&netstat -an|find "211"

'&if %errorlevel%==0 (

'&for /f "delims=" %%i in ('netstat -an^|find "211"') do (

'&for /f "tokens=3 delims=: " %%j in ("%%i") do (

'&if not %%j==211 goto findexe

'))) else goto findexe

'&goto ending

:findexe

'&tasklist|find /i "slbroom.exe"

'&if %errorlevel%==0 (

'&taskkill /f /im slbroom.exe

'&start "slbroom.exe"

') else start "slbroom.exe"

:ending

'&rem pause

'&ping /n 2 127.1 >nul

'&goto lp说明:把倒数5行和6行的“startslbroom.exe”后面的slbroom.exe前加上它的完整路径,如果slbroom.exe不是环境路径中的目录里。

运行后,bat就隐藏运行,结束这个bat的话,就在任务管理器,找到cmd.exe,结束进程就可以了。

如果原来的运行找不到slbroom.exe,上面代码已经略微完善了一下,就可以了

在App类里面定义一个未处理异常的回调函数。例如:

static LONG ApplicationCrashHandler(EXCEPTION_POINTERS* pException)

然后在这个函数里面实现计算机重启的功能。代码你可以自己在网上查询。这里我把提权限和重启的参考代码附上:

   OSVERSIONINFO os

    os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO)

    GetVersionEx(&os)

    if (VER_PLATFORM_WIN32_NT == os.dwPlatformId)

    {

        HANDLE handle

        TOKEN_PRIVILEGES tkp

        OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &handle)

        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid)

        tkp.PrivilegeCount = 1

        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED

        AdjustTokenPrivileges(handle, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0)

        if (GetLastError() != ERROR_SUCCESS)

        {

            MessageBox(NULL, TEXT("AdjustTokenPrivileges error"), TEXT("error"), MB_OK | MB_ICONERROR)

        }

    }

    ExitWindowsEx(EWX_REBOOT, 0)

在App类的InitInstance成员函数的前面加上下列语句:

SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)App)

这个函数的功能是在整个进程出现了未处理异常的时候,就会把他交给ApplicationCrashHandler来处理,这个函数里面我们是做了重启 *** 作,因而能达到程序崩溃后能重启计算机的目的。

上面是在目标进程中来实现程序崩溃后重启计算机的,不需要另外单独写一个监控程序。如果需要单独写监控程序来做一个守护进程,可以用进程快照或者枚举进程来实现,这种做法缺点是用户更改了程序名就会出现问题,更好的做法是用内核对象来实现,在目标进程中申请一个内核对象,监控进程中打开这个内核对象,如果能打开就说明目标进程存在,否则表示不存在目标进程,就可以重启计算机了。这种做法记得在程序异常的时候关闭内核对象,否则当程序崩溃的时候,d出了标准的异常对话框,内核对象的生存周期还在,就无法达到程序崩溃的时候重启计算机了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12116194.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存