C'est possible en utilisant scripts.
Tout d'abord, vous devez activer le menu script dans la barre de menu d'OS X. Lisez la section "Menu script" ici : Activez le menu script.
Maintenant ouvrez votre dossier Library/scripts et créez un fichier appelé "run_with_password.rb" avec ce contenu (changez "johndoe" par votre nom d'utilisateur) :
#!/usr/bin/env ruby
# run an app at lower privilege
require 'etc'
require 'find'
# Note: anyone with sudo access will be able to run as this user. But they could do that anyway.
# run 'id' at the terminal to find out what your username is.
RUN_USER = 'johndoe'
def get_root_info
root_entry = Etc.getpwnam('root')
return root_entry.uid, root_entry.gid
end
ROOT_UID, ROOT_GID = get_root_info
def ensure_root
Process.uid = ROOT_UID
Process.gid = ROOT_GID
end
def print_user_info
[
[:uid, Process.uid],
[:gid, Process.gid],
[:euid, Process.euid],
[:egid, Process.egid],
].each do |arr|
$stderr.puts arr.inspect
end
end
def set_effective(euid, egid)
$stderr.puts "setting effective to #{[euid, egid].inspect}" if $DEBUG
# must set group first
Process.egid = egid
Process.euid = euid
end
def do_privileged(&block)
orig_euid = Process.euid
orig_egid = Process.egid
begin
$stderr.puts "raising privileges" if $DEBUG
set_effective(ROOT_UID, ROOT_GID)
yield orig_euid, orig_egid
ensure
$stderr.puts "lowering privileges" if $DEBUG
set_effective(orig_euid, orig_egid)
end
end
# must be called after ROOT_UID, ROOT_GID are set
def chmod_files_in_dir(mode, dir)
mode_str = nil
case mode
when Integer
mode_str = '%o' % mode
when String
mode_str = mode
else
raise TypeError
end
chmod_proc = proc do
Find.find(dir) {|entry|
if File.directory?(entry) and entry != dir
Find.prune # don't recurse into subdirs
elsif File.file?(entry)
$stderr.puts "chmod #{mode_str} #{entry}" if $DEBUG
system 'chmod', mode_str, entry
end
}
end
# assume that if dir is owned by root, the executables are also.
if File.stat(dir).uid == ROOT_UID
do_privileged(&chmod_proc)
else
chmod_proc.call
end
end
def main(argv)
# Important: this is to abort if we're not running as root.
ensure_root
app_path = argv.shift or raise "Need path to .app file, e.g. /Applications/Mail.app"
app_macos_dir = File.join(app_path, 'Contents/MacOS')
File.directory?(app_path) or raise "#{app_path} is not an app bundle"
File.directory?(app_macos_dir) or raise "#{app_path} bundle doesn't have expected MacOS structure"
pw_entry = Etc.getpwnam(RUN_USER)
run_uid = pw_entry.uid
run_gid = pw_entry.gid
if $DEBUG
$stderr.puts [:run_uid, run_uid].inspect
$stderr.puts [:run_gid, run_gid].inspect
print_user_info
end
# Effectively become RUN_USER
set_effective(run_uid, run_gid)
if $DEBUG
print_user_info
end
begin
chmod_files_in_dir('+x', app_macos_dir)
# 'open' is asynchronous, so the ensure will run immediately after, and before the app exits.
$stderr.puts "Running app: #{app_path}" if $DEBUG
system 'open', app_path
ensure
chmod_files_in_dir('-x', app_macos_dir)
end
end
if __FILE__ == $0
$DEBUG = false
main(ARGV)
end
Ensuite, lancez l'éditeur script et collez ce code (en remplaçant à nouveau johndoe par votre nom d'utilisateur) :
do shell script "ruby /Users/johndoe/Library/Scripts/run_with_password.rb /Applications/Mail.app" with administrator privileges
Enregistrez le fichier dans Library/scripts sous le nom de "mail_with_password", en vous assurant que le Format du fichier est "scripts".
Maintenant "mail_with_password" apparaîtra dans votre menu script. Chaque fois que vous l'exécuterez, il vous demandera votre mot de passe (comme le font certains installateurs). Une fois qu'il aura fini de s'exécuter, il désactivera l'accès à l'application Mail ordinaire. Exécutez donc le script une fois, puis essayez de lancer l'application Mail. Elle ne fonctionnera pas. Notez que cela signifie que TOUS les utilisateurs de votre machine seront empêchés d'exécuter directement Mail, et pas seulement votre utilisateur.
Si vous voulez à nouveau permettre à Mail de fonctionner normalement, exécutez cette commande dans le Terminal :
sudo chmod +x /Applications/Mail.app/Contents/MacOS/Mail
Vous pouvez peut-être omettre le "sudo". Utilisez sudo si vous obtenez "Operation not permitted". Notez que sudo vous demandera votre mot de passe pour permettre une opération privilégiée.
Avertissements
- Si vous n'avez pas eu besoin de la commande "sudo" ci-dessus pour effectuer le chmod, cela signifie qu'un utilisateur avisé pourrait être en mesure de comprendre comment réactiver l'application Mail. Vous pouvez renforcer la sécurité en changeant le propriétaire du fichier MacOS/Mail en Root. C'est un exercice pour le lecteur.
- Si quelqu'un parvient à copier l'application Mail sur votre ordinateur (par exemple, via une clé USB), il peut toujours accéder à votre courrier.
- Le ruby script est destiné à fonctionner pour la plupart des paquets d'applications OS X. Je ne recommande pas de modifier le ruby script à moins que vous ne sachiez vraiment ce que vous faites, car il fait certaines choses en tant que Root (l'utilisateur privilégié). Modifier le code applescript devrait être inoffensif ; mais vous devriez savoir comment ajuster la commande chmod pour rendre votre application directement exécutable à nouveau.
- Si le chemin d'accès à l'application dans le fichier applescript contient des espaces ou d'autres caractères spéciaux, vous devrez faire quelque chose comme mettre des guillemets simples autour de tout le chemin.
- Edit : L'utilisateur Austin a suggéré que cette procédure ne protège pas les fichiers .emlx. En fait, je n'utilise pas l'application Mail et je ne suis pas familier avec le stockage des données. Des problèmes similaires s'appliquent à toutes les apps - car cette solution ne cache pas les données de l'utilisateur.
Paranoïa
Si quelqu'un qui connaît ruby obtient l'accès à votre utilisateur connecté, il pourrait modifier le script ruby d'une manière qui provoque toutes sortes de ravages lorsque vous exécutez le script, puisqu'il s'exécute en tant que Root pendant une partie du temps. Si vous pensez que cela pourrait se produire, vous devriez rendre le script uniquement accessible en écriture par Root. Vous devrez également vous assurer que quelqu'un ne remplace pas le script par le sien - il peut le faire si le dossier est accessible en écriture par vous. Si vous commencez à être effrayé par ces avertissements et que vous ne savez pas comment vous protéger, vous devriez probablement oublier cette solution et vous souvenir de verrouiller votre écran lorsque vous quittez l'ordinateur.