Skip to content

Instantly share code, notes, and snippets.

@fergie
Created September 27, 2017 13:22
Show Gist options
  • Select an option

  • Save fergie/d5f16802f8a5c30df30af70691b38fb6 to your computer and use it in GitHub Desktop.

Select an option

Save fergie/d5f16802f8a5c30df30af70691b38fb6 to your computer and use it in GitHub Desktop.
PowerShell script to automate the Cisco AnyConnect SSL VPN client on Windows
# Source www.cze.cz
# This script is tested with "Cisco AnyConnect Secure Mobility Client version 3.0.5080"
# Run using %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File "C:\CiscoVPNAutoLogin.ps1"
# VPN connection details
[string]$CiscoVPNHost = "vpn.example.com"
[string]$Login = "username"
[string]$Password = "password"
[string]$vpncliAbsolutePath = 'C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\vpncli.exe'
[string]$vpnuiAbsolutePath = 'C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\vpnui.exe'
#****************************************************************************
#**** Please do not modify code below unless you know what you are doing ****
#****************************************************************************
Add-Type -AssemblyName System.Windows.Forms -ErrorAction Stop
# Set foreground window function
# This function is called in VPNConnect
Add-Type @'
using System;
using System.Runtime.InteropServices;
public class Win {
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
}
'@ -ErrorAction Stop
# quickly start VPN
# This function is called later in the code
Function VPNConnect()
{
Start-Process -FilePath $vpncliAbsolutePath -ArgumentList "connect $CiscoVPNHost"
$counter = 0; $h = 0;
while($counter++ -lt 1000 -and $h -eq 0)
{
sleep -m 10
$h = (Get-Process vpncli).MainWindowHandle
}
#if it takes more than 10 seconds then display message
if($h -eq 0){echo "Could not start VPNUI it takes too long."}
else{[void] [Win]::SetForegroundWindow($h)}
}
# Terminate all vpnui processes.
Get-Process | ForEach-Object {if($_.ProcessName.ToLower() -eq "vpnui")
{$Id = $_.Id; Stop-Process $Id; echo "Process vpnui with id: $Id was stopped"}}
# Terminate all vpncli processes.
Get-Process | ForEach-Object {if($_.ProcessName.ToLower() -eq "vpncli")
{$Id = $_.Id; Stop-Process $Id; echo "Process vpncli with id: $Id was stopped"}}
# Disconnect from VPN
echo "Trying to terminate remaining vpn connections"
start-Process -FilePath $vpncliAbsolutePath -ArgumentList 'disconnect' -wait
#Connect to VPN
echo "Connecting to VPN address '$CiscoVPNHost' as user '$Login'."
VPNConnect
# Write login and password
[System.Windows.Forms.SendKeys]::SendWait("$Login{Enter}")
[System.Windows.Forms.SendKeys]::SendWait("$Password{Enter}")
# Start vpnui
start-Process -FilePath $vpnuiAbsolutePath
# Wait for keydown
echo "Press any key to continue ..."
try{$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")}catch{}
@Shikha1912
Copy link

Is there any way to run this script in hidden mode?

@fergie
Copy link
Author

fergie commented Jul 24, 2020

Is there any way to run this script in hidden mode?

@Shikha1912, sorry, been a long time since I’ve used this but no, there wasn’t at the time. The script relies on launching the login form to send the username and password. It’s possible that a new client has a cleaner way to make thins work. Please let me know if you find a solution.

@shreyasfifa
Copy link

shreyasfifa commented Apr 23, 2021

What would be the reason the script just brings up the AnyConnect UI and just stops there?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment