You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:实现后台循环运行的VBScript远程桌面连接日志脚本

改进后的远程连接监控VBS脚本(后台运行+日志记录)

看来你已经搭好了远程连接监控的基础框架,现在只需要完善后台循环逻辑、会话状态检测和日志写入的细节就行。我帮你调整并补全了脚本,解决了后台运行和精准记录的需求:

Option Explicit

' 初始化对象
Dim objFSO, myLog, oShell, lastSession, currentSession, logPath, timestamp

' 设置日志文件路径(可自行修改为目标路径)
logPath = "rdcmonitor.log"

' 创建文件系统对象和日志文件(追加模式,避免覆盖原有日志)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set myLog = objFSO.OpenTextFile(logPath, 8, True)
Set oShell = CreateObject("WScript.Shell")

' 初始会话设为本地控制台
lastSession = "CONSOLE"

' 记录脚本启动日志
timestamp = Now()
myLog.WriteLine "[" & timestamp & "] 远程连接监控脚本启动"
myLog.Close

' 后台循环监控会话状态
While True
    ' 每秒检测一次会话状态
    WScript.Sleep 1000
    
    ' 获取当前活动会话名称
    currentSession = GetActiveSession()
    
    ' 仅当会话状态变化时写入日志,避免冗余记录
    If currentSession <> lastSession Then
        timestamp = Now()
        ' 重新以追加模式打开日志文件
        Set myLog = objFSO.OpenTextFile(logPath, 8, True)
        
        If currentSession = "CONSOLE" Then
            myLog.WriteLine "[" & timestamp & "] 远程连接已断开,恢复本地控制台会话"
        Else
            myLog.WriteLine "[" & timestamp & "] 检测到远程连接,会话名称: " & currentSession
        End If
        
        myLog.Close
        ' 更新上一次会话状态
        lastSession = currentSession
    End If
Wend

' 自定义函数:获取系统当前活动会话名称
Function GetActiveSession()
    Dim objExec, strOutput, arrLines, line, sessionName, arrParts
    
    ' 执行系统命令获取会话列表
    Set objExec = oShell.Exec("query session")
    strOutput = objExec.StdOut.ReadAll()
    arrLines = Split(strOutput, vbCrLf)
    
    ' 解析命令输出,筛选出活动状态的会话
    For Each line In arrLines
        line = Trim(line)
        ' 跳过标题行和空行
        If InStr(line, "SESSIONNAME") = 0 And line <> "" Then
            arrParts = Split(line, " ")
            ' 过滤拆分后的空元素
            arrParts = Filter(arrParts, "")
            ' 检查会话状态是否为Active(活动状态)
            If UBound(arrParts) >= 2 And arrParts(2) = "Active" Then
                sessionName = arrParts(0)
                ' 控制台会话的会话名为空,统一标记为CONSOLE
                If sessionName = "" Then
                    sessionName = "CONSOLE"
                End If
                GetActiveSession = sessionName
                Exit Function
            End If
        End If
    Next
    
    ' 未找到活动会话时默认返回控制台
    GetActiveSession = "CONSOLE"
End Function

关键改进说明

  • 日志写入优化:把原脚本的日志打开模式从2(覆盖写入)改为8(追加写入),确保每次记录都保留历史日志,不会被清空。
  • 精准会话检测:新增GetActiveSession()函数,通过执行query session系统命令来获取真实的会话状态,能准确识别远程RDP会话(通常命名为RDP-Tcp#X)和本地控制台会话。
  • 状态触发日志:只有当会话状态发生变化时才写入日志,避免每秒重复记录相同状态,减少日志冗余。
  • 后台运行方法:要让脚本静默后台运行,不要用WScript.exe执行(会弹出窗口),而是用命令行运行:
    cscript //nologo your_script_name.vbs
    
    如果需要开机自动启动,可以把这个命令添加到Windows任务计划中,设置为开机触发。
  • 健壮性可选优化:如果想让脚本更稳定,可以在循环开头添加On Error Resume Next,并捕获可能的错误(比如query session命令执行失败),防止脚本意外崩溃。

内容的提问来源于stack exchange,提问作者Brkdrk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:46:22