アプリケーションでNSFileManagerを使用してシステムファイルを移動する必要がありますが、rootアクセス権がないようです。この特権を取得するための最も簡単な方法は何でしょうか。
Appleが提供するBetterAuthorizationSampleコードを調べましたが、ユーザーから承認された後、NSFileManagerにタスクを実行させる方法がわかりません。
アプリケーションでNSFileManagerを使用してシステムファイルを移動する必要がありますが、rootアクセス権がないようです。この特権を取得するための最も簡単な方法は何でしょうか。
Appleが提供するBetterAuthorizationSampleコードを調べましたが、ユーザーから承認された後、NSFileManagerにタスクを実行させる方法がわかりません。
アプリケーションでroot権限を使用する必要がある場合は、AppleのAuthorizationServicesAPIを使用してください。
更新:参照用にこの回答をまだ使用している人々を更新するBLAuthentication
には、これと呼ばれる古くて非常に推奨されていない関数を使用しAuthorizationExecuteWithPriviledges
ます。技術的には引き続き使用できますが、Mac OS X Lion用に開発している場合は、ヘルパーツールとして特権を使用してコードを実行できるServicesManagementフレームワークを使用できます。
特権ヘルパーツールを作成して起動する方法については、私の質問の1つであるSMJobBless()を使用した特権ヘルパーツールの作成を参照してください。
承認するための本当に簡単な方法はないので、クラスで管理者認証の下で実行NSFileManager
される標準mv
とcp
ツールの使用を検討する必要があります。BLAuthentication
残念ながら、元の作者のWebサイトはダウンしていますが、クラスのコピーをGoogleで簡単に見つけることができます(必要に応じてコピーをアップロードすることもできます)。
を使用BLAuthentication
すると、実行しようとしていることは次のようになります。
#define MOVE @"/bin/mv"
if (![[BLAuthentication sharedInstance] isAuthenticated:MOVE]) {
[[BLAuthentication sharedInstance] authenticate:MOVE];
}
NSArray *arguments = [NSArray arrayWithObjects:@"location1", @"location2", nil];
[[BLAuthentication sharedInstance] executeCommand:MOVE withArgs:arguments];
上記のコードは、ユーザーに管理者のパスワードの入力を求め、デフォルトの制限時間である5分間でプログラムを認証します。
警告
もちろん、システムファイルには常に注意してください。特にプログラムが他の人のコンピュータで実行される場合は、可能な限りそれらを移動したり操作したりしないでください(何か問題が発生した場合は、非難されます)。