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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:57:49