7

実行するシェル コマンドをすばやく入力できる単純なアプリケーションを作成しています。完全に機能しますが、sudo コマンドの問題があります。現在、sudo コマンドを検出し、インストーラーで表示されるのとまったく同じように、ユーザーのパスワードの認証ウィンドウを表示しようとします。

sudo コマンドであることが検出された後のコードは次のとおりです。

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
}

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

4

3 に答える 3

2

次のように、AuthorizationExecuteWithPrivileges関数を使用する必要があります。

- (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");

}

BSDは繊細で不機嫌な花なので、rootとしてアプリから任意のコマンドをユーザーに実行させないことをお勧めします。

/講義

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

Hope that helps, -p.

于 2009-10-03T20:03:34.293 に答える
2

私はそれが本当に古い質問であることを知っていますが、まだ答えを探している人には、ここに行きます. (AppleScriptを使用しています)

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

もちろん、[YOUR SCRIPT HERE] を自分のスクリプトに置き換えて、cocoa の方法で文字列をエスケープしてください。

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

さらに説明が必要な場合は、コメントしてください。

于 2013-06-15T10:39:32.503 に答える
1

セキュリティは難しいです。ドキュメントを言い換えてコード スニペットを提供することもできますが、おそらく間違っているでしょう。さらに悪いことに、私の大まかな説明が正しかったとしても、コード スニペットに小さなバグがあり、セキュリティを破壊する可能性が高いでしょう。

権限昇格をいじる場合は、ドキュメントを読み、提供されているサンプルを使用するのが最善の方法です。

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

于 2009-09-13T17:31:02.203 に答える