Aller au contenu

Xcode-Swift- Exécution d'une application impliquant des droits d'administrateur


Fredo
 Share

Messages recommandés

Bonjour à tous,

 

Je n'arrive pas à comprendre comment fonctionne le système des permissions dans Xcode en utilisant swift.

 

Si je crée un NSTask en utilisant "sudo" :

 

var tacheLs : NSTask = NSTask()

        tacheLs.launchPath = "usr/bin/sudo"

        tacheLs.arguments = [ "rm", "-df", "/Library/LaunchDaemons/org.macports.unbound.plist.back" ]

        

        var lsPipe : NSPipe = NSPipe()

        tacheLs.standardOutput = lsPipe

 

Il revoit l'erreur suivante : 

 

2015-04-23 18:55:00.171 test2[988:246268] launch path not accessible

 

 

Il semblerait que la bonne manière d'y arriver passe par "EvenBetterAuthorizationSample". J'ai téléchargé l'exemple mais je ne sais comment l'implémenter dans un script swift?

 

Quelqu'un serait-il m'aider? D'avance merci.

Lien vers le commentaire
Partager sur d’autres sites

Il manque un / dans ton path : "/usr/bin/sudo" ;)

 

L'équivalent avec l'API de sécurité d'Apple c'est d'utiliser "AuthorizationExecuteWithPrivileges", sauf qu'il est deprecated pour des histoires de sécurité, et que ça fait chier tout le monde.

 

Le seul moyen de faire maintenant, c'est comme dans l'exemple que tu site : installer un helper lancé en root (avec SMJobBless par exemple), et lui faire faire exécuter les trucs en root (via XPC par exemple). C'est un peu lourdingue pour juste une action en one-shot.

Lien vers le commentaire
Partager sur d’autres sites

Merci J.P. pour cette réponse rapide et pour la remarque (rectifiée).

 

Etrange, j'ai enlevé mon nom de la liste sudoers et le fichier de test à bien été effacé, sans aucun message d'erreur. Serait-ce parce que je suis administrateur? Est-ce normal?

Quelles sont les actions qui nécessitent réellement le mot de passe administrateur?

Ne serait-il pas plus facile de rajouter l'utilisateur dans la liste sudoers (et de le retirer à la fin de l'exécution)? Peut-on faire cela sans mot de passe administrateur? Je m'en vais tester la chose.

 

 

Le seul moyen de faire maintenant, c'est comme dans l'exemple que tu site : installer un helper lancé en root (avec SMJobBless par exemple), et lui faire faire exécuter les trucs en root (via XPC par exemple). C'est un peu lourdingue pour juste une action en one-shot.

 

Tout cela en C, bien évidemment, moi qui voulais l'éviter...

L'exemple téléchargé ( EvenBetterAuthorizationSample ) est rempli de fichiers .h ou .m, string,... c'est tout cela que je m'apprête à recréer par la méthode SMJobBless? 

Lien vers le commentaire
Partager sur d’autres sites

 

Etrange, j'ai enlevé mon nom de la liste sudoers et le fichier de test à bien été effacé, sans aucun message d'erreur. Serait-ce parce que je suis administrateur? Est-ce normal?
Hmm oui étrange. Enfin ça dépend si tu es encore dans le laps de temps du timeout.
 

 

Tout cela en C, bien évidemment, moi qui voulais l'éviter...
Note que swift bridge les fonctions C, donc ce n’est pas un souci en soit. Je n’ai pas regardé en détail EvenBetterAuthorizationSample, mais y'a surement une bonne partie à reprendre oui (ça promet d'être vaguement galère :P). Et j'ai regardé "AuthorizationExecuteWithPrivileges" est pas bridgé lui (les salauds…)
Lien vers le commentaire
Partager sur d’autres sites

Merci pour l'info.

 

Je suis en train de tester le fonctionnement de sudo via Xcode et c'est assez surprenant. J'ai redémarré la machine après avoir modifié le fichier sudoers :

 

# User privilege specification

root    ALL=(ALL) ALL

%admin  ALL=(ALL) ALL

# fredo        ALL=(ALL) NOPASSWD: ALL

 
Lorsque j'essaye de déplacer un fichier du répertoire /Library/LaunchDaemon/ vers la corbeille via l'interface du finder, le mot de passe admin m'est demandé.
Via le terminal, un "sudo" suffit, il n'y a pas de demande de mot de passe, et via Xcode idem. Pourtant le fichier sudoers ne contient aucune autre ligne me concernant.
Serait-ce parce que mon utilisateur est dans le groupe admin?
 
Voici le script Xcode que je lance :
 
        // sudo

        var tacheLs : NSTask = NSTask()

        tacheLs.launchPath = "/usr/bin/sudo"

        tacheLs.arguments = [ "mv", "/Volumes/Yosemite/Library/LaunchDaemons/com.metakine.handsoff.daemonback.plist", "/Users/fredo/.Trash/" ]

        

        var lsPipe : NSPipe = NSPipe()

        tacheLs.standardOutput = lsPipe

        

        // lancement

        tacheLs.launch()

 

st dans

J'ai essayé d'utiliser le tilde (~) à la place de "/Users/fredo" mais cela cause une erreur :
 

mv: directory ~/.Trash does not exist

 
Modifié par Fredo
Lien vers le commentaire
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Share

×
×
  • Créer...