Запрос прав администратора только для стандартных учетных записей

Я перемещаю некоторые файлы в каталог /Applications моим приложением и использую SMJobBless() для повышения прав администратора.

Но он запрашивает учетные данные администратора для любого типа учетной записи - admin или standard_user. Можем ли мы поставить проверку и запросить учетные данные администратора только для обычных пользователей, используя любой API-интерфейс target-c?

Редактировать - если кто-то пытался или прошел процесс установки Dropbox, то установщик Dropbox делает то же самое (т.е. он запрашивает привилегии администратора только для стандартных учетных записей для копирования его.app-файла в /Applications).

1 ответ

Решение

Основываясь на ответе на другой вопрос, я создал файл, который вам подходит (я только что перевел его с C на Objective-C и удалил файлы printf; исходная ссылка находится в конце ответа).

NSPrivileges.h

#import <Foundation/Foundation.h>

@interface NSPrivileges : NSObject

+(BOOL)hasAdminPrivileges;

@end

NSPrivileges.m

#import "NSPrivileges.h"
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <strings.h>
#include <pwd.h>
#include <grp.h>

@implementation NSPrivileges

+(BOOL)hasAdminPrivileges{
    uid_t current_user_id = getuid();
    struct passwd *pwentry = getpwuid(current_user_id);
    struct group *grentry = getgrgid(getgid());

    struct group *admin_group = getgrnam("admin");
    while(*admin_group->gr_mem != NULL) {
        if (strcmp(pwentry->pw_name, *admin_group->gr_mem) == 0) {
            return YES;
        }
        admin_group->gr_mem++;
    }
    return NO;
}

@end

Теперь вам просто нужно импортировать NSPrivileges.h в файл, который должен знать, является ли пользователь администратором или нет, и использовать команду [NSPrivileges hasAdminPrivileges] выяснить (он вернет BOOLтак что с этим будет легко иметь дело). Надеюсь, это поможет вам.

Вот моя ссылка: Цель C и тип пользователя ОС

Другие вопросы по тегам