6

Mac OS Xのログインウィンドウ/System/Library/CoreServices/loginwindow.appをカスタムログインウィンドウアプリケーションに置き換えることはできますか?(そうするための私の理論的根拠を参照してください。)

私のCocoaプログラミングスキルは初歩的なものではないかと思います。プローブCGSession(ユーザーの高速切り替えを実行する文書化されていないユーティリティ)を実行して、使用する関数を確認するときに、

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

リンクされた関数の1つは次のとおりです。

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

ApplicationServicesフレームワークに関するドキュメントが見つかりません。アプリケーションプログラマーインターフェイスではなく、サービスプロバイダーインターフェイスに深く関わっていると思います。

私はこの本当に興味深いスニペットを見つけました:(グーグルキャッシュ)(ダウンページへの直接リンク;サイトは再編成中であるようです)高速ユーザー切り替えが無効になっている場合でもログインウィンドウに切り替えると主張するアプリケーションから。

#include "CGSInternal.h"

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

    return 0;
}

私はCGをCoreGraphicsを意味すると解釈し、それがログインと何の関係があるのか​​理解していません(おそらく、現在のユーザーの作業の上にログインダイアログを表示することを除いて)。

ログインウィンドウの代わりをすることができないとしても、私はこれらの線に沿って(Appleで働いていない人々によって)何ができるか知りたいと思います。

4

2 に答える 2

18

ログインウィンドウアプリケーションは、/ System / Library / LaunchDaemons/com.apple.loginwindow.plistのlaunchd構成の一部として定義されています。

理論的には、ログインウィンドウを独自のものに置き換えることができますが、新しいアプリで何をする必要があるのか​​わかりません-ログインウィンドウは、認証とユーザーセッションの設定よりも少し多くのことを行うと思います->とりわけ、いくつかの起動された関連する雑用をしているように見えます。

CGSCreateLoginSessionを呼び出すアプリケーションをコンパイルしました。実行すると、回転するキューブを介してログインウィンドウに移行します。これがCoreGraphicsを必要とする理由だと思います-それは最後にログアウトを呼び出す単なるグラフィック関数です。

InputManagerを試して、ログインウィンドウがコードをロードすることを確認できます->ロードする場合は、ログインウィンドウNIB(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

コードの読み込みはインターポーズに基づいているため、loginwindowのlaunchd定義には、追加のエントリが含まれている必要があります(ダイナミックリンカへのインターポーズを有効にするため)。

<key>EnvironmentVariables</key>
<dict>    
    <key>DYLD_INSERT_LIBRARIES</key>
    <string>path_to/Desktop/libinterposers.dylib</string>
</dict>
于 2009-07-01T11:56:33.103 に答える
3

はい、SFAuthorizationPluginViewを使用できます

ここにADCのリファレンスリンク

于 2009-07-01T15:17:31.810 に答える