Friday, June 15, 2012

Editing the Apple Menu

¡Super-Awesome Edit!

Don't you just love it when your super long work around to disable shutting down can actually be accomplished with two simple commands? I do!

sudo defaults write /Library/Preferences/ ShutDownDisabled -bool true
sudo defaults write /Library/Preferences/ ShutDownDisabledWhileLoggedIn -bool true

These two commands will disable the Shut Down option at the Login Window and the pop up that is shown with a click of the power button or the control-eject shortcut. I'm unable to reproduce, but I've been told it remove the Shut Down option from the Apple menu and if a user does use the forced shut down shortcut (control-option-command-eject), the computer simply reboots.


Original Post:

One of the more exciting things about upgrading Mac Mini's in classrooms is that they can be hidden! Now that the Mini's Superdrive has been moved to an external device, the Mac can be neatly hidden away and attached to a USB hub for peripherals. Now that the Mini is hidden, we have a new concern. What if it gets turned off?

With the meat of the Mac hidden, we had concerns about users accidentally shutting it down. There would little to no way for them to reach a power button. I've seen other companies solder wires to the power switch to allow an external button, but have you seen the new Mini's guts? Our solution was to remove the Shut Down and Sleep options.

After some research, this seemed like a simple fix. To remove the Shut Down and Sleep options from the Apple Menu, all I had to do was edit a NIB file, remove an object, save and reboot. However, this simple trick also had a negative side effect. The Finder would crash, repeatedly, when I selected the Apple Menu.

Thanks to StackTrace for the initial answer:

Here is the file I needed to edit

After messing around a bit, I started looking closely at the objects. Each object had it's own "id". When I was looking for the Shut Down option in the Carbon.framework, I remembered seeing lists of ids in other interface files. I started to wonder if these id's were referenced else where, causing the Finder to unexpectedly quit when they couldn't be found.

Example Object:
<object class="IBCarbonMenuItem" id="238">
  <string name="title">Shut Down…</string>
  <boolean name="dynamic">TRUE</boolean>
  <boolean name="notPreviousAlternate">TRUE</boolean>
  <ostype name="command">rsdn</ostype>

I found, in the same objects.xib file, all of the id's under reference tags. After I removed all of these references, the Finder behaved and the Shut Down and Sleep options were gone!


<reference idRef="236"/>
<reference idRef="285"/>
<reference idRef="238"/>

If you decide to remove the Sleep and Shut Down options, look for these id's in object and reference tags. Delete the entire object, one for the Sleep option and two for the Shut Down option, and each of the references.

Sleep - 236
Shut Down - 238, 285

As an aside, there are two Shut Down options because one is for the standard Shut Down (graceful shutdown) and the other for holding the option key and clicking Shut Down (force a shut down). 

P.S. I can't tell you how hard it was for me not to type Shit Down...


Kacey3 said...

Thanks for this... I've been trying to do this since upgrading to Lion and your tips did the trick.

Peet McKinney said...

Gracias for this one Rusty! Got rid of shutdown/sleep/restart at login and the shutdown/restart in the apple menu with MXC ... damned if I could find a way to get rid of sleep in the Apple Menu. I've got a client who seems to like to sleep/shutdown their colo'd mini.