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:

  1. Obtenir des privilèges d'administrateur.
  2. 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?)
  3. 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!

Je suis également très intéressé par cette question. Comment supprimer le fichier ~/Library/Logs & ~/Library/Caches. Avez-vous une bonne réponse ou une solution?

OriginalL'auteur Form | 2010-08-27