Можно ли заменить экран входа 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