Posted on 03-06-2023 04:00 AM
Anyone have a quick shell script to rename computers by looking up the serial in a CSV file? Figure it should be easy to install a CSV on the computer and then run a script to rename?
Of is there another easier way to do this? Why? I duplicated a renaming policy and then didn't remove "all computers" from scope, causing buggered computer names. It would be nice to not have to fix manually.
Posted on 03-06-2023 05:12 AM
Posted on 03-06-2023 11:58 AM
If your naming convention uses the user's real name (or even username) as the device name, you may want to consider using an obfuscated name. If your users are all adults, it's a lesser concern, but if your user's are K12 students, having PII in the device name is a security and safety risk.
Posted on 03-06-2023 07:22 PM
I have used this Python script in the past, it lets you read the names from a CSV on a remote Server or even a google sheet. (your mileage may vary now, though, with python not coming pre-installed on macOS)
#!/usr/bin/python ''' Rename computer from remote CSV using Jamf binary Pass in the URL to your remote CSV file using script parameter 4 The remote CSV could live on a web server you control, OR be a Google Sheet specified in the following format: https://docs.google.com/spreadsheets/u/0/d/<document ID>/export?format=csv&id=<document ID>&gid=0 ''' import os import sys import urllib2 import subprocess CSV_PATH = '/var/tmp/computernames.csv' def download_csv(url): '''Downloads a remote CSV file to CSV_PATH''' try: # open the url csv = urllib2.urlopen(url) # ensure the local path exists directory = os.path.dirname(CSV_PATH) if not os.path.exists(directory): os.makedirs(directory) # write the csv data to the local file with open(CSV_PATH, 'w+') as local_file: local_file.write(csv.read()) # return path to local csv file to pass along return CSV_PATH except (urllib2.HTTPError, urllib2.URLError): print 'ERROR: Unable to open URL', url return False except (IOError, OSError): print 'ERROR: Unable to write file at', CSV_PATH return False def rename_computer(path): '''Renames a computer using the Jamf binary and local CSV at <path>''' cmd = ['/usr/local/bin/jamf', 'setComputerName', '-fromFile', path] proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, _ = proc.communicate() if proc.returncode == 0: # on success the jamf binary reports 'Set Computer Name to XXX' # so we split the phrase and return the last element return out.split(' ')[-1] else: return False def main(): '''Main''' try: csv_url = sys.argv except ValueError: print 'ERROR: You must provide the URL of a remote CSV file.' sys.exit(1) computernames = download_csv(csv_url) if computernames: rename = rename_computer(computernames) if rename: print 'SUCCESS: Set computer name to', rename else: print ('ERROR: Unable to set computer name. Is this device in the ' 'remote CSV file?') sys.exit(1) else: print 'ERROR: Unable to set computer name without local CSV file.' sys.exit(1) if __name__ == '__main__': main()