Language : Objective-C
Commencer par ajouter le FrameWorks "Security.frameworks" qui se trouve dans "/System/Library/Frameworks/".
Les entêtes à ajouter dans le fichier .m de votre controleur principal :
#include <security/authorization.h>
#include <security/authorizationdb.h>
#include <security/authorizationtags.h>
#include <sys/types.h>
#include <unistd.h>
Les deux fonctions qui permettrons de demander le mot de passe à l'utilisateur :
- (int) preAuthorizeAjouter ce code dans la fonction - (id) init
{
int err;
AuthorizationFlags authFlags;
NSLog (@"MyWindowController: preAuthorize");
if (_authRef)
return errAuthorizationSuccess;
NSLog (@"MyWindowController: preAuthorize: ** calling AuthorizationCreate...**\n");
authFlags = kAuthorizationFlagDefaults;
err = AuthorizationCreate (NULL, kAuthorizationEmptyEnvironment, authFlags, &_authRef);
if (err != errAuthorizationSuccess)
return err;
NSLog (@"MyWindowController: preAuthorize: ** calling AuthorizationCopyRights...**\n");
_authItem.name = kAuthorizationRightExecute;
_authItem.valueLength = 0;
_authItem.value = NULL;
_authItem.flags = 0;
_authRights.count = 1;
_authRights.items = (AuthorizationItem*) malloc (sizeof (_authItem));
memcpy (&_authRights.items[0], &_authItem, sizeof (_authItem));
authFlags = kAuthorizationFlagDefaults
| kAuthorizationFlagExtendRights
| kAuthorizationFlagInteractionAllowed
| kAuthorizationFlagPreAuthorize;
err = AuthorizationCopyRights (_authRef, &_authRights, kAuthorizationEmptyEnvironment, authFlags, NULL);
return err;
}
- (int) launchAuthPrgm
{
AuthorizationFlags authFlags;
int err;
// path
NSString * path = [[NSBundle mainBundle] executablePath];
if (![[NSFileManager defaultManager] isExecutableFileAtPath: path])
return -1;
// auth
if (!_authRef)
{
err = [self preAuthorize];
if (err != errAuthorizationSuccess)
return err;
}
// launch
NSLog (@"MyWindowController: launchWithPath: ** calling AuthorizationExecuteWithPrivileges...**\n");
authFlags = kAuthorizationFlagDefaults;
err = AuthorizationExecuteWithPrivileges (_authRef, [path cString], authFlags, NULL, NULL);
if(err==0) [NSApp terminate:self];
return err;
}
if(geteuid()!=0){Ce code lance l'authentification si l'utilisateur réel d'exécution du logiciel n'est pas Root.
[self launchAuthPrgm];
}
Enfin, pour eviter les erreurs ou les avertissement lors de la compilation, il faut ajouter dans le fichier d'entête (.h) les lignes suivantes :
AuthorizationRef _authRef;
AuthorizationItem _authItem;
AuthorizationRights _authRights;
Maintenant, à vous de développer !
- (int) preAuthorize;
- (int) launchAuthPrgm;
1 commentaire:
Merci beaucoup, ça fonctionne a merveille.. et ça met fin a une grosse prise de tête :)
Enregistrer un commentaire