Pregunta

¿Es posible reemplazar la ventana de inicio de sesión X Mac OS, /System/Library/CoreServices/loginwindow.app, con una aplicación de ventana de inicio de sesión personalizado? (Ver mi racional para hacerlo .)

Me temo que mis conocimientos de programación Cocoa son rudimentarios. Yo lo encuentro interesante que, cuando corro CGSession sonda (que es una utilidad indocumentado que realiza cambio rápido de usuario) para ver qué funciones que utiliza, haciendo

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

que una de la función de ligado es:

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

No he encontrado documentación sobre el marco ApplicationServices. Sospecho que estoy profundamente en Service Provider Interfaces Interfaces de aplicación en lugar de programador.

Lo que encontrar esto realmente interesante fragmento: ( google caché ) ( enlace directo a la página hacia abajo ;. parece que el sitio está experimentando re-organización) desde una aplicación que pretende cambiar a la ventana de inicio de sesión, incluso si cambio rápido de usuario está desactivada

#include "CGSInternal.h"

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

    return 0;
}

Tomo CG en el sentido de CoreGraphics, y no entiendo qué tiene que ver con el registro en (excepto tal vez con poner un cuadro de diálogo para arriba sobre el trabajo del usuario actual de inicio de sesión).

Incluso si no es posible conseguir un reemplazo para la ventana de acceso, estaría interesado en saber qué se puede hacer a lo largo de estas líneas (por personas que no trabajan para Apple).

¿Fue útil?

Solución

La aplicación ventana de acceso se define como parte de la configuración launchd en /System/Library/LaunchDaemons/com.apple.loginwindow.plist .

En teoría puede reemplazar la ventana de inicio de sesión con su cuenta, pero que no sabe lo que tiene que hacer en la nueva aplicación - Creo que la ventana de inicio de sesión hace un poco más de la autenticación y la configuración de la sesión de usuario -> entre otros, parece que su hacer algunas tareas relacionadas con launchd.

He compilado una aplicación que llama CGSCreateLoginSession y una vez que lo ejecute de que éste pase a la ventana de acceso a través del cubo giratorio. Me imagino que esto es por lo que requiere CoreGraphics - es sólo una función de gráficos que llama a cerrar la sesión al final

.

Usted podría intentar un InputManager y ver que la ventana de inicio de sesión carga el código -> si lo hace, entonces podría alterar el loginwindow SEMILLA ( LoginWindowUI.nib ) y añadir algunos botones para mostrar un nuevo ventana con el navegador del usuario. Una vez que el estudiante elige una foto de él / ella misma se podría rellenar automáticamente los campos de nombre de usuario y contraseña en el loginwindow.

Nodo todo esto es teoría, y se ve muy frágil e inseguro.

Buena suerte.

Más tarde editar

Tenga en cuenta que esto es muy peligroso por lo que utilizar con cuidado - Yo hose mi sistema un par de veces al probar estas cosas

Esto es una implementación de prueba de concepto que inyecta código en el 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;
}

El código se compila con:

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

carga Código se basa en la interposición de lo que la definición launchd de loginwindow tiene que contener una entrada adicional (para permitir la interposición en el enlazador dinámico), es decir:.

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

Otros consejos

Sí, se puede utilizar el SFAuthorizationPluginView

aquí el enlace de referencia a ADC

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top