Skip to content

Instantly share code, notes, and snippets.

@tmanternach
Last active April 17, 2024 11:24
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
@WladyX
Copy link

WladyX commented Jul 21, 2023

you missed my last sentence :))

@tmanternach
Copy link
Author

Dang, I need more ☕️ this morning! I am out of ideas then.

@WladyX
Copy link

WladyX commented Jul 21, 2023

cool, no worries, i'll have to see if other apple scripts are also slow, or only this one and start digging.
Thank you for your support!

@WladyX
Copy link

WladyX commented Aug 8, 2023

Update: looks like there was a MacOS, i suspect some DNS issues, long story short after a reboot all was working (fast) as expected.

@orizonlabs
Copy link

Hi,
First, this is awesome I was wondering how to manage this for a long time now. Not having much experience in applescript, this is really useful thanks!

On my side using Ventura 13.5 and GlobalProtect 6.2.0-89 it works very well for connecting, but not for disconnecting. I assume the UI has changed since there is not 'disconnect' button in place of the 'connect' button when the VPN is active. Instead I need to click on the three lines button on top right and select the last option.
I managed to activate the top right button with click button 1 of window 1 but I can't figure out how to select the last menu item with apple script. Any chance you can help?

@tmanternach
Copy link
Author

Hi, First, this is awesome I was wondering how to manage this for a long time now. Not having much experience in applescript, this is really useful thanks!

On my side using Ventura 13.5 and GlobalProtect 6.2.0-89 it works very well for connecting, but not for disconnecting. I assume the UI has changed since there is not 'disconnect' button in place of the 'connect' button when the VPN is active. Instead I need to click on the three lines button on top right and select the last option. I managed to activate the top right button with click button 1 of window 1 but I can't figure out how to select the last menu item with apple script. Any chance you can help?

Any chance you would be able to email me a couple of screenshots of your disconnect process? My email is on my github profile if you want to keep it private.

@tmanternach
Copy link
Author

@orizonlabs I've added a new applescript to this gist that might work for you. I updated to 6.2.0-89, but mine does not behave the same way as yours so I had to do a little guessing.

Please report back if this works or not. ;-)

@orizonlabs
Copy link

orizonlabs commented Aug 15, 2023

Hi!
Many thanks for your feedback.

Running the updated script does not much, and has the following output:
menu bar item 1 of menu bar 2 of application process "GlobalProtect" of application "System Events"

Here is a screenshot of the disconnect button, it's the last one which says 'Déconnecter', in French :)

https://dsc.cloud/angeswadman/globalprotect.jpg

EDIT: I was eager to answer, and didn't test it deeply enough. I translated the items menus in the script, and it works now. The only item I didn't translate was "Global Protect Options Menu".

@tmanternach
Copy link
Author

@orizonlabs Sorry for the delayed response! I came to suggest you translate those items to French, but it looks like you beat me to it! I'm glad it works for you! Come back if it ever breaks, happy to help. 🍻

@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.

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