You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows 10客户端侧通过PowerShell/CMD查询当前VPN连接建立时间的方法

Windows 10客户端侧通过PowerShell/CMD查询当前VPN连接建立时间的方法

嘿,我来帮你搞定这个问题!针对你在Windows 10 Enterprise上没有管理员权限、只能从客户端侧查询当前VPN连接建立时间的需求,这里有几个实用的方法,完全符合你的场景:

CMD方法(无需管理员权限)

rasdial是Windows自带的拨号连接管理工具,不需要管理员权限就能查看当前活跃VPN连接的详细信息,包括连接时长。你可以直接运行以下命令查看:

rasdial

输出里会包含Connection Duration字段,比如Connection Duration: 00:12:45。如果需要自动计算连接建立时间并判断是否在最近10分钟内,可以用这段批处理脚本:

@echo off
setlocal enabledelayedexpansion

:: 提取rasdial输出中的连接时长
for /f "tokens=3" %%a in ('rasdial ^| findstr /i "Connection Duration"') do (
    set "duration=%%a"
)

:: 检查是否有活跃VPN连接
if not defined duration (
    echo 当前没有活跃的VPN连接。
    goto end
)

:: 解析时长为小时、分钟、秒
for /f "tokens=1,2,3 delims=:" %%h in ("!duration!") do (
    set "hours=%%h"
    set "minutes=%%m"
    set "seconds=%%s"
)

:: 计算总秒数
set /a "total_seconds=hours*3600 + minutes*60 + seconds"

:: 获取当前时间的时间戳(借助PowerShell)
for /f %%t in ('powershell -Command "(Get-Date).ToUniversalTime() - (Get-Date -Date '1970-01-01').ToUniversalTime() | Select-Object -ExpandProperty TotalSeconds"') do (
    set "current_ts=%%t"
)

:: 计算连接建立时间的时间戳
set /a "connect_ts=current_ts - total_seconds"

:: 转换为本地时间并输出
echo VPN连接建立时间:
powershell -Command "(Get-Date -Date '1970-01-01').AddSeconds(%connect_ts%)"

:: 判断是否在最近10分钟内
for /f %%c in ('powershell -Command "(Get-Date).AddMinutes(-10) - (Get-Date -Date '1970-01-01').ToUniversalTime() | Select-Object -ExpandProperty TotalSeconds"') do (
    set "ten_min_ago_ts=%%c"
)
if !connect_ts! geq !ten_min_ago_ts! (
    echo 该VPN连接是在最近10分钟内建立的,可以触发目标脚本!
    :: 在这里添加你要执行的脚本逻辑
) else (
    echo 该VPN连接建立已超过10分钟,不触发脚本。
)

:end
endlocal

PowerShell方法(更简洁高效)

用PowerShell可以更轻松地解析rasdial的输出,直接计算连接建立时间并完成条件判断,正好满足你“仅当VPN活跃且最近10分钟内连接时触发脚本”的需求:

# 获取当前活跃VPN连接的时长信息
$vpnDurationLine = rasdial | Select-String "Connection Duration"

if ($vpnDurationLine) {
    # 提取时长字符串并转换为TimeSpan对象
    $durationStr = $vpnDurationLine.Line.Split(':')[2..4] -join ':'
    $connectionDuration = [TimeSpan]::Parse($durationStr)
    
    # 计算连接建立时间
    $connectTime = (Get-Date) - $connectionDuration
    Write-Host "当前VPN连接建立时间:$($connectTime.ToString('yyyy-MM-dd HH:mm:ss'))"

    # 判断是否在最近10分钟内
    $tenMinutesAgo = (Get-Date).AddMinutes(-10)
    if ($connectTime -ge $tenMinutesAgo) {
        Write-Host "✅ VPN是在最近10分钟内连接的,将触发目标脚本!"
        # 在这里添加你要执行的脚本逻辑,比如:
        # & "C:\path\to\your\script.ps1"
    } else {
        Write-Host "❌ VPN连接建立已超过10分钟,不触发脚本。"
    }
} else {
    Write-Host "⚠️ 当前没有活跃的VPN连接。"
}

补充说明

你之前尝试的ipconfignetstat确实不会直接返回连接建立时间,因为它们的定位是网络配置和连接状态查询,而非拨号连接的生命周期追踪。而rasdial是专门针对拨号(包括VPN)连接的工具,能返回客户端侧可获取的最准确的连接时长信息,完全适配你的无管理员权限场景。

备注:内容来源于stack exchange,提问作者Russ

火山引擎 最新活动