Posted on 09-08-2015 08:23 AM
Hey
Slowly setting up our new environment, hitting some walls with AD however not liking the name of the machine as it is too long to bind.
So I decided to make use of the script supplied by Freddie Cox at https://jamfnation.jamfsoftware.com/discussion.html?id=6034
The script is as follows
read -p "Please Input Computer Name:" COMPUTERNAME
scutil --set HostName $COMPUTERNAME
scutil --set LocalHostName $COMPUTERNAME
scutil --set ComputerName $COMPUTERNAME
However it never seems to request the input of the computer name, and the log shows it failing due to the lack of the value named COMPUTERNAME.
I am just looking for a simple way initially for the user to be prompted on enrollment to enter a name so that it is set before I bind to the AD domain.
Any help anyone can give as to either what I am doing wrong, or changes I need to make to ensure the user is prompted before the script continues.
Many thanks
Jason
Posted on 09-08-2015 08:54 AM
Jason,
Does the script work manually? I have found when troubleshooting if you put a set -x under the shebang it helps to see where the script is failing.
I am 100% speculating but I would bet the first command is actually working but it's not prompting with a GUI for user input but in the command line.
You could use something like CocoDialog to do what you want.
An Example of something similar I have done is:
#!/bin/sh
# Set CocoaDialog Location
CD="/Applications/utilities/CocoaDialog.app/Contents/MacOS/CocoaDialog"
serial="$(ioreg -l | grep IOPlatformSerialNumber | sed -e 's/.*"(.*)"/1/')"
Model=`ioreg -c IOPlatformExpertDevice | grep MacBook | awk -F"= " '/model/{ print $2 }' | sed -e 's/^..//;s/..$//;s/[0,-9]*//g'`
# Dialog to enter the computer name and the create $COMPUTERNAME variable
rv=($($CD standard-inputbox --title "User Name" --no-newline --informative-text "Please enter the primary username for this Mac."))
USERNAME=${rv[1]}
rv=($($CD standard-inputbox --title "AD Binding" --no-newline --informative-text "Enter the name you want to BIND this machine to the domain with."))
ADCOMPUTERNAME=${rv[1]}
# Set Hostname using variable created above
scutil --set HostName $ADCOMPUTERNAME
scutil --set LocalHostName "$USERNAME"-"$Model"
scutil --set ComputerName "$USERNAME"-"$Model"
# Dialog to confirm that the hostname was changed and what it was changed to.
tb=`$CD ok-msgbox --text "Names Changed!"
--informative-text "The computer name has been changed to "$USERNAME"-"$Model" and the AD bind name is set to $ADCOMPUTERNAME"
--no-newline --float`
if [ "$tb" == "1" ]; then
echo "User said OK"
jamf policy -trigger ADBind
elif [ "$tb" == "2" ]; then
echo "Canceling"
exit
fi
Posted on 09-08-2015 09:40 AM
There are certainly better ways to do the renaming. @ShaunM9483 posted a good example of using available GUI tools to help make the input from a tech more accessible.
But just to help with your specific question, you can try this:
#!/bin/sh
function askForNewName ()
{
echo "Please Input Computer Name:"
read COMPUTERNAME
}
askForNewName
if [[ ${#COMPUTERNAME} -le 15 ]]; then
echo "Valid name"
scutil --set HostName $COMPUTERNAME
scutil --set LocalHostName $COMPUTERNAME
scutil --set ComputerName $COMPUTERNAME
exit 0
else
echo "The name "$COMPUTERNAME" is invalid. It it too long."
sleep 1
askForNewName
fi
It should verify that the name entered is within 15 characters long or it will prompt for a new name again.
I would also take a look at the jamf binary's commands for renaming a computer as it has some additional options that scutil doesn't have which may be useful to you.
jamf help setComputerName
Posted on 09-08-2015 09:43 AM
Just thought I'd throw my 2ÃÂÃÂÃÂâ in here...
ShaunM9483 is correct. If you only ran the script as you posted it your users would have to input their information into a Terminal session which is probably not the behavior you want.
Below is a very simple script that contains an AppleScript that will pop up a field for your users to input their Computer Name. Also to avoid the prompt for an administrator password when calling scutil this script should always be run by the root user, i.e, sudo sh nameofscript.sh or as a payload in a JSS policy. This little bit of AppleScript has many other uses too! Good luck!
#!/bin/bash
# check that script is run as root user
if [ "$EUID" -ne 0 ]
then
>&2 /bin/echo $'
This script must be run as the root user!
'
exit
fi
# capture user input name
while true
do
name=$(/usr/bin/osascript -e 'Tell application "System Events" to display dialog "Please enter a name for your computer or select Cancel." default answer ""' -e 'text returned of result' 2>/dev/null)
if [ "$?" -ne 0 ]
then # user cancel
exit
elif [ -z "$name" ]
then # loop until input or cancel
/usr/bin/osascript -e 'Tell application "System Events" to display alert "Please enter a name or select Cancel... Thanks!" as warning'
elif [ -n "$name" ] # user input
then
break
fi
done
scutil --set ComputerName "$name"
02-26-2022 10:12 PM - edited 02-26-2022 10:14 PM
@brock_waltersthe script works great but can you possibly edit this osascript you created so it doesn't have the resulting popup "jamf wants access to control system events"?
Posted on 09-09-2015 10:20 AM
Thank you for your suggestions guys im going to try both approaches out and see which works best for us. I did get some success yesterday with getting a dialog box up but even though the commands showed successful i did notice that the names of the machines did not change except on the sharing screen - the casper names for example stayed the same despite it.
Sorry very new to the world of Macs, and this is definately becoming a re-education after years of PC support.
Posted on 09-11-2015 10:36 AM
Thank you for all of your help guys. In the end Brocks script with some minor changes got me the solution each and everytime. This coupled with a jamf recon command updated all the JSS records straight away to match.
My next step is to try and automate this a little more so the user only has to type their site code and date of purchase with the partial mac id we use being automated, but that is for another day - Again thank you all.
Jason
Posted on 09-11-2015 10:47 AM
Just as an alternative, we have a script that automatically sets the computer name to the serial number - with a "-M" suffix. This way we know that the name will be unique in both the JSS and in AD, and in AD we can quickly find all of the Macs (setting the NTP server also ensures that the AD bind doesn't fail due to the clock offset):
#!/bin/bash
systemsetup -setnetworktimeserver ntp.yourad.com
serial=`ioreg -l | grep IOPlatformSerialNumber | awk '{print $4}' |
cut -d " -f 2`
computername="$serial-M"
scutil --set LocalHostName "$computername"
scutil --set ComputerName "$computername"
scutil --set HostName "$computername"
Posted on 09-11-2015 10:56 AM
@jason.bracy Its easier to use the jamf binary for your computer naming.
jamf setComputerName -target / -useSerialNumber -suffix "-M"
Posted on 09-11-2015 10:59 AM
@mm2270 Never even looked for that - since we were using that script prior to using Casper, I never even thought to change it :-)
Thanks for the pointer.
Posted on 09-11-2015 11:26 AM
Thanks guys
Unfortunately what my managers want is the name to match our PC naming convention.
So this would be
Site Code (4 characters) Machine Type (1 Character - A for all Apples) MM/YY (Purchase date) Last 5 of the mac address
So with my machine it is MKEEA1506F6021
At the moment it is a manual process, but would like to get to the point that at least the mac ID is pulled to make it easier on the users.
Posted on 09-11-2015 11:31 AM
You could use the osascript to pull in the Site and Date variables one at a time, so all the user needs to do is select the right site code and date, and have scutil get the last 5 of the MAC address (though which MAC address is the real question), then combine them to make the computer name...
Don't have time now to play around, but there are plenty of resources on how to have osascript present a list to select from...
Posted on 09-11-2015 11:47 AM
@mm2270 jamf setComputerName, does that also set the Host and Local Host names?
Posted on 09-25-2018 02:21 PM
I realize this is an old post but...
I am successfully running the rename computer script as a policy.
Is it possible to have it run during the setup assistant or at the login screen?
The issue I face is with our naming convention. I need it to rename the Mac and then bind to AD.
Currently it does this correctly but only after I log into a local account created be prestage enrollment.
I need it to prestage enroll, rename the Mac, then join to AD. If it doe not rename and bind to AD the user will not be able to login with AD credentials but the script doesn't seem to run until a user is logged in.
The idea is for this to be an automated process. I cannot give out the local account password to users so that it will finish enrollment policies.
Posted on 09-25-2018 03:06 PM
@thundercr250 I have a bash script that uses AppleScript to prompt for a computer name during Setup Assistant. You have to run this script with a policy set for the enrollment trigger and then leave your Mac at the Time Zone setup screen until the name prompt pops up.
After you capture the name, you could add to the script to bind to AD, etc.
https://github.com/cwmcbrewster/Jamf_Scripts/blob/master/Computer_Enrollment_PromptForName.sh
Posted on 12-07-2018 06:48 AM
@cbrewer Thank you SO MUCH for sharing this. I got a huge jumpstart (pun intended) on the year of 0-touch. :)
Posted on 12-07-2018 03:26 PM
Using the following slick method:
https://www.macblog.org/post/automatically-renaming-computers-from-a-google-sheet-with-jamf-pro/