Pergunta

É possível substituir a janela de login do Mac OS X, /System/Library/CoreServices/loginwindow.app, com uma aplicação de janela de login personalizado? ( Ver o meu racional para fazê-lo .)

Eu tenho medo minhas habilidades de programação de cacau são rudimentares. Eu acho interessante que, quando eu corro sonda CGSession (que é um indocumentado utilitário que executa troca rápida de usuário) para ver quais funções ele usa, fazendo

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

que uma das funções ligadas é:

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

Eu não encontrei a documentação sobre o quadro ApplicationServices. Eu suspeito que eu estou recebendo em profundidade de Serviços Interfaces Provider em vez de aplicação programador Interfaces.

Eu não encontrar este trecho realmente interessante: ( google cache de ) ( link direto para a página de baixo ; parece que o local está passando por re-organização) de um aplicativo que reivindicações para mudar para a janela de login mesmo se troca rápida de usuário está desativada

#include "CGSInternal.h"

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

    return 0;
}

Eu tomo CG para CoreGraphics médios, e não entendo o que isso tem a ver com o log in (exceto talvez com colocando um login de diálogo ao longo do trabalho do usuário atual).

Mesmo se não for possível alcançar um substituto para a janela de login, eu estaria interessado em saber o que pode ser feito ao longo destas linhas (por pessoas que não trabalham para a Apple).

Foi útil?

Solução

A aplicação janela de login é definida como parte do launchd configuração no /System/Library/LaunchDaemons/com.apple.loginwindow.plist .

Em teoria, você pode substituir a janela de login com o seu próprio, mas eu não sei o que você tem a fazer no novo app - Eu acho que a janela de login faz um pouco de autenticação mais então e configurar a sessão do usuário -> entre outros, parece que sua fazendo algum launchd tarefas relacionadas.

Eu compilei uma aplicação que chama CGSCreateLoginSession e uma vez que você executá-lo que ele passa para a janela de login por meio do cubo giratório. Imagino que é por isso que exige CoreGraphics. - É apenas uma gráfica função que chama o logout no final

Você poderia tentar um InputManager e ver as cargas janela de login do código -> se isso acontecer, você pode então alterar o loginwindow NIB ( LoginWindowUI.nib ) e adicionar alguns botões para exibir uma nova janela com o navegador do usuário. Uma vez que o aluno escolhe uma imagem de ele / ela mesma que você poderia preencher automaticamente os campos de nome de usuário e senha no loginwindow.

Nó de tudo isso é teoria, e parece muito frágil e inseguro.

Boa sorte.

editar Posterior

Por favor note que este é uso, de modo muito inseguro com cuidado - eu fiz mangueira meu sistema um par de vezes quando a experimentar este material

Aqui está uma implementação de prova de conceito de que o código injeta na 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;
}

Os compila o código com:

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

Código de carga é baseada na interposição de modo a definição launchd de loginwindow tem que conter uma entrada adicional (para permitir a interposição no vinculador dinâmico), ou seja:.

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

Outras dicas

Sim, você pode usar o SFAuthorizationPluginView

aqui o link de referência no ADC

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top