Frage

Ist es möglich, die Mac OS X Anmeldefenster, /System/Library/CoreServices/loginwindow.app, mit einer benutzerdefinierten Login-Fenster-Anwendung zu ersetzen? ( mein rational sehen für so tun.)

Ich habe Angst rudimentär meine Cocoa Programmierkenntnisse sind. Ich finde es interessant, dass, wenn ich Sonde CGSession laufen (die ein undokumentierte-Dienstprogramm, das führt Fast User Switching) , um zu sehen, welche Funktionen es nutzt, indem

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

, dass eine der verknüpften Funktion:

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

Ich habe keine Dokumentation auf dem Application Rahmen gefunden. Ich vermute, ich bin immer tief in den Service-Provider Interfaces statt Application Programmer Interfaces.

Ich habe diese wirklich interessante Schnipsel finden: ( google-Cache ) ( Link zu unten ;. es erscheint die Seite neu Organisation wird gerade) von einer Anwendung, die auf die Login-Fenster wechseln behauptet, auch wenn die schnelle Benutzerumschaltung deaktiviert ist

#include "CGSInternal.h"

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

    return 0;
}

I CG nehmen Core Graphics zu verstehen, und verstehen nicht, was das mit Protokollierung zu tun hat (außer vielleicht ein Login-Dialog setzen oben über die Arbeit des aktuellen Benutzers).

Auch wenn es nicht möglich ist, einen Ersatz für das Login-Fenster zu erreichen, würde ich daran interessiert zu wissen, was in diese Richtung getan werden kann (von Menschen, die für Apple nicht funktionieren).

War es hilfreich?

Lösung

Die Login-Fenster-Anwendung wird als Teil der launchd-Konfiguration definiert in /System/Library/LaunchDaemons/com.apple.loginwindow.plist .

In der Theorie können Sie das Anmeldefenster mit Ihrer eigenen ersetzen, aber ich weiß nicht, was Sie in der neuen App zu tun haben - ich glaube, die Login-Fenster funktionieren ein bisschen mehr als die Authentifizierung und die Benutzersitzung einrichten -> unter andere, es sieht aus wie seine einige launchd Zusammenhang Aufgaben zu tun.

Ich habe eine Anwendung kompiliert, die ruft CGSCreateLoginSession und wenn Sie es laufen wechselt es zum Login-Fenster über den rotierenden Würfel. Ich stelle mir das ist, warum es Core Graphics erfordert - es ist nur eine Grafikfunktion, die Abmeldung am Ende ruft

.

Sie könnten einen Inputmanager versuchen und es das Login-Fenster sehen lädt den Code -> wenn ja, könnten Sie dann verändern die Loginwindow NIB ( LoginWindowUI.nib ) und einige Schaltflächen fügen Sie eine neue anzuzeigen Fenster mit dem Benutzer Browser. Sobald der Schüler ein Bild von ihm wählt / selbst könnten Sie die Felder Benutzername und Passwort in der Loginwindow Autofill.

Node ist das alles Theorie, und es sieht sehr zerbrechlich und unsicher.

Viel Glück.

Später bearbeiten

Bitte beachten Sie, diese sehr unsicher ist, so vorsichtig verwenden - ich habe mein System ein paar Mal Schlauch, wenn diese Sachen ausprobieren

Hier ist eine Proof-of-Concept-Implementierung, den Code in der Loginwindow einspritzt.

#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;
}

Der Code kompiliert mit:

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

Code-Belastung Zwischen so die launchd Definition von Loginwindow basiert hat einen zusätzlichen Eintrag enthält (zu ermöglichen, in dem dynamischen Linker Zwischen), das heißt:.

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

Andere Tipps

ja, können Sie die SFAuthorizationPluginView verwenden

hier die Referenzverbindung bei ADC

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top