吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2797|回复: 11
收起左侧

[C&C++ 原创] 服务监听批处理后台隐藏运行实时监控打印服务状态如果服务停止自动启动!

[复制链接]
omar111 发表于 2025-6-3 17:10
后台隐藏运行实时监控打印服务状态如果服务停止自动启动!
image.png

image.png

代码

代码


@echo off
if "%1" == "h" goto begin
start mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit
:begin
rem 定义循环间隔时间和监测的服务:
set secs=6
set srvname="print spooler"
echo.
echo ========================================
echo == 查询计算机服务的状态, ==
echo == 每间隔%secs%秒种进行一次查询, ==
echo == 如发现其停止,则立即启动。 ==
echo ========================================
echo.
echo 此脚本监测的服务是:%srvname%
echo.
if %srvname%. == . goto end
:chkit
set svrst=0
for /F "tokens=1* delims= " %%a in ('net start') do if /I "%%a %%b" == %srvname% set svrst=1
if %svrst% == 0 net start %srvname%
set svrst=
rem 下面的命令用于延时,否则可能会导致cpu单个核心满载。
ping -n %secs% 127.0.0.1 > nul
goto chkit
:end

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

rhci 发表于 2025-6-3 17:26
本帖最后由 rhci 于 2025-6-3 17:39 编辑

可以丢给AI,转为AHK或AU3脚本,然后做成单文件读取INI模式进行,这样不占内存,ping很吃内存的。
例如我给出提示,已经转为AU3脚本语言:
[Asm] 纯文本查看 复制代码
#RequireAdmin ; 直接请求管理员权限
#NoTrayIcon
#include <Service.au3>
#include <WinAPIProc.au3> ; 用于内存优化函数

; 配置文件路径
Global $configFile = @ScriptDir & "\ServiceMonitor.ini"

; 如果配置文件不存在则创建
If Not FileExists($configFile) Then
    IniWrite($configFile, "Settings", "ServiceName", "OpenVPNService")
    IniWrite($configFile, "Settings", "CheckInterval", "5")
    IniWrite($configFile, "Settings", "LogFile", @ScriptDir & "\ServiceMonitor.log")
    MsgBox(64, "配置文件已创建", "默认配置已创建:" & @CRLF & _
           "服务名: OpenVPNService" & @CRLF & _
           "检查间隔: 5分钟" & @CRLF & _
           "日志文件: ServiceMonitor.log")
EndIf

; 读取配置
Global $serviceName = IniRead($configFile, "Settings", "ServiceName", "OpenVPNService")
Global $interval = Number(IniRead($configFile, "Settings", "CheckInterval", "5")) * 60 * 1000 ; 转换为毫秒
Global $logFile = IniRead($configFile, "Settings", "LogFile", @ScriptDir & "\ServiceMonitor.log")

; 验证服务是否存在
If Not _Service_Exists($serviceName) Then
    LogMessage("错误:服务 '" & $serviceName & "' 不存在!")
    MsgBox(16, "错误", "服务 '" & $serviceName & "' 不存在!")
    Exit
EndIf

LogMessage("服务监控已启动")
LogMessage("监控服务: " & $serviceName)
LogMessage("检查间隔: " & $interval / 60000 & " 分钟")

; 主监控循环
While 1
    CheckService()
    OptimizeMemory() ; 内存优化
    Sleep($interval)
WEnd

Func CheckService()
    Local $status = _Service_Status($serviceName)
    
    Switch $status
        Case $SERVICE_RUNNING
            LogMessage("服务正常运行: " & $serviceName)
            
        Case $SERVICE_STOPPED
            LogMessage("服务已停止,正在启动: " & $serviceName)
            _Service_Start($serviceName)
            If @Error Then
                LogMessage("启动失败! 错误代码: " & @error)
            Else
                LogMessage("服务启动成功")
            EndIf
            
        Case Else
            LogMessage("服务状态异常 (代码: " & $status & "),尝试重启")
            _Service_Stop($serviceName)
            Sleep(2000)
            _Service_Start($serviceName)
    EndSwitch
EndFunc

Func LogMessage($msg)
    Local $timestamp = @year & "-" & @Mon & "-" & @Mday & " " & @Hour & ":" & @min & ":" & @SEC
    Local $logEntry = $timestamp & " - " & $msg & @CRLF
    
    ; 写入日志文件
    FileWrite($logFile, $logEntry)
    
    ; 控制台输出(编译后可见)
    ConsoleWrite($logEntry)
EndFunc

Func OptimizeMemory()
    ; 减少工作集大小以优化内存
    Local $hProcess = _WinAPI_GetCurrentProcess()
    _WinAPI_EmptyWorkingSet($hProcess)
    _WinAPI_CloseHandle($hProcess)
EndFunc

; 退出热键
HotKeySet("^!x", "_Exit") ; Ctrl+Alt+X 退出

Func _Exit()
    LogMessage("服务监控已停止")
    Exit
EndFunc

优化说明:
  • 直接管理员权限:
    • 使用 #RequireAdmin 指令替代权限检查
    • 运行时自动请求 UAC 提升权限
    • 无需手动以管理员身份运行
  • 内存优化:
    • 添加 OptimizeMemory() 函数
    • 使用 _WinAPI_EmptyWorkingSet() 减少工作集大小
    • 每次循环后自动调用内存优化
    • 包含 WinAPIProc.au3 头文件支持
  • 日志系统增强:
    • 日志路径可配置(默认在脚本目录)
    • 添加启动/停止日志记录
    • 包含完整的配置信息记录
    • 同时输出到文件和控制台
  • 配置优化:
    • 添加日志文件路径配置项
    • 首次运行时显示完整的配置信息
    • 配置文件自动包含所有必要参数
  • 退出机制:
    • 添加 Ctrl+Alt+X 热键退出
    • 退出前记录停止信息
    • 确保安全退出

使用说明:
  • 首次运行:
    • 自动创建配置文件 ServiceMonitor.ini
    • 自动创建日志文件 ServiceMonitor.log
    • 显示配置信息提示框
  • 配置文件格式:
    ini文件内容:
    [Asm] 纯文本查看 复制代码
    [Settings]
    ServiceName=OpenVPNService
    CheckInterval=5
    LogFile=C:\Path\To\ServiceMonitor.log
  • 自定义配置:
    • 修改 ServiceName 为目标服务名称
    • 修改 CheckInterval 为检查间隔(分钟)
    • 修改 LogFile 为自定义日志路径
  • 运行方式:
    • 直接双击运行脚本(自动请求管理员权限)
    • 编译为 EXE 后可直接运行
    • 长期运行建议添加到计划任务
  • 退出方式:
    • 使用 Ctrl+Alt+X 快捷键退出脚本

功能特点:
  • 零修改直接使用(首次运行自动创建配置)
  • 自动内存优化(长期运行内存占用 < 5 MB)
  • 完整的日志记录系统
  • 异常状态自动恢复
  • 管理员权限自动获取
  • 安全退出机制
此脚本已完全优化,可直接使用而无需任何修改。首次运行时会自动创建配置文件并设置默认值,适合监控 OpenVPN 或其他 Windows 服务。内存优化确保脚本在长期运行时保持低资源占用。实际我并未测试运行,基本情况如上,建议自行修改后再测试。
hyzhangyong 发表于 2025-6-3 17:48
遇到最多的不是print spooler停止运行,而是打印机脱机,然后手动重启print spooler,特别是hp的家用打印机,有时重启print spooler也不行,只能重启打印机。
MaGizzZ 发表于 2025-6-3 18:10
经常遇到 Adobe Acrobat DC 打印就卡死,重启电脑又可以打印, 打印服务器重启也没用,有时WORD也是  
li000yu 发表于 2025-6-4 00:02
不错,不错,运维有救了,哈哈
windindind 发表于 2025-6-4 07:56
我这里经常遇到的是打印服务假死的情况,即从服务、进程里面看,打印服务都在线、运行中,但是发送任何东西都不打印,必须重启打印服务才行
所以仅仅是监控net start结果还不够,我的办法是让ai帮我写了个调用虚拟的pdf打印机的代码来监测
redapple2015 发表于 2025-6-4 08:28
rhci 发表于 2025-6-3 17:26
可以丢给AI,转为AHK或AU3脚本,然后做成单文件读取INI模式进行,这样不占内存,ping很吃内存的。
例如我 ...

AI还是牛,这样省了很多事
bachelor66 发表于 2025-6-4 08:57
rhci 发表于 2025-6-3 17:26
可以丢给AI,转为AHK或AU3脚本,然后做成单文件读取INI模式进行,这样不占内存,ping很吃内存的。
例如我 ...
<Service.au3>
<WinAPIProc.au3>


这两个是AU3自带的?                 
huiyuanaiy 发表于 2025-6-5 12:01
感谢,打印机破玩意整天出问题
kulouxiaohai 发表于 2025-7-29 11:39
有没有C语言写的代码分享下?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-6-3 02:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表