Можно ли заменить экран входа Mac?

Можно ли заменить окно входа в Mac OS X /System/Library/CoreServices/loginwindow.app пользовательским приложением окна входа в систему? ( См мой разум для этого.)

Боюсь, мои навыки программирования в Какао зачаточны. Мне действительно интересно, что когда я запускаю пробную CGSession ( недокументированную утилиту, которая выполняет быстрое переключение пользователей), чтобы посмотреть, какие функции он использует, выполнив

nm -mg /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession

что одной из связанных функций является:

(undefined [lazy bound]) external _CGSCreateLoginSession (from ApplicationServices)

Я не нашел документацию по платформе ApplicationServices. Я подозреваю, что углубляюсь в интерфейсы сервис-провайдеров вместо интерфейсов прикладного программиста.

Я нашел этот действительно интересный фрагмент: ( кеш Google) ( прямая ссылка на нижнюю страницу; кажется, что сайт подвергается реорганизации) из приложения, которое утверждает, что переключается в окно входа в систему, даже если быстрое переключение пользователей отключено.

#include "CGSInternal.h"

int main (int argc, const char * argv[]) {
    // switch to the login window
    CGSCreateLoginSession(NULL);

    return 0;
}

Я использую CG для обозначения CoreGraphics и не понимаю, что это имеет отношение к входу в систему (за исключением, возможно, размещения диалога входа в систему над работой текущего пользователя).

Даже если невозможно заменить окно входа в систему, мне было бы интересно узнать, что можно сделать в этом направлении (людьми, которые не работают в Apple).

2 ответа

Решение

Приложение окна входа в систему определяется как часть конфигурации launchd в /System/Library/LaunchDaemons/com.apple.loginwindow.plist.

Теоретически вы можете заменить окно входа в систему своим собственным, но я не знаю, что вам нужно делать в новом приложении - я думаю, что окно входа в систему делает немного больше, чем аутентификация и настройка сеанса пользователя -> среди прочего, это Похоже, что он делает некоторые связанные с запуском работы по дому.

Я скомпилировал приложение, которое вызывает CGSCreateLoginSession, и после запуска оно переходит в окно входа в систему через вращающийся куб. Я предполагаю, что именно поэтому он требует CoreGraphics - это просто графическая функция, которая в конце вызывает logout.

Вы можете попробовать InputManager и увидеть, что окно входа загружает код -> если это так, вы можете затем изменить NIB loginwindow (LoginWindowUI.nib) и добавить несколько кнопок для отображения нового окна в браузере пользователя. Как только студент выберет свою фотографию, вы можете автоматически заполнить поля имени пользователя и пароля в окне входа в систему.

Узел это все теория, и это выглядит очень хрупким и небезопасным.

Удачи.

Позже редактировать

Пожалуйста, обратите внимание, что это очень небезопасно, поэтому используйте с осторожностью - я несколько раз подключал свою систему, когда пробовал этот материал

Вот реализация концепции, которая внедряет код в окно входа в систему.

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <strings.h>
#include <syslog.h>

#import <Cocoa/Cocoa.h>

#include <execinfo.h>

@interface LLApp:NSApplication
@end
@implementation LLApp
- (void)run
{
    syslog(LOG_ERR, "LLApp being run");
    [super run];
}
@end

void my_openlog(const char *ident, int logopt, int facility);

typedef struct interpose_s 
{
        void * new_func;
        void * orig_func;
} interpose_t;

int MyNSApplicationMain(int argc,  const char ** argv);


static const interpose_t interposers[] __attribute__ ((section("__DATA, __interpose")))     = {
{ (void *) my_openlog, (void *) openlog },
};

void my_openlog(const char *ident, int logopt, int facility)
{
        openlog(ident, logopt, facility);

    if(!strcmp(ident, "/System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow"))
    {

        [LLApp poseAsClass:[NSApplication class]];
    }
    else
    {
        syslog(LOG_ERR, "Ignoring unknown indent: >%s<", ident);
    }
    return;
}

Код компилируется с:

gcc -Wall -dynamiclib -undefined dynamic_lookup -o ~/Desktop/libinterposers.dylib testin.m -framework Cocoa

Загрузка кода основана на вставке, поэтому определение launchwindow для loginwindow должно содержать дополнительную запись (для включения вставки в динамический компоновщик), то есть:

<key>EnvironmentVariables</key>
<dict>    
    <key>DYLD_INSERT_LIBRARIES</key>
    <string>path_to/Desktop/libinterposers.dylib</string>
</dict>

Да, вы можете использовать SFAuthorizationPluginView

вот ссылка на ссылку на АЦП

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