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连接。" }
补充说明
你之前尝试的ipconfig和netstat确实不会直接返回连接建立时间,因为它们的定位是网络配置和连接状态查询,而非拨号连接的生命周期追踪。而rasdial是专门针对拨号(包括VPN)连接的工具,能返回客户端侧可获取的最准确的连接时长信息,完全适配你的无管理员权限场景。
备注:内容来源于stack exchange,提问作者Russ




