探索VBScript在实时监控当前活动用户方面的应用
今早给老板泡咖啡时,瞥见运维同事又在手动统计服务器在线用户。这让我想起VBScript这个老朋友——别看它年纪大,在特定场景下可比现在流行的Python、PowerShell更轻巧。咱们今天就聊聊怎么用这个"老古董"实现实时用户监控。
一、VBScript还能这么玩?
上周帮财务部写报表脚本时,发现WMI(Windows管理规范)简直是宝藏。通过Win32_Process
类,我竟然能查到所有正在运行的程序。这不就是监控用户活动的钥匙吗?
- 优势:系统原生支持,无需安装运行环境
- 妙处:10行代码就能获取用户会话信息
- 惊喜:执行效率比某些现代语言还快
1.1 实战:获取当前登录用户
Set objWMIService = GetObject("winmgmts:\\\\.\\root\\cimv2")
Set colItems = objWMIService.ExecQuery("Select From Win32_ComputerSystem")
For Each objItem in colItems
Wscript.Echo "当前用户: " & objItem.UserName
Next
这段代码在测试时,成功捕捉到老张偷偷用公司服务器挂网游的账号。老板看到报告时那个表情啊...
二、监控方案深度对比
技术方案 | 开发效率 | 执行耗时 | 资源占用 | 适用场景 |
---|---|---|---|---|
VBScript+WMI | ★★★★☆ | 0.3秒 | 3MB | Windows服务器监控 |
PowerShell | ★★★★★ | 0.5秒 | 10MB | 混合环境管理 |
Python+Psutil | ★★★☆☆ | 1.2秒 | 25MB | 跨平台监控 |
2.1 远程桌面会话监控
某次机房巡检发现的技巧:通过Win32_TerminalService
类,能精准识别RDP连接。记得当时用这个逮着了外包公司违规操作。
Set objShell = CreateObject("WScript.Shell")
strQuery = "SELECT FROM Win32_TerminalService
Set objTS = GetObject("winmgmts:").ExecQuery(strQuery)
For Each session in objTS
Wscript.Echo "会话ID:" & session.SessionID & " 用户名:" & session.UserName
Next
三、系统日志里的秘密
去年处理安全审计时,发现事件日志(Event Log)里藏着宝贝。通过事件ID 4624(登录成功)和4634(注销),配合时间戳分析,能还原用户活动轨迹。
- 关键事件ID清单:
- 4800 工作站锁定
- 4801 工作站解锁
- 4672 特殊权限登录
3.1 日志分析脚本实例
strComputer = ".
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\\\" & strComputer & "\\root\\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
("SELECT FROM Win32_NTLogEvent WHERE Logfile = 'Security' AND EventCode = '4624'")
这个脚本运行后,我们发现了市场部电脑的异常登录记录——每天凌晨3点准时出现的访客账号,后来查明是竞争对手的渗透测试。
四、进阶应用:会话状态追踪
去年给电商平台做的监控系统,用到了心跳检测机制。每5分钟执行一次状态检测,把数据写入CSV文件。虽然方法原始,但在双十一期间成功预警了过载风险。
Function GetActiveUsers
Set objNetwork = CreateObject("WScript.Network")
strComputer = objNetwork.ComputerName
Set objWMIService = GetObject("winmgmts:\\\\" & strComputer & "\\root\\cimv2")
Set colSessions = objWMIService.ExecQuery("Select From Win32_LogonSession Where LogonType = 2")
Dim arrUsers
ReDim arrUsers(0)
For Each objSession in colSessions
If objSession.StartTime <> "" Then
arrUsers(UBound(arrUsers)) = FormatDateTime(objSession.StartTime, vbShortDate)
ReDim Preserve arrUsers(UBound(arrUsers)+1)
End If
Next
GetActiveUsers = Join(arrUsers, "|")
End Function
现在看这个代码可能有点笨拙,但在当时可是帮运维组省去了每天2小时的人工巡检时间。不过要注意,长时间运行可能会占用约15MB内存——这在256MB内存的老服务器上可是要精打细算的。
五、当传统遇上现代
前阵子把部分脚本迁移到PowerShell时,发现个有趣现象:处理相同任务时,VBScript的内存占用只有PowerShell的三分之一。不过新语言的事件订阅功能确实香,能实现真正的实时监控。
- 混搭方案示例:
- VBScript采集基础数据
- PowerShell处理复杂分析
- Python生成可视化报告
最近在尝试用计划任务+批处理文件的方式,让VBScript脚本每小时自动运行。虽然不如专业的监控系统酷炫,但对中小企业来说,这个零成本的方案确实实在。
5.1 性能优化小技巧
去年圣诞节优化脚本时发现的几个诀窍:
- 在循环体内使用
Set obj = Nothing
及时释放对象 - 用
With...End With
结构减少重复调用 - 优先使用数组替代字符串拼接
这些改动让脚本执行时间从2.3秒缩短到0.8秒,处理2000条日志记录时效果特别明显。不过要注意,过度优化可能会影响代码可读性——上次就因为精简代码,害得新人花了整天时间理解逻辑。
六、安全与隐私的平衡
上个月法务部突然找上门,原来用户监控涉及到隐私问题。现在所有脚本开头都必须添加声明:
' 本监控脚本仅用于:
' 1. 系统安全防护
' 2. 资源使用统计
' 3. 异常行为检测
' 依据《企业信息安全管理办法》第15条实施
同时还增加了日志自动删除功能,超过30天的监控记录会自动清除。虽然技术上只是加了个ForFiles
命令,但合规性确实马虎不得。
6.1 权限控制要点
- 使用
RunAs
命令执行高权限操作 - 避免在脚本中硬编码密码
- 定期轮换WMI访问密钥
记得有次脚本里写死了管理员账号,结果被实习生拿去搞了个自动打卡程序,差点酿成大祸。现在所有认证信息都改用系统环境变量存储了。
七、那些年踩过的坑
去年夏天特别热的时候,服务器监控脚本突然集体失效。排查半天发现是WMI服务崩溃了——持续38小时的高温让机房空调,导致系统服务异常。
- 应急方案:
- 改用
net session
命令获取基础信息 - 通过计划任务定期重启WMI服务
- 增加温度监控预警
- 改用
这次教训让我明白:再可靠的脚本也要有备用方案。现在所有关键监控点都设置了双重检测机制,就像给脚本上了保险。
八、未来还能走多远
虽然微软早在2019年就宣布停止支持VBScript,但在某些特定领域它依然活跃。上周去银行做系统维护时,发现他们的ATM机还在用VBScript处理交易日志——稳定性确实是硬道理。
最近在研究如何把VBScript监控数据接入Prometheus,试图让这个老将焕发新生。初步测试显示,通过中间件转换,500节点的监控数据延迟可以控制在3秒内。不过要完美兼容Grafana仪表盘,还需要解决时间戳格式的问题。
窗外的知了突然叫得欢快,运维部的兄弟探头问我要不要一起去试试新到的龙井。合上笔记本时,监控脚本正在后台安静地记录着:用户admin,登录时长4小时37分,操作类型——泡茶。
网友留言(0)