Программно изменить изображение учетной записи пользователя в OSX - PullRequest
4 голосов
/ 15 марта 2012

Есть ли какой-нибудь способ, которым я могу программно изменить образ учетной записи пользователя в OSX?Я знаю, что могу получить его, но можно ли его изменить, как это делает яблоко на странице учетной записи в приложении настроек?

Ответы [ 3 ]

4 голосов
/ 19 марта 2012

Вы можете использовать структуру адресной книги.Вам нужно использовать метод me, чтобы получить запись для текущего пользователя, а затем метод setImageData:, чтобы установить изображение пользователя:

#import <AddressBook/AddressBook.h>

@implementation YourClass
- (void)setUserImage:(NSImage*)anImage
{
    ABPerson* me = [[ABAddressBook addressBook] me];
    [me setImageData:[anImage TIFFRepresentation]];
}
@end

Более подробно здесь, в документации.

3 голосов
/ 20 марта 2012

Вы можете найти путь к файлу и объединить его с текущей записью с помощью команды / usr / bin / dsimport, которую можно запустить из NSTask.Вот пример того, как сделать это с BASH в качестве пользователя root, это также можно сделать с помощью переданных учетных данных

    export OsVersion=`sw_vers -productVersion | awk -F"." '{print $2;exit}'`
    declare -x UserPicture="/path/to/$UserName.jpg"
    # Add the LDAP picture to the user record if dsimport is avaiable 10.6+
    if [ -f "$UserPicture" ] ; then
        # On 10.6 and higher this works
        if [ "$OsVersion" -ge "6" ] ; then
            declare -x Mappings='0x0A 0x5C 0x3A 0x2C'
            declare -x Attributes='dsRecTypeStandard:Users 2 dsAttrTypeStandard:RecordName externalbinary:dsAttrTypeStandard:JPEGPhoto'
            declare -x PictureImport="/Library/Caches/$UserName.picture.dsimport"
            printf "%s %s \n%s:%s" "$Mappings" "$Attributes" "$UserName" "$UserPicture" >"$PictureImport"
            # Check to see if the username is correct and import picture
            if id "$UserName" &>/dev/null ; then
                # No credentials passed as we are running as root
                dsimport -g  "$PictureImport" /Local/Default M &&
                    echo "Successfully imported users picture."
            fi
        fi
    fi

Суть этого кода

2 голосов
/ 19 марта 2012

Я почти уверен, что вы можете сделать это через интерфейс OpenDirectory.См. Это руководство:

https://developer.apple.com/library/mac/#documentation/Networking/Conceptual/Open_Directory/Introduction/Introduction.html#//apple_ref/doc/uid/TP40000917

В основном вам необходимо открыть узел Open Directory (скажем, узел / Search), а затем найти ODRecord для вашего пользователя, а затем использовать:

setValue:forAttribute:error

в ODRecord для установки атрибута JPEGPhoto.

Если вы запросите dscl из командной строки для этого атрибута, вы увидите значение атрибута:

dscl /Search read /Users/luser JPEGPhoto

Я считаю, что инструмент dscl использует платформу Open Directory (или более старую / сложную в использовании / устаревшую платформу службы каталогов) для чтения и записи атрибутов в записи пользователя.Вы можете читать и писать любые другие атрибуты, используя этот инструмент и связанную с ним структуру.Я не вижу никакой причины, по которой JPEGPhoto будет другим.

Узел / Search МОЖЕТ быть доступен только для чтения (так как это своего рода мета-узел).Не совсем уверен.Возможно, вам придется явно открыть соответствующий узел (например, узел / Local / Default), прежде чем вы сможете записать в запись:

dscl /Local/Default read /Users/luser JPEGPhoto
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...