Obtenir les privilèges administrateur pour supprimer des fichiers à l'aide de la commande rm à partir d'un Cacao app
J'ai fais une petite application qui supprime les fichiers journaux. Je suis en utilisant un NSTask instance qui s'exécute mr et mrs (secure rm) pour supprimer les fichiers.
Je veux être en mesure de supprimer des fichiers dans:
- /Bibliothèque/Logs
- ~/Library/Logs
Le problème est que le compte d'utilisateur ne dispose pas des autorisations d'accès à certains fichiers dans le système de dossier de la bibliothèque, comme Adobe journaux sous-dossier et d'autres. Par exemple, seul le "système" de l'utilisateur (groupe?) a r/w autorisations pour le Adobe journaux dossier et son contenu, et que l'utilisateur actuel ne dispose même pas d'une entrée dans les autorisations montré dans la fenêtre Obtenir des informations pour le dossier.
Ce que je veux être en mesure de faire exactement:
- Obtenir des privilèges d'administrateur.
- Stocker le mot de passe dans le Trousseau ainsi, l'application n'a pas à harceler l'utilisateur à chaque fois (Est-ce que le stockage du mot de passe une mauvaise idée? Est-il possible?)
- Supprimer un fichier quel que soit le fichier des autorisations peuvent être.
Je suis en utilisant NSTask parce qu'il offre des notifications pour l'achèvement de la tâche, l'obtention de texte de sortie de la tâche elle-même, etc. J'ai besoin d'utiliser quelque chose d'autre? Si oui, comment ai-je pu répliquer NSTask de l'achèvement de notifications et la sortie descripteur de fichier lors de l'exécution de mr et mrs avec des privilèges d'administrateur?
Je suis à la recherche de la manière la plus sûre de gérer la situation. c'est à dire je ne veux pas que ma demande pour devenir une porte d'entrée pour de remontée d'attaques.
J'ai regardé l'Autorisation des Services de Guide de Programmation mais je ne suis pas sûr de cas s'inscrit. Au début, je pensais que AuthorizationExecuteWithPrivileges
serait une bonne idée, mais après la lecture de plus sur le sujet, il semble comme cette méthode n'est pas recommandée pour des raisons de sécurité.
Une réponse détaillée serait la bienvenue. Je suis sûr que certains d'entre vous ont déjà dû faire quelque chose de similaire et avez un peu de code et de connaissances à partager.
Merci d'avance!
Mise à jour:
Je suis maintenant en mesure de faire la boîte de dialogue d'authentification pop up et d'obtenir des privilèges, comme suit:
OSStatus status;
AuthorizationRef authRef;
status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef);
AuthorizationRights authRights;
AuthorizationItem authItems[1];
authItems[0].name = kAuthorizationRightExecute;
authRights.count = sizeof(authItems) / sizeof(authItems[0]);
authRights.items = authItems;
AuthorizationFlags authFlags = kAuthorizationFlagDefaults | kAuthorizationFlagExtendRights | kAuthorizationFlagInteractionAllowed;
status = AuthorizationCopyRights(authRef, &authRights, kAuthorizationEmptyEnvironment, authFlags, NULL);
Apparemment, il semble que le "Compte de l'Application de la" méthode semble la plus appropriée. La chose est que, pour moi, rm semble déjà comme un externe, outil d'aide. Je ne suis pas sûr d'obtenir le bit setuid alternative évoquée dans la documentation. Pourrais-je définir le bit setuid sur rm et l'exécuter à l'aide de la NSTask méthode que j'ai déjà mis en place? Cela signifierait que je n'aurais pas besoin de créer mon propre outil d'aide. Pourrait quelqu'un a des précisions sur ce sujet?
J'ai aussi regardé le BetterAuthorizationSample qui est suggéré, comme le plus sûr et le plus récent de rechange pour le bit setuid méthode, mais le trouve terriblement complexes, tels que le comportement simple. Un indice?
Merci d'avance pour toute aide!
OriginalL'auteur Form | 2010-08-27
Vous devez vous connecter pour publier un commentaire.
J'ai eu ce mal de tête il y a quelques mois. J'ai essayé d'obtenir un shell script qui s'exécute avec des privilèges d'administrateur que l'arrêt de mon ordinateur à un certain moment. Je ressens votre douleur.
J'ai utilisé le BetterAuthorizationSample qui fut un cauchemar à parcourir. Mais j'ai pris la plus pragmatique de la route - je n'ai pas la peine d'essayer de comprendre ce qui se passait, j'ai juste attrapé le courage de le code.
Il ne m'a pas fallu longtemps pour obtenir ce que je voulais. Je ne me souviens pas exactement ce que j'ai modifié, mais vous êtes invités à consulter mon code:
http://github.com/johngallagher/TurnItOff
J'espère que cela vous aide dans votre quête pour une application sécurisée!
Après avoir regardé de plus, il semble que l'utilisation de la BetterAuthorizationSample directement le code semble être la meilleure option. En regardant dans le dossier /Library/PrivilegedHelperTools dossier, vous pouvez voir que le BAS de code a été utilisé dans CCC et d'autres connaissent des applications, donc je suppose que c'est une solution raisonnable. Je suis surprise qu'Apple n'est pas venu avec un moyen plus simple de s'authentifier et d'exécuter des opérations privilégiées. De toute façon, je devrais être en mesure d'obtenir que cela fonctionne, mais tous les autres conseils, ce serait bien. Merci encore.
Il y a 4 produits dans mon projet Xcode. Il y a un Arrêt.prefPane, qui est l'INTERFACE utilisateur. ShutdownHelperApp.app est mon processus qui s'arrête la machine à certains moments de la journée. HelperTool et InstallTool sont de BetterAuthorizationSample. Le principal bits je me souviens en train de changer dans SampleTool.c près de la haut, vous verrez *shutdownCommand = "/opt/local/sbin/shutdown.sh"; - c'est le mien. J'ai aussi la complète BetterAuthorizationSample code dans un dossier de niveau supérieur dans le repo. Vous pourriez faire un diff sur leurs dossiers rapport à la mienne pour savoir ce que j'ai changé depuis que je ne me souviens pas ce que j'ai changé.
Merci pour les détails. Il y a toujours quelque chose qui me tracasse. Si je comprends bien, le BAS installe un privilégié outil d'aide qui n'a pas besoin d'authentification pour effectuer des opérations privilégiées, une fois installé. Si l'opération je veux être en mesure de faire est de supprimer des fichiers, et si l'entrée de l'outil d'aide peut venir d'applications sans privilège, n'est-ce pas le BAS de la méthode par nature précaire? Je veux dire que n'importe qui pourrait demander l'aide de l'outil à supprimer le fichier X et il allait le faire. Ou est-il une sorte de protection qui empêche d'autres applications à partir de l'aide de l'outil? Il doit y avoir quelque chose que je n'ai pas l'obtenir.
Je crains que c'est quelque chose que je ne peux pas vous aider avec. Je viens de confiance que si c'était la méthode recommandée, Apple doit avoir pensé à cela. Je suis en supposant que pas n'importe qui pourrait demander à votre outil d'aide à faire quoi que ce soit via des autorisations, peut-être? Je ne sais pas.
OriginalL'auteur John Gallagher
Peut-être un peu en retard, mais cela peut être utile pour l'avenir de référence pour d'autres personnes. La plupart du code est de cette personne.
Fondamentalement, il a beaucoup à voir avec l'Autorisation sur le Mac. Vous pouvez lire plus à ce sujet ici et ici.
Le code qui utilise la rm outil:
AuthorizationExecuteWithPrivileges
qui est obsolète dans 10.7L'utilisation d'une application d'aide comme AuthorizationExecuteWithPrivileges est obsolète: stackoverflow.com/questions/6841937/...
supposons que si vous avez besoin de supprimer 500 dossiers alors il sera comme pour le mot de passe de 500 fois. N'importe quelle résolution??
OriginalL'auteur Andrei