2009-09-13 19 views
6

私はすぐに実行するシェルコマンドを入力する簡単なアプリケーションを作っています。 これは完全に動作しますが、sudoコマンドの問題があります。 現在、sudoコマンドを検出した後、インストーラに表示されているのとまったく同じように、ユーザーのパスワード用の認証ウィンドウが表示されるようにします。それはsudoコマンドで検出するとMacアプリケーションでの管理者権限への昇格

は、ここでは、コードです:

SFAuthorization *authorization = [[SFAuthorization alloc] initWithFlags:kAuthorizationFlagPreAuthorize rights:NULL environment:kAuthorizationEmptyEnvironment]; 
if ([authorization obtainWithRight:"com.mycompany.myapplication" flags:kAuthorizationFlagPreAuthorize error:nil]){ 
    //authorized, now run the command using NSTask. 
}else{ 
    //fail 
} 

、私の知る限り、これは完全に、完全に間違っています。これは私がドキュメンテーションからまとめたものです。何か案は?

答えて

1

セキュリティは難しいです。私はドキュメントを言い換えてコードスニペットを提供することができますが、間違っている可能性があります。悪いことに、たとえ私の高いレベルの記述が正しかったとしても、コードスニペットにセキュリティを殺す小さなバグがある可能性が非常に高いでしょう。

権限の昇格を混乱させる場合は、ドキュメントを読み、提供されたサンプルを使用するのが最善の方法です。 BSDは、私は、ユーザーがから任意のコマンドを実行させないことをお勧めしたい繊細かつ不機嫌な花であることを考えると

- (IBAction)touch: (id) sender { 

    NSString * filepath = [_filepathfield stringValue]; 
    FILE *commpipe = NULL; 
    OSStatus execstatus; 


    NSLog(@"file path is %@", filepath); 

    char *args[] = {[filepath cString], NULL}; 


    SFAuthorization * authorization = [SFAuthorization authorization]; 

    execstatus = AuthorizationExecuteWithPrivileges([authorization authorizationRef], 
                "/usr/bin/touch", 
                kAuthorizationFlagDefaults, 
                args, 
                &commpipe); 

    if (execstatus == errAuthorizationSuccess) 
    NSlog(@"Toot! It worked"); 
    else 
    NSLog(@"No dice"); 

} 

:あなたはこのように、AuthorizationExecuteWithPrivileges機能を使用したいと思う

https://developer.apple.com/mac/library/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html#//apple_ref/doc/uid/TP30000995-CH204-TP1

1

アプリはrootとして

/講義

あなたはそれ自身のユーザーから自分のプログラムの機能を制限したい場合はあなたの例からコードを移動するための方法の始まりです。たとえば、特定のユーザーのみが保存されたファイルからデータを変更できるようにするアプリがあるとします。したがって、セキュリティデータベース 'com.mycompany.LibraryApp.AlterData'にエントリを作成し、データを変更しようとしたときにその権限を持っているかどうかを確認します。しかし、それはまったく別の話題です...

希望があれば、 -p。

+0

しかし、これはNSTaskを実行しません。任意のアイデアNSTask特権を使用して実行する方法は? –

1

私はそれが本当に古い質問であることを知っていますが、答えを探している人にとっては、ここに行きます。当然の

NSAppleScript *script = [[NSAppleScript alloc] initWithSource:@"do shell script \"[YOUR SCRIPT HERE]\" with administrator privileges"]; 

、スクリプトで[HEREスクリプト]を交換し、文字列、ココア道をエスケープするようにしてください(これは、AppleScriptを使用しています)。

NSDictionary *errorInfo; 
[script executeAndReturnError:&errorInfo]; 

詳細については、ご意見ください。

関連する問題