Skip to main content

Hey guys,

I am looking to get a smart group set up to notify me when Macs age out after 4 years for upgrades. I am doing this right now using the model and specifying the year they were made, but that just means every year I need to add a new field. Is there an easier way to do this?

@fernandez.payen : The whole issue will soon be academic, as Apple has announced plans to start using random serial numbers.

I don't know why I didn't think of this earlier, but what we really need is a script to check the model identifier. (For example, MacBookPro5,5)

I'll look into creating such a script.


Anything come out of this? My org is finally wanting to track our inventory and keep things more current. 


I have been trying to get this to work all morning and have failed. I have the script setup as an EA. I create a new search with the EA checked, along with some other identifiers...results are always zero. I am not sure where I am messing up.


For me the dates returned stop in 2019.  Any script like this for the new serial numbers?  We don't have GSX to pull from.


Took @Rocky 's script and revamped it based on @stevenjklein 's idea now that serials aren't the source of truth (with Gemini's assist and using this list: https://support.apple.com/en-us/108052):

#!/bin/bash # Function to get the Mac model identifier get_model_identifier() { local model_identifier # Use system_profiler as an alternative to ioreg model_identifier=$(system_profiler SPHardwareDataType | grep "Model Identifier" | awk '{print $3}') if [ -z "$model_identifier" ]; then echo "Error: Could not retrieve Mac model identifier." return 1 fi echo "$model_identifier" } # Function to roughly determine the manufacturing year and month based on model identifier. # This is a simplified approach and may not be accurate for all models. # A more robust solution would involve a lookup table or online database. get_approximate_manufacture_date() { local model_identifier="$1" local year=0 local month="Unknown" # Basic pattern matching. # This is NOT exhaustive and is meant to be a starting point. # It's very difficult to get exact dates from the model identifier, so this is approximate. case "$model_identifier" in "MacBook1,1") year=2006; month="May";; "MacBook2,1") year=2007; month="Nov";; "MacBook3,1") year=2008; month="Feb";; "MacBook4,1") year=2008; month="Oct";; "MacBook5,1") year=2009; month="May";; "MacBook5,2") year=2009; month="Jun";; "MacBook6,1") year=2009; month="Oct";; "MacBook7,1") year=2010; month="May";; "MacBook8,1") year=2015; month="Apr";; "MacBook9,1") year=2016; month="Apr";; "MacBook10,1") year=2017; month="Jun";; "MacBook11,1") year=2017; month="Jun";; "MacBook12,1") year=2017; month="Jun";; "MacBook13,1") year=2017; month="Jun";; "MacBook14,1") year=2021; month="Oct";; "MacBook15,1") year=2021; month="Oct";; "MacBookAir1,1") year=2008; month="Jan";; "MacBookAir2,1") year=2009; month="Jun";; "MacBookAir3,1") year=2010; month="Oct";; "MacBookAir3,2") year=2010; month="Oct";; "MacBookAir4,1") year=2011; month="Jul";; "MacBookAir4,2") year=2011; month="Jul";; "MacBookAir5,1") year=2012; month="Jun";; "MacBookAir5,2") year=2012; month="Jun";; "MacBookAir6,1") year=2013; month="Jun";; "MacBookAir6,2") year=2013; month="Jun";; "MacBookAir7,1") year=2015; month="Mar";; "MacBookAir7,2") year=2015; month="Mar";; "MacBookAir8,1") year=2018; month="Nov";; "MacBookAir8,2") year=2019; month="Jul";; "MacBookAir9,1") year=2020; month="Mar";; "MacBookAir10,1") year=2020; month="Nov";; "MacBookAir10,2") year=2020; month="Nov";; "MacBookAir11,1") year=2020; month="Nov";; "MacBookAir11,2") year=2020; month="Nov";; "MacBookAir12,1") year=2022; month="Jul";; "MacBookAir13,1") year=2024; month="Mar";; "MacBookAir13,2") year=2024; month="Mar";; "MacBookAir14,1") year=2025; month="Jun";; "MacBookAir14,2") year=2025; month="Jun";; "MacBookPro1,1") year=2006; month="Feb";; "MacBookPro1,2") year=2006; month="Oct";; "MacBookPro2,1") year=2006; month="Oct";; "MacBookPro2,2") year=2007; month="Jun";; "MacBookPro3,1") year=2007; month="Oct";; "MacBookPro4,1") year=2008; month="Feb";; "MacBookPro5,1") year=2009; month="Jan";; "MacBookPro5,2") year=2009; month="Jun";; "MacBookPro5,3") year=2009; month="Mar";; "MacBookPro5,4") year=2009; month="Jun";; "MacBookPro5,5") year=2009; month="Jun";; "MacBookPro6,1") year=2010; month="Apr";; "MacBookPro6,2") year=2010; month="Apr";; "MacBookPro7,1") year=2010; month="Apr";; "MacBookPro8,1") year=2011; month="Feb";; "MacBookPro8,2") year=2011; month="Feb";; "MacBookPro8,3") year=2011; month="Feb";; "MacBookPro9,1") year=2012; month="Jun";; "MacBookPro9,2") year=2012; month="Jun";; "MacBookPro10,1") year=2012; month="Jun";; "MacBookPro10,2") year=2012; month="Jun";; "MacBookPro11,1") year=2013; month="Oct";; "MacBookPro11,2") year=2013; month="Oct";; "MacBookPro11,3") year=2013; month="Oct";; "MacBookPro11,4") year=2014; month="Jul";; "MacBookPro11,5") year=2014; month="Jul";; "MacBookPro12,1") year=2015; month="Mar";; "MacBookPro13,1") year=2016; month="Oct";; "MacBookPro13,2") year=2016; month="Oct";; "MacBookPro13,3") year=2016; month="Oct";; "MacBookPro14,1") year=2017; month="Jun";; "MacBookPro14,2") year=2017; month="Jun";; "MacBookPro14,3") year=2017; month="Jun";; "MacBookPro15,1") year=2018; month="Jul";; "MacBookPro15,2") year=2018; month="Jul";; "MacBookPro15,3") year=2019; month="May";; "MacBookPro15,4") year=2019; month="May";; "MacBookPro16,1") year=2019; month="Nov";; "MacBookPro16,2") year=2019; month="Nov";; "MacBookPro16,3") year=2020; month="May";; "MacBookPro16,4") year=2020; month="May";; "MacBookPro17,1") year=2021; month="Oct";; "MacBookPro18,1") year=2021; month="Oct";; "MacBookPro18,2") year=2021; month="Oct";; "MacBookPro19,1") year=2023; month="Jan";; "MacBookPro19,2") year=2023; month="Jan";; "MacBookPro20,1") year=2024; month="Jan";; "MacBookPro20,2") year=2024; month="Jan";; "MacBookPro21,1") year=2025; month="Jun";; "MacBookPro21,2") year=2025; month="Jun";; "Macmini1,1") year=2005; month="Jan";; "Macmini2,1") year=2007; month="Aug";; "Macmini3,1") year=2009; month="Mar";; "Macmini4,1") year=2010; month="Jun";; "Macmini5,1") year=2011; month="Jul";; "Macmini5,2") year=2011; month="Jul";; "Macmini5,3") year=2012; month="Jun";; "Macmini6,1") year=2012; month="Oct";; "Macmini6,2") year=2012; month="Oct";; "Macmini7,1") year=2014; month="Oct";; "Macmini8,1") year=2018; month="Nov";; "Macmini9,1") year=2020; month="Mar";; "Macmini9,2") year=2020; month="Mar";; "Macmini10,1") year=2024; month="Jan";; "Macmini11,1") year=2025; month="Jun";; "iMac4,1") year=2006; month="Jan";; "iMac4,2") year=2006; month="Sep";; "iMac5,1") year=2006; month="May";; "iMac5,2") year=2006; month="Sep";; "iMac6,1") year=2007; month="Aug";; "iMac7,1") year=2007; month="Aug";; "iMac8,1") year=2008; month="Mar";; "iMac9,1") year=2009; month="Mar";; "iMac10,1") year=2009; month="Oct";; "iMac11,1") year=2010; month="Jul";; "iMac11,2") year=2010; month="Jul";; "iMac11,3") year=2011; month="May";; "iMac12,1") year=2011; month="May";; "iMac12,2") year=2011; month="May";; "iMac13,1") year=2012; month="Nov";; "iMac13,2") year=2012; month="Nov";; "iMac13,3") year=2013; month="Sep";; "iMac14,1") year=2013; month="Sep";; "iMac14,2") year=2013; month="Sep";; "iMac14,3") year=2014; month="Jun";; "iMac14,4") year=2014; month="Jun";; "iMac15,1") year=2014; month="Oct";; "iMac16,1") year=2015; month="Oct";; "iMac16,2") year=2015; month="Oct";; "iMac17,1") year=2015; month="Oct";; "iMac18,1") year=2017; month="Jun";; "iMac18,2") year=2017; month="Jun";; "iMac18,3") year=2017; month="Jun";; "iMac19,1") year=2019; month="Mar";; "iMac19,2") year=2019; month="Mar";; "iMac20,1") year=2020; month="Aug";; "iMac20,2") year=2020; month="Aug";; "iMac21,1") year=2021; month="Apr";; "iMac21,2") year=2021; month="Apr";; "iMac24,1") year=2021; month="Apr";; "iMac25,1") year=2023; month="Jan";; "iMac25,2") year=2024; month="Jan";; "iMac26,1") year=2024; month="Jan";; "iMac26,2") year=2025; month="Jun";; "MacPro1,1") year=2006; month="Aug";; "MacPro2,1") year=2007; month="Aug";; "MacPro3,1") year=2008; month="Jan";; "MacPro4,1") year=2009; month="Mar";; "MacPro5,1") year=2010; month="Jul";; "MacPro6,1") year=2013; month="Dec";; "MacPro7,1") year=2019; month="Dec";; "MacPro8,1") year=2023; month="Jun";; "MacPro9,1") year=2025; month="Mar";; "Xserve1,1") year=2006; month="May";; "Xserve1,2") year=2006; month="Nov";; "Xserve2,1") year=2008; month="Jan";; "Xserve3,1") year=2009; month="Jan";; "Mac14,3") year=2023; month="Jan";; "Mac14,5") year=2023; month="Jan";; "Mac14,6") year=2023; month="Jan";; "Mac14,7") year=2023; month="Jan";; "Mac14,9") year=2023; month="Jan";; "Mac14,10") year=2023; month="Jan";; "Mac15,3") year=2023; month="Nov";; "Mac15,6") year=2023; month="Nov";; "Mac15,7") year=2023; month="Nov";; "Mac15,8") year=2023; month="Nov";; "Mac15,9") year=2023; month="Nov";; "Mac15,10") year=2023; month="Nov";; "Mac15,11") year=2023; month="Nov";; "Mac16,1") year=2024; month="Jan";; "Mac16,5") year=2024; month="Jan";; "Mac16,6") year=2024; month="Jan";; "Mac16,7") year=2024; month="Jan";; "Mac16,8") year=2024; month="Jan";; *) year=0; month="Unknown";; # Default to 0 if not found esac echo "$year $month" } # Function to calculate age based on the manufacturing year. calculate_age() { local manufacture_year="$1" local manufacture_month="$2" local current_year=$(date +%Y) local current_month=$(date +%m) # Get current month as a number (01-12) # Convert month names to numbers for comparison local manufacture_month_num case "$manufacture_month" in "Jan") manufacture_month_num=1 ;; "Feb") manufacture_month_num=2 ;; "Mar") manufacture_month_num=3 ;; "Apr") manufacture_month_num=4 ;; "May") manufacture_month_num=5 ;; "Jun") manufacture_month_num=6 ;; "Jul") manufacture_month_num=7 ;; "Aug") manufacture_month_num=8 ;; "Sep") manufacture_month_num=9 ;; "Oct") manufacture_month_num=10 ;; "Nov") manufacture_month_num=11 ;; "Dec") manufacture_month_num=12 ;; "Unknown") manufacture_month_num=0 ;; *) manufacture_month_num=0 ;; esac if [ "$manufacture_year" -eq 0 ]; then echo "Unknown" else # Calculate age in years and months local years=$((current_year - manufacture_year)) local months=$((current_month - manufacture_month_num)) if [ "$months" -lt 0 ]; then ((years--)) months=$((months + 12)) fi echo "$years years $months months" fi } # Main script logic model_identifier=$(get_model_identifier) if [ $? -ne 0 ]; then echo "Failed to get model identifier. Exiting." exit 1 fi manufacture_date=$(get_approximate_manufacture_date "$model_identifier") if [ $? -ne 0 ]; then echo "Failed to get manufacture date. Exiting." exit 1 fi IFS=' ' read -r manufacture_year manufacture_month <<< "$manufacture_date" if [ "$manufacture_year" -eq 0 ]; then echo "Model Identifier: $model_identifier" echo "Warning: Could not determine approximate manufacturing year for this model." echo "Age: Unknown" else age=$(calculate_age "$manufacture_year" "$manufacture_month") echo "Model Identifier: $model_identifier" echo "Approximate Manufacturing Date: $manufacture_month $manufacture_year" echo "Approximate Age: $age" fi echo "<result>$age</result>"