0

/etc/hosts を更新するアプリケーションに取り組んでいます。このため、特権を評価する好ましい方法は、SMJobBless を介してヘルパー ツールをインストールすることであることがわかりました。次のコードの種類は機能します。

    BOOL result = NO;

AuthorizationItem authItem      = { kSMRightBlessPrivilegedHelper, 0, NULL, 0 };
AuthorizationRights authRights  = { 1, &authItem };
AuthorizationFlags flags        =   kAuthorizationFlagDefaults              |
                                    kAuthorizationFlagInteractionAllowed    |
                                    kAuthorizationFlagPreAuthorize          |
                                    kAuthorizationFlagExtendRights;

AuthorizationRef authRef = NULL;
CFErrorRef error = NULL;

OSStatus status = AuthorizationCreate(&authRights, kAuthorizationEmptyEnvironment, flags, &authRef);
if (status == errAuthorizationSuccess) {
    result = SMJobBless(kSMDomainSystemLaunchd, (CFStringRef)@"com.fictitiousnonsense.MeddoHelper", authRef, &error);
} else {
    NSLog(@"Failed to authorize");
}

if (error != NULL) {
    NSLog(@"Error: %@", error);
} else {
    NSLog(@"I think it worked");
}

ドキュメントによると、私のヘルパー ツール com.fictitiousnonsense.MeddoHelper は /Library/PrivilegedHelperTools/com.fictitiousnonsense.MeddoHelper にインストールされ、その plist ファイルは /Library/LaunchDaemons にインストールされます。問題は、これがコンソールに表示されることです:

9/24/12 11:04:41.237 PM launchdadd[9082]: Could not open /Library/PrivilegedHelperTools/com.fictitiousnonsense.MeddoHelper (open() error 2: No such file or directory)
9/24/12 11:04:41.237 PM launchdadd[9082]: FAILURE: The path /Library/PrivilegedHelperTools/com.fictitiousnonsense.MeddoHelper does not exist on-disk.

ターミナルからヘルパーを手動で実行でき、動作します。なぜlaunchdはそれを実行しないのですか? Apple が提供する SMJobBlessApp サンプル アプリを実行しましたが、問題なく動作します。

参考までに、コード全体はhttps://github.com/varikin/meddoにあります。

4

1 に答える 1

0

dtrussコマンドラインでlaunchdをトレースするために使用できます。launchdによって実行されたすべてのシステムコールが表示されます。そのうちの1つは、特権ヘルパーにアクセスしようとする必要があります。トレースは、どのsyscallが失敗したかを正確に示し、launchdにヘルパーが存在しないと思わせる必要があります。ところで、それはある種の許可の問題だと思います。

于 2012-10-05T17:22:34.950 に答える