Question

Est-il possible de remplacer la fenêtre de connexion Mac OS X, /System/Library/CoreServices/loginwindow.app, avec une application de la fenêtre de connexion personnalisée? ( Voir mon rationnel de le faire .)

Je crains que mes compétences en programmation de cacao sont rudimentaires. Je trouve intéressant que, quand je lance la sonde CGSession (qui est un utilitaire sans papier qui effectue changement rapide d'utilisateur) pour voir quelles fonctions il utilise, en faisant

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

que l'une des fonctions est lié:

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

Je n'ai pas trouvé la documentation sur le cadre de ApplicationServices. Je pense que je suis en train de profondément dans Interfaces fournisseur de services au lieu d'application programmeur Interfaces.

J'ai trouvé cet extrait très intéressant: ( cache google ) ( lien direct vers la page vers le bas ;. il semble que le site est en cours de réorganisation) d'une application qui prétend passer à la fenêtre de connexion, même si le changement d'utilisateur rapide est désactivé

#include "CGSInternal.h"

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

    return 0;
}

Je prends CG signifie CoreGraphics, et ne comprennent pas ce que cela a à voir avec l'exploitation forestière dans (sauf peut-être mettre une connexion de dialogue au cours des travaux de l'utilisateur actuel).

Même s'il est impossible d'obtenir un remplacement pour la fenêtre de connexion, je serais intéressé de savoir ce qui peut être fait dans ce sens (par des personnes qui ne travaillent pas pour Apple).

Était-ce utile?

La solution

L'application de la fenêtre d'ouverture de session est défini comme une partie de la configuration launchd en /System/Library/LaunchDaemons/com.apple.loginwindow.plist .

En théorie, vous pouvez remplacer la fenêtre de connexion avec votre propre mais je ne sais pas ce que vous avez à faire dans la nouvelle application - Je pense que la fenêtre de connexion fait un peu plus de l'authentification et la mise en place de la session utilisateur -> parmi d'autres, il semble que son faire quelques tâches liées launchd.

J'ai compilé une application qui appelle CGSCreateLoginSession et une fois que vous l'exécutez sa transition vers la fenêtre de connexion via le cube en rotation. J'imagine que c'est la raison pour laquelle il faut CoreGraphics - il est juste une fonction graphique qui appelle à la fin fermeture de session

.

Vous pouvez essayer un InputManager et voir la fenêtre de connexion charge le code -> si elle le fait, vous pouvez alors modifier la loginwindow NIB ( LoginWindowUI.nib ) et ajouter quelques boutons pour afficher une nouvelle fenêtre avec le navigateur de l'utilisateur. Une fois que l'étudiant choisit une photo de lui / elle-même vous pourriez remplir automatiquement les champs nom d'utilisateur et mot de passe dans le loginwindow.

Node cela est la théorie, et il semble très fragile et dangereux.

Bonne chance.

modifier plus tard

S'il vous plaît noter ce qui est très dangereux d'utiliser donc avec soin - je ne FLEXIBLE mon système deux ou trois fois quand essayer ce genre de choses

Voici une preuve de concept mise en œuvre qui injecte du code dans le 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;
}

Le code compile avec:

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

Code de chargement est basé sur l'interposition de sorte que la définition de launchd de loginwindow doit contenir une entrée supplémentaire (pour permettre l'interposition de l'éditeur de liens dynamique), i.e.:.

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

Autres conseils

oui, vous pouvez utiliser le SFAuthorizationPluginView

ici le lien de référence à ADC

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top