Skip to main content

When importing an 802.1x system wireless profile, anybody know a way to make it go to the top of the preferred networks list? By default it seems to be putting it at the bottom of the list. I know how to remove it by running 'networksetup -removepreferredwirelessnetwork' but putting it back into the list seems to be more of a challenge.

I have not found a way take an existing SSID and put it at the top of the list. In order to get that to work, I've had to remove it first and then re-add it with a "0" priority.



I've got a script that looks like this:



#!/bin/bash



wifi=/usr/sbin/networksetup -listallhardwareports | grep -A 1 Wi-Fi | grep Device | awk '{print $2}'
SSIDcheck=networksetup -listpreferredwirelessnetworks $wifi | grep yourSSID



if [ $SSIDcheck = "yourSSID" ]; then
/usr/sbin/networksetup -removepreferredwirelessnetwork $wifi yourSSID
/usr/sbin/networksetup -addpreferredwirelessnetworkatindex $wifi yourSSID 0 WPA2E
else
/usr/sbin/networksetup -addpreferredwirelessnetworkatindex $wifi yourSSID 0 WPA2E
fi
exit 0



----



There are probably more efficient ways of doing this but this seems to work fine in our environment.


The issue with using '/usr/sbin/networksetup -addpreferredwirelessnetworkatindex $wifi yourSSID 0 WPA2E' is that once it adds the network back in, it is no longer tied to my 802.1x system profile.


The root of my problem is that adding a wireless configuration profile adds the network to the bottom of the machine's wireless list. This seems backward. In 10.6 importing an 802.1x configuration would put the network at the top of the list.


Did you figure this out?



We are having the same issue.. seems worse after 10.8.2



Our wireless network set in configuration profile is always last in line...


@cbrewer Check out this github: https://gist.github.com/pudquick/fcbdd3924ee230592ab4



I know its an old post but....



My issue similar to yours is that I had a WiFi network set up as a configuration profile but the client Macs would sometimes jump on other WiFi networks in the building. We have 4 internal networks where I work.



The python script by Pudquick stuck my preferred network to the top of the list so the Mac will default to it when searching for a network. Before my preferred network was at the bottom of the list as seems to be the case with WiFi configuration profiles - shouldn't be like that but it is for them moment until Apple make a change.


I had a similar issue, we have populated 802.1x settings for users and need to set SSID at top of the list.
We deleted all existing SSID corporate (like guest and production SSID`s) uses command



networksetup -removepreferredwirelessnetwork $hardwareport $SSIDname


In this case existing Wi-Fi network will removed from preferred networks (but credentials not deleted from keychain).
User will be able to connect to this deleted SSID (without password input), and your SSID which was installed from 802.1x setting will has preferred level.


Just curious if anyone has found a solution for this? I too am facing the same problem.


This python script worked for me: https://gist.github.com/pudquick/fcbdd3924ee230592ab4


I've also used the python script mentioned above, with great success. It works perfectly and doesn't involve any wacky scripting magic, like what we had been trying to use before.


Here's a tweaked version of pudquick's script that uses an array of preferred SSIDs rather than hard coding a certain number (this way you don't need additional edits to the script when you change the SSIDs list):



#!/usr/bin/python

# As written, this requires the following:
# - OS X 10.6+ (has been reported working through 10.12.3)
# - python 2.6 or 2.7 (for collections.namedtuple usage, should be fine as default python in 10.6 is 2.6)
# - pyObjC (as such, recommended to be used with native OS X python install)

# Run with root

import objc, ctypes.util, os.path, collections
from Foundation import NSOrderedSet

# List of preferred SSIDs in priority order - edit/add/delete as needed
PreferredSSIDs = ["SSID_1", "SSID_2", "SSID_3"]

def load_objc_framework(framework_name):
# Utility function that loads a Framework bundle and creates a namedtuple where the attributes are the loaded classes from the Framework bundle
loaded_classes = dict()
framework_bundle = objc.loadBundle(framework_name, bundle_path=os.path.dirname(ctypes.util.find_library(framework_name)), module_globals=loaded_classes)
return collections.namedtuple('AttributedFramework', loaded_classes.keys())(**loaded_classes)

# Load the CoreWLAN.framework (10.6+)
CoreWLAN = load_objc_framework('CoreWLAN')

# Load all available wifi interfaces
interfaces = dict()
for i in CoreWLAN.CWInterface.interfaceNames():
interfaces[i] = CoreWLAN.CWInterface.interfaceWithName_(i)

# Repeat the configuration with every wifi interface
for i in interfaces.keys():
# Grab a mutable copy of this interface's configuration
configuration_copy = CoreWLAN.CWMutableConfiguration.alloc().initWithConfiguration_(interfaces[i].configuration())
# Find all the preferred/remembered network profiles
profiles = list(configuration_copy.networkProfiles())
# Grab all the SSIDs, in order
SSIDs = [x.ssid() for x in profiles]
# Loop through PreferredSSIDs list in reverse order sorting each entry to the front of profiles array so it
# ends up sorted with PreferredSSIDs as the first items.
# Order is preserved for other SSIDs, example where PreferredSSIDs is [ssid3, ssid4]:
# Original: [ssid1, ssid2, ssid3, ssid4]
# New order: [ssid3, ssid4, ssid1, ssid2]
for aSSID in reversed(PreferredSSIDs):
profiles.sort(key=lambda x: x.ssid() == aSSID, reverse=True)
# Now we have to update the mutable configuration
# First convert it back to a NSOrderedSet
profile_set = NSOrderedSet.orderedSetWithArray_(profiles)
# Then set/overwrite the configuration copy's networkProfiles
configuration_copy.setNetworkProfiles_(profile_set)
# Then update the network interface configuration
result = interfaces[i].commitConfiguration_authorization_error_(configuration_copy, None, None)

FWIW, this worked for me a MacOS Mojave (10.14) @sdagley


Thanks for the update @ben.hertenstein.


Seems Catalina is not happy with this script, any alternatives?


@MatG I'd suggest using Feedback Assistant to ask about this as scripted management of Wi-Fi configurations is not that uncommon.


@MatG Catalina stopped shipping with Python installed. Might that be the issue? I haven't looked into it yet, just a thought.


@KrisMallory depreciated != removed.
Catalina still has Python 2.7 installed.


FYI I just tested this successfully on 10.13.6, but only when hard-coding SSID values into the script - when passing parameters $4, $5, $6 instead, the script did not reorder the existing networks.


I'll throw this implementation using a Bash shell script into the ring as a slightly different approach. Hopefully it's useful to someone!


@sdagley does your script work at startup? Or I need to run this as a Login Script per user?


@Eigger I usually ran this script on a Recurring Check-In trigger with the Frequency set to once a day


Thanks @sdagley I have an ongoing Login and Logout trigger. I added the following script also to connect the client to the Top Preferred Network after the re-order. Its working great for us so far, thank you!



# Power cycle Wireless Interface to connect to the Top Preferred Network
import os
os.system("networksetup -setairportpower airport off")
os.system("networksetup -setairportpower airport on")

@sdagley
I used you above script for selecting wifi order. It works fine - but issue I have is that even I have our 802.1x in the top, it does not connect to it - also not after restart
If I manually pick it it connects so it works. I am running it in Mojave - any idea ?


@jameson Just re-ordering shouldn't force a connection, but it's odd it doesn't re-connect after a restart. What if you turn Wi-Fi off and back on? Does that make it reconnections to your 802.1x network when it's at the top of the priority list?


Seems like there is another issue. If the wifi network has not been connected before (which is not have on any clients) it will not be listed in the arrangement and will now show in the list. Both tried on Mojave and Catalina


@jameson The script does not add any SSIDs to the Preferred Networks list, it simply makes the SSIDs you identify the 1st ones in that list. You have to configure the Mac for your Wi-Fi network first.


Reply