Skip to content

Instantly share code, notes, and snippets.

@tmanternach
Last active December 2, 2024 13:27
Show Gist options
  • Save tmanternach/cbd4c213eab8569e38d6cd021b6255e5 to your computer and use it in GitHub Desktop.
Save tmanternach/cbd4c213eab8569e38d6cd021b6255e5 to your computer and use it in GitHub Desktop.
(*
Toggle GlobalProtect VPN with AppleScript
Tested using macOS Ventura 13.4.1 and GlobalProtect version 6.2.0-89
Written by Trevor Manternach, August 2023.
*)
tell application "System Events" to tell process "GlobalProtect"
click menu bar item 1 of menu bar 2
set statusText to name of static text 1 of window 1
if statusText is "Not Connected" then
# GlobalProtect is disconnected, so let's connect
click button "Connect" of window 1
set entireContents to entire contents of window 1
else if statusText is "Connected" then
# GlobalProtect is connected, so let's disconnect
set windowText to entire contents of window 1
repeat with theItem in windowText
if (class of theItem is button) then
if (value of attribute "AXTitle" of theItem is "Disconnect") then
# We found a Disconnect button on the main page, let's click it.
click theItem
exit repeat
else
# We did not find a Disconnect button on the main page, let's hope there is one in the Settings Menu.
click button "Global Protect Options Menu" of window 1
click menu item "Disconnect" of menu "Global Protect Options Menu" of button "Global Protect Options Menu" of window 1
exit repeat
end if
end if
end repeat
end if
click menu bar item 1 of menu bar 2
end tell
(*
Toggle GlobalProtect VPN with AppleScript
Tested using macOS 10.14 and GlobalProtect version 5.2.3-22
Tested using macOS Ventura 13.4.1 and GlobalProtect version 6.0.1-19
Written by Trevor Manternach, July 2021.
*)
tell application "System Events" to tell process "GlobalProtect"
click menu bar item 1 of menu bar 2 -- Activates the GlobalProtect "window" in the menubar
click button 2 of window 1 -- Clicks either Connect or Disconnect
click menu bar item 1 of menu bar 2 -- This will close the GlobalProtect "window" after clicking Connect/Disconnect. This is optional.
end tell
@mello
Copy link

mello commented Jan 23, 2024

@tmanternach Thanks so much for posting!

In case it's helpful for anyone else, I modified this script to deal with multiple VPN connections:

tell application "System Events" to tell process "GlobalProtect"
	click menu bar item 1 of menu bar 2
	set statusText to name of static text 2 of window 1
	if statusText is "Not Connected" then
		tell pop up button "Portal" of window 1
			click
			delay 0.2
			click menu item "[NAME OF VPN]" of menu 1
		end tell
	end if
end tell

I have one of these scripts for each of my VPN connections and trigger them with an Alfred workflow using a keyword.

@tmanternach
Copy link
Author

@mello You are welcome; I'm glad it's working for you, I like the idea for multiple connections. Thanks for the kind words.

@nitin88
Copy link

nitin88 commented Sep 26, 2024

@tmanternach Can you actually help how to automate entering password. Typically the username is prefilled and Password is combination of static text and token (which I can get it from another automation)

Step 1: Click Connect (VPN portal is autofilled)
Step 2: Ask for Username (autofilled) and Password (the cursor highlighted by default)
Step 3: Click Connect

@tmanternach
Copy link
Author

tmanternach commented Sep 26, 2024

@tmanternach Can you actually help how to automate entering password. Typically the username is prefilled and Password is combination of static text and token (which I can get it from another automation)

Step 1: Click Connect (VPN portal is autofilled) Step 2: Ask for Username (autofilled) and Password (the cursor highlighted by default) Step 3: Click Connect

@nitin88 Have you played with this code from a previous comment?

tell application "System Events" to tell process "GlobalProtect"
	click menu bar item 1 of menu bar 2
	tell application "System Events"
		keystroke tab
		delay 0.2
		keystroke "username"
		delay 0.2
		keystroke tab
		delay 0.2
		keystroke "password"
		delay 0.2
	end tell
	click button 2 of window 1
end tell

@nitin88
Copy link

nitin88 commented Sep 26, 2024

I modified slightly to work it. One thing I am strugguling is
image

Sometimes the GP gets stuck at this. Unless I click Refresh Connection from menu bar, it won't show username/password option. Any suggestion for this to automate?

@nitin88
Copy link

nitin88 commented Sep 26, 2024

Screenshot 2024-09-26 at 9 36 41 PM

Post confirmation, it shows username/password

@Mellbourn
Copy link

I have a similar problem to that of @orizonlabs. I am running GlobalProtect App Version 6.2.3.-270
Connect works great.
Disconnect fails on the line

click menu item "Disconnect" of menu "Global Protect Options Menu" of button "Global Protect Options Menu" of window 1

I shows the Syntax Error dialog:

System Events got an error: Can’t get menu "Global Protect Options Menu" of button "Global Protect Options Menu" of window 1 of process "GlobalProtect".

@mmacvicar
Copy link

@Mellbourn I do not use this script but I experienced the same error and noticed in my environment the Disconnect and Refresh Connection buttons lay within menu 1 of the "Global Protect Options Menu". So try changing that line to:

click menu item "Disconnect" of menu 1 of button "Global Protect Options Menu" of window 1

@Mellbourn
Copy link

@mmacvicar unfortunately, that also fails. Syntax error:
System Events got an error: Can’t get menu item "Disconnect" of menu 1 of button "Global Protect Options Menu" of window 1 of process "GlobalProtect".

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