Можно ли заменить экран входа в систему Mac?
-
21-08-2019 - |
Вопрос
Можно ли заменить окно входа в 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