2009-06-30 3 views
6

Mac OS Xログインウィンドウの/System/Library/CoreServices/loginwindow.appをカスタムログインウィンドウアプリケーションに置き換えることはできますか? (See my rational for doing soMacログイン画面を置き換えることはできますか?

私のココアプログラミングのスキルは初歩的なものです。

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

Iの避難所」:私はそれは面白い、私はリンク機能の一つであることを

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

を行うことによって、使用する機能ものを見るためにa undocumented utility that performs fast user switching)あるプローブCGSessionを(実行、ことがわかります。tはApplicationServicesフレームワークに関するドキュメントを見つけた私は、私は深く代わりにアプリケーションプログラマーインタフェースのサービスプロバイダインタフェースに取得してい疑う

私はこれは本当に面白いスニペット見つけた:。(google cache)(direct link to down pageを。迅速なユーザーの切り替えが無効になっていても、ログインウィンドウに切り替えると主張するアプリケーションからサイトが再構成されているように見えます)。

#include "CGSInternal.h" 

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

    return 0; 
} 

私はCoreGraphicsを意味するためにCGを取り、それは(おそらく、現在のユーザーの仕事上のログインダイアログアップを置くことを除いて)で、ロギングに関係しているかを理解していません。

ログインウィンドウを置き換えることができない場合でも、私はこれらの行に沿って(Appleで働かない人によって)何ができるのか知りたいと思うでしょう。

+2

あなたの「そのための論理的根拠」が壊れているように見える(「リンクが壊れている」など) – akf

+0

申し訳ありません。私はリンクを修正しました。 –

+0

すべて可能です。それはあなたが無効にしたいいくつの保証とEULAsに依存します。 –

答えて

18

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

理論的には、ログインウィンドウを自分で置き換えることはできますが、新しいアプリケーションで何をしなければならないのか分かりません。ログインウィンドウは認証とユーザーセッションの設定を少し上回ります。とりわけ、それはいくつかのlaunchd関連の雑用をやっているように見えます。

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

あなたはログインウィンドウがコードをロードInputManagerを試してみて、それを見ることができました - >それがないならば、あなたはその後、ログインウインドウNIB(LoginWindowUI.nib)を変更し、ユーザーに新しいウィンドウを表示するには、いくつかのボタンを追加することができますブラウザ。生徒が自分の写真を選択すると、loginwindowのユーザ名とパスワードのフィールドを自動入力することができます。

ノードこれはすべて理論であり、のように非常に脆弱で安全ではありません。

幸運。

をこのようなものを試してみることはここでは、概念実証だとき、私は私のシステム数回ホースでした -

その後、これはとても注意して使用する非常に安全ではありませんのでご注意ください

を編集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; 
} 

コードを用いてコンパイル:

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

コード負荷はそれほどログインウインドウのlaunchdの定義を介在に基づいて、追加のエントリ(動的リンカーに介在可能にする)、すなわちを含むことがあります

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

うわー。私は喜んであなたにもう一度アップフォートします。それは同時に信じられないほど狂っている。かなり前進しているので、私はこのサンプルが何をしているかを正しく理解しておいてください: "openlog"への呼び出しを "my_openlog"に置き換えます。これにより、クラスLLAppがNSApplicationクラスのようになり、変更することができ、run関数を変更して何かをシステムログに出力することで、これを証明します。 –

+0

関数の置き換えは、 "interposing mac os x"のために - googleを挿入することで可能になり、OS XのAmit Singhの本の仕組みを説明する章があります。クラスポーズは、クラスXのすべてのインスタンスをクラスYに置き換えるために使用されます.64ビットではサポートされていません。 - [NSApplication run]の代わりに、あなたはおそらくそれを望んでいません - カスタムビュークラスから何らかのメソッドなどのloginwindowアプリケーション内のものを置き換える必要があります(カスタムビュークラスの名前は、 Interface builderのバンドル)。 – diciu

+0

これは近い将来に時間を割り当てることができないようですが、間違いなく、あなたが入れているすべての苦労のために正しい回答者を与えています。私は本当にこのガイダンスで課題を達成できると思います。ありがとう。 –

3

はい、あなたはSFAuthorizationPluginView

012を使用することができます

+0

情報ありがとうございます。 Leopardだけのようです(私はTigerもサポートしたいと思います)。 Appleは "NameAndPassword"サンプルを持っており、タグまたは "SFAuthorizationPluginView"(http://stackoverflow.com/questions/tagged/sfauthorizationpluginview)を使用しているので、SOに関するいくつかの関連する質問があります –

+0

私はあなたができるとは確信していませんSFAuthorizationPluginViewを使用してログインウィンドウ内の何かを簡単に変更できます。 SFAuthorizationPluginViewを示すNameAndPasswordコードサンプルをコンパイルしてインストールしました。カスタム権限(既存の権利の定義については/ etc/authorizationを参照してください - >ログインはそこにありません)を構築することができます。 プラグインは、アプリケーションが、新しく作成された権限のためにユーザーに権限を与えるようにOSに要求すると、機能します。 – diciu

+0

ありがとう、diciu。これをログイン画面にどのように表示させるか(またはできるかどうか)はわかりませんでした。 [私はそれをコンパイルしましたが、自分のコンピュータで許可をテストする(そして壊れないようにしたい)] –

関連する問題