API は Mac OS X Leopard 以降公開されていますが、SMJobBless()
特権ヘルパー ツールを作成するための正しい使用方法に関するドキュメントは意外にも、そして残念ながらほとんどありません。Apple のサンプル プロジェクトから直接コードをコピーする場合でも、多くの落とし穴があります。幸いなことに、私はこの問題を回避する方法を見つけ、ヘルパー ツールを動作させるための基礎を手に入れました。
しかし、SMJobBless()
ツールを祝福してコピーするだけで、実行はしないようです。ヘルパーツールのmain()
関数に次のコードを含めました。すべき実行しようとしたが、実行されなかった(NSLog()
私が得たわずかな情報によると、なぜか動作しないため)持っている見つかりました。「Hello world」タイプの文字列をいくつか試してみましたsyslog()
が、システム コンソールに何も表示されません。ヘルパー ツールが起動されたという表示はまったくありません。
ドキュメントはほとんど役に立ちません。呼び出された後、ヘルパー ツールが「準備完了」であるとだけ書かれておりSMJobBless()
、「準備完了」が何を意味するのかさえ示されていません。
さらに、Apple のサンプルにはプロセス間通信コードがまったく含まれておらず、ヘルパー ツールとどのようにやり取りすればよいか説明されていません。分散オブジェクトを使用していますか? Mach ポートですか? 誰にもわかりません。その方法については公式の説明はありません。
それで、これをどうやって実現するかについて誰か情報を持っている人はいませんか?ヘルパーツールがインストールされ、認証が機能していることを確認しましたが、ヘルパーツールを起動して通信する方法がまったくわかりません。ドキュメントにギャップがあり、今のところ謎です。非常にイライラしています。のみこの問題を抱えているのは(しかし、それについてはほとんど言及されていない)どこでも)、そしてSMJobBless()
明らかに機能するどうにかなぜなら、それは Apple が使用しているものだからです。
( については言及しないでくださいAuthorizationExecuteWithPrivileges()
。私は使用していません。これは非推奨であり、確実に廃止され、大きなセキュリティホールです。結構です。)
ベストアンサー1
XPCは、権限を昇格させようとしている場合(https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html):
デフォルトでは、XPC サービスは可能な限り制限された環境 (ファイルシステム アクセス、ネットワーク アクセスなどが最小限に抑えられたサンドボックス) で実行されます。サービスの権限をルートに昇格することはサポートされていません。
SMJobBless は、Apple が提供する SMJobBless の例のように、ヘルパー ツールをインストールして Launchd に登録します。ヘルパー ツールを実際に起動させるコツは、ヘルパー ツールのアドバタイズされたサービスに接続してみることです。
ソケット経由で単純な launchd クライアント/サーバー モデルを実演するWWDC2010 の例がありましたssd
。これはもう Apple からは入手できませんが、ここにリンクがあります:https://lists.apple.com/archives/macnetworkprog/2011/Jul/msg00005.html
ssd の例のサーバー コードのディスパッチ キュー処理を SMJobBless の例のヘルパー ツールに組み込み、メイン アプリが適切なポートで接続を試行したときにヘルパー ツールが実際に (ルートとして) 実行されていることを確認できました。ヘルパー ツールと通信できる他のメカニズム (ソケット以外) を理解するには、Launchd に関する WWDC2010 ビデオを参照してください。
私が持っている変更したソースを合法的に再配布できるかどうかはわかりませんが、2 つのプロジェクトをマージしてヘルパー ツールを実行するのはかなり簡単なはずです。
編集:以下は、アプリとヘルパー間の通信に分散オブジェクトを使用する、私が作成したサンプル プロジェクトです。https://www.dropbox.com/s/5kjl8koyqzvszrl/エレベーター.zip