Вопрос

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

Боюсь, мои навыки программирования на Cocoa находятся в зачаточном состоянии.Я действительно нахожу интересным, что, когда я запускаю probe 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).

Это было полезно?

Решение

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

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

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

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

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

Удачи.

Последующее редактирование

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

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

#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

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

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

Другие советы

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

вот ссылка на ADC

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top