WindowServerにアクセスできるOSX用のアプリケーションを開発しています。このアプリケーション (エージェントと呼びましょう) は、現在ログインしているすべてのユーザーに対して最初にロードされます。実行中の loginwindow プロセスを検索し、各ユーザーとして plist をロードします (bsexec を使用して適切なコンテキストを設定します)。
ps -ef | grep ログインウィンドウ
501 90425 1 0 午前 10 時 46 分?? 0:01.21 /System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow コンソール
502 90721 90426 0 午前 10 時 54 分?? 0:00.36 /システム/ライブラリ/CoreServices/loginwindow.app/Contents/MacOS/loginwindow
0 91103 90426 0 午前 11:01 ?? 0:02.57 /システム/ライブラリ/CoreServices/loginwindow.app/Contents/MacOS/loginwindow
ここでは、ログインしたユーザー (非アクティブ) 用に 3 つの loginwindow プロセス 2 と、ログイン ウィンドウ (アクティブ) 用に 1 つのプロセスがあります。
走る:
sudo launchctl bsexec 90721 sudo -u 502 launchctl load -wF -S Aqua /Library/LaunchAgents/com.myagent.plist
ログインしているユーザーごとに。
と
sudo launchctl bsexec 91103 launchctl load -wF -S LoginWindow /Library/LaunchAgents/com.myagent.plist
ログインウィンドウ用。
問題は、エージェントがログイン ウィンドウで (root として) 起動すると、次のエラーが発生することです。
May 15 15:47:01 Mac-mini.local WSagent.bin[99201]: kCGErrorFailure: This user is not allowed access to the window system right now.
May 15 15:47:01 Mac-mini.local WSagent.bin[99201]: kCGErrorInvalidConnection: CGSGetEventPort: Invalid connection
May 15 15:47:01 Mac-mini.local WSagent.bin[99201]: _RegisterApplication(), FAILED TO establish the default connection to the WindowServer, _CGSDefaultConnection() is NULL.
May 15 15:47:01 Mac-mini.local WSagent.bin[99201]: CGSRegisterConnectionNotifyProc called with invalid connection
May 15 15:47:01 --- last message repeated 1 time ---
May 15 15:47:01 Mac-mini.local WSagent.bin[99201]: kCGErrorInvalidConnection: CGSSetConnectionProperty: Invalid connection
May 15 15:47:01 Mac-mini.local WSagent.bin[99201]: kCGErrorInvalidConnection: Error enabling suspendResume handling
しかし、ユーザーにログインしてから再度ログイン ウィンドウにログアウトすると、起動したエージェントが適切に作成され、ウィンドウ サーバーに問題なくアクセスできます。
新しい OSX バージョンで問題が発生します (たとえば、10.6.8 では問題なく動作します)。
アイデアが不足していますが、これをログインウィンドウで機能させたいと思っています。助けてくれてありがとう!
/グラシュ