如何通过PowerShell的Get-WinEvent订阅Windows网络连接事件?
你碰到的这个问题其实挺典型的——Get-WinEvent拿回来的是已经存在的日志条目静态集合,并不是能实时触发事件的动态对象,所以你之前用Register-ObjectEvent绑定EntryWritten事件根本行不通。下面给你两个实用的解决方案,刚好贴合你要实现的「检测到联网就检查URL可用性」的需求:
解决Windows事件日志实时监听的问题
方法1:使用CIM事件订阅(推荐,实时高效)
Windows事件日志可以通过CIM(通用信息模型)订阅实时事件,这是更现代、资源占用更低的方式,不需要反复轮询日志。
示例代码
# 定义事件触发后的动作:检查目标URL可用性并执行逻辑 $action = { # 替换成你需要检测的目标URL $targetUrl = "https://example.com" try { # 测试URL是否可访问,超时设为5秒 $response = Invoke-WebRequest -Uri $targetUrl -TimeoutSec 5 -UseBasicParsing if ($response.StatusCode -eq 200) { Write-Host "[$(Get-Date)] 已联网且目标URL可用!" -ForegroundColor Green # 在这里调用你需要执行的自定义函数 # YourCustomFunctionName } } catch { Write-Host "[$(Get-Date)] 已联网但目标URL不可访问:$_" -ForegroundColor Yellow } } # 订阅目标日志的EventID 10000事件 Register-CimIndicationEvent -Namespace "root\cimv2" -Query @" SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_NTLogEvent' AND TargetInstance.LogFile = 'Microsoft-Windows-NetworkProfile/Operational' AND TargetInstance.EventCode = 10000 "@ -SourceIdentifier NetworkConnectEvent -Action $action # 保持脚本运行,等待事件触发 Write-Host "正在监听网络连接事件...按Ctrl+C停止" do { Start-Sleep -Seconds 1 } while ($true)
代码说明
Register-CimIndicationEvent:专门用于订阅CIM实时事件,WITHIN 1表示每秒检查一次(可根据需求调整间隔)- 查询语句精准过滤了目标日志和EventID 10000,避免无效事件触发
- 动作块内置了URL可用性检测,同时处理了访问失败的异常情况
- 最后用循环保持脚本运行,防止直接退出
方法2:循环轮询日志(适合新手,逻辑简单)
如果你觉得CIM查询有点复杂,也可以用简单的循环轮询Get-WinEvent,每次只处理最新的日志条目。虽然效率稍低,但胜在容易理解和调试。
示例代码
# 初始化上次检查的时间(默认取当前时间前1秒,避免重复处理旧日志) $lastCheckTime = (Get-Date).AddSeconds(-1) $targetUrl = "https://example.com" Write-Host "正在轮询网络连接事件...按Ctrl+C停止" while ($true) { # 获取上次检查后新增的EventID 10000日志条目 $newEvents = Get-WinEvent -LogName 'Microsoft-Windows-NetworkProfile/Operational' ` -FilterXPath "*[System[EventID=10000]]" -ErrorAction SilentlyContinue | Where-Object { $_.TimeCreated -gt $lastCheckTime } if ($newEvents) { Write-Host "[$(Get-Date)] 检测到网络连接事件!" -ForegroundColor Cyan # 执行URL检查逻辑 try { $response = Invoke-WebRequest -Uri $targetUrl -TimeoutSec 5 -UseBasicParsing if ($response.StatusCode -eq 200) { Write-Host "目标URL可用,执行指定函数..." -ForegroundColor Green # 调用你的自定义函数 # YourCustomFunctionName } } catch { Write-Host "目标URL不可访问:$_" -ForegroundColor Yellow } # 更新上次检查时间为最新事件的时间,避免重复触发 $lastCheckTime = $newEvents[0].TimeCreated } # 每5秒轮询一次,可根据需求调整间隔 Start-Sleep -Seconds 5 }
代码说明
- 用
FilterXPath直接过滤EventID,比后续再筛选日志更高效 - 每次只处理上次检查之后的新条目,避免重复执行逻辑
- 轮询间隔设为5秒,平衡资源占用和响应速度
额外实用提示
- 如果你需要脚本开机自动运行,可以把它保存为
.ps1文件,然后创建Windows任务计划,设置为「登录时启动」并隐藏窗口运行 - 测试URL时,若环境需要代理,可给
Invoke-WebRequest加上-Proxy参数,或者检查系统代理设置 - 如果你只是需要快速检测网络连通性(不需要验证URL),可以用
Test-Connection -ComputerName 8.8.8.8 -Count 1 -Quiet来判断
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

