public/Get-CiscoAnyconnectStatus.ps1

function Get-CiscoAnyconnectStatus {
        <#
        .SYNOPSIS
            Get current AnyConnect state/status
        .DESCRIPTION
            Gets the current Cisco AnyConnect VPN state
        .PARAMETER (none)
        .EXAMPLE
            Get-CiscoAnyConnectStatus
        .LINK
            https://github.com/Skatterbrainz/ds-utils/blob/master/docs/Get-CiscoAnyConnectStatus.md
        #>

[CmdletBinding()]
    param()
    $VPNExe = "$(${env:ProgramFiles(x86)})\Cisco\Cisco AnyConnect Secure Mobility Client\vpncli.exe"
    if (Test-Path $VPNExe) {
        $fileinfo = (Get-Item -Path $VPNExe).VersionInfo | Select-Object -ExpandProperty FileVersion
        $filever = $fileinfo.replace(' ','').replace(',','.')
        $DiagComm = New-Object System.Diagnostics.ProcessStartInfo
        $DiagComm.FileName = $VPNExe
        $DiagComm.Arguments = 'state'
        $DiagComm.UseShellExecute = $false
        $DiagComm.RedirectStandardOutput = $true
        $ProcComm = New-Object System.Diagnostics.Process
        $ProcComm.StartInfo = $DiagComm
        [Void]$ProcComm.Start()
        While (!$bDone) {
            $outputComm = $ProcComm.StandardOutput.Read()
            if ($outputComm -eq -1) {
                if ($ProcComm.HasExited) {
                    $bDone = $true
                } else {
                    Wait-Event 1
                }
            } else {
                $ReadLine += "".PadLeft(1, $outputComm)
                if ($ReadLine -like "*state: Connected*") {
                    $vpnstate = 'Connected'
                } elseif ($ReadLine -like "*state: Disconnected*") {
                    $vpnstate = 'Disconnected'
                }
            }
        }
    } else {
        $vpnstate = 'NotFound'
    }
    [pscustomobject]@{
        ComputerName = $env:COMPUTERNAME
        UserName     = $env:USERNAME
        VpnPath      = $VPNExe
        VpnVersion   = $filever
        VpnState     = $vpnstate
    }
}