10-21-2021 09:42 AM - edited 10-21-2021 09:46 AM
Hey folks,
Our machine naming convention is 11 characters long. The first 4 characters are:
m = mac
d/p = desktop/portable
21 = deployment year
...then the last 7 characters of that machine's serial number.
We can't change this naming convention operationally/culturally (eg use the full serial). It has to be the way it is.
Currently at enrollment, we display the full serial number on the screen, and the person imaging it will count 7 characters back, and manually type/paste that in. This lends itself to errors, that don't always get caught in time.
We can sort out automating the first 4 characters, but does anyone have a clever idea about how we could automatically put the last 7 of the serial into the name?
Solved! Go to Solution.
10-21-2021 10:13 AM - edited 10-21-2021 10:35 AM
Edit: sorry I wasn't quite as done as I thought and thought you said first 7 at first, this has been fixed to be last 7.
We do something similar, but use different digits. After a few minutes of modifying ours this is the script I came up with to get you the last 7. You'll need to build out the rest but this should get you started.
#!/bin/sh
### Get the last 7 serial numbers
lastSerialChar=$(system_profiler SPHardwareDataType | awk '/Serial/ {print $4}' | cut -c 6-12)
serial=$(ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}')
computerName=$lastSerialChar
echo $computerName
10-21-2021 10:13 AM - edited 10-21-2021 10:35 AM
Edit: sorry I wasn't quite as done as I thought and thought you said first 7 at first, this has been fixed to be last 7.
We do something similar, but use different digits. After a few minutes of modifying ours this is the script I came up with to get you the last 7. You'll need to build out the rest but this should get you started.
#!/bin/sh
### Get the last 7 serial numbers
lastSerialChar=$(system_profiler SPHardwareDataType | awk '/Serial/ {print $4}' | cut -c 6-12)
serial=$(ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}')
computerName=$lastSerialChar
echo $computerName
Posted on 10-21-2021 10:41 AM
YES! This is exactly what I needed. Thanks @naschenbrenner !
Posted on 10-21-2021 10:51 AM
The only thing to be aware is that Apple is changing their serial numbers to a random 10 digit number. I think the M1 iMacs were the first and, very likely, the new MacBook Pros will use it as well. You can try this as well:
```
serial=$(ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}')
lastSerialChar=${serial: -7}
That should get the last 7 digits regardless of the length of Serial Number.
(And that reminds me, I need to go look at my scripts!)
Posted on 10-21-2021 11:12 AM
Thanks @Tribruin ! Confirmed that your solution works for us, too.
We're aware of Apple's randomized serials. The actual content of the name just needs to be unique: our convention is a hold-over from years of naming Windows machines similarly (and so we're not parsing 800+ machines called "Lab iMac" or "<username>'s MacBook Pro"). As machines change users and departments, it remains consistent, and the first 4 characters are a Quick Hit for what you're working on, and when they're up for a refresh. There was talk of using full serials, but each vendor uses a different number of characters, and that has its own issues.
Posted on 10-24-2021 04:58 AM
I have a similar naming scheme, and I use a script to automate it.
In my case as we are an educational institution, we follow this naming convention.
For user John Smith, Receiving his MacBook Pro in Fall 2021 would look something like this
FSM-JSMIXYZ-F21
FS = Faculty/Staff (we do not need to differentiate between the 2 job roles)
M = Mac, we do not need to differentiate between desktop and laptop for faculty and staff, they are managed the same.
JSMI = First initial, Last name first 3 letters.
XYZ = Last three characters of the serial number
F = Fall (Spring, S. Summer, M)
21 = 2021
In your case you could simply add another if statement that looks at the machine model using sysctl -n hw.model command, and if like book then equals portable, else desktop etc.
The script is run after enrollment as part of a DEPNotify workflow.
Hope this helps.
#!/bin/bash
#get computer serial number and shorten it
part_serial=$(ioreg -l | awk '/IOPlatformSerialNumber/ { print $NF;}'|tr -d '\"'| cut -c 10-12)
#get current user's full name and shorten it to 4 characters
part_name=$(dscl . -read "/Users/$(ls -l /dev/console | awk '{print $3}')" RealName | sed -n 's/^ //g;2p' | sed 's/[^a-z A-Z]//g' | awk '{print toupper(substr($1,1,1)$NF)}' | cut -c 1-4)
#define prefix
name_prefix="FSM"
# get term and year if month 01-05 = Spring (S) 06-07= Summer (M) 08-12= Fall (F)
deploy_year=$(date "+%y")
deploy_month=$(date "+%m" | sed 's/^0*//')
if [[ "${deploy_month}" -ge "1" ]] && [[ "${deploy_month}" -le "5" ]]; then
deploy_term="S"
elif [[ "${deploy_month}" -ge "6" ]] && [[ "${deploy_month}" -le "7" ]]; then
deploy_term="M"
elif [[ "${deploy_month}" -ge "8" ]] && [[ "${deploy_month}" -le "12" ]]; then
deploy_term="F"
fi
#define computer name using prefix, encoded name and suffix
computer_name="${name_prefix}-${part_name}${part_serial}-${deploy_term}${deploy_year}"
echo "${computer_name}"
# Set computer name
scutil --set LocalHostName "${computer_name}"
scutil --set HostName "${computer_name}"
scutil --set ComputerName "${computer_name}"
defaults write /Library/Preferences/SystemConfiguration/com.apple.smb.server.plist NetBIOSName "${computer_name}"
exit 0
Borrowing from @naschenbrenner above, yours should look more like this now, that is if I understood you requirements correctly.
#!/bin/sh
prefix="m"
model=$(sysctl -n hw.model)
serialnumber=$(ioreg -c IOPlatformExpertDevice -d 2 | awk -F\" '/IOPlatformSerialNumber/{print $(NF-1)}' | cut -c 6-12)
year=$(date "+%y")
if expr "$model" : "*book*" > /dev/null; then
type="p"
else
type="d"
fi
computername="${prefix}${type}${year}${serialnumber}"
echo "${computername}"
scutil --set LocalHostName "${computername}"
scutil --set HostName "${computername}"
scutil --set ComputerName "${computername}"
defaults write /Library/Preferences/SystemConfiguration/com.apple.smb.server.plist NetBIOSName "${computername}"
exit 0
But as usual test test test before using in production.
Best regards,
Kamal