11

私が作成しているアプリケーションでは、NSTaskを使用してrootとして次のコマンドを実行する必要があります(ユーザーは本当に必要な場合はトライスを求められ、ドライブをアンマウントするように求められます)。

/bin/rm -rf /
#Yes, really

sudo問題は、ユーザーが使用できないstdinにパスワードを入力する必要があるため、Substitute User Do()を使用するだけでは機能しないことです。Preferences.appでロックをクリックしたときに表示されるのと同じウィンドウを、次のようにユーザーに表示したいと思います(できれば短いパスワードを使用して)。

スクリーンショット
(出典:quickpwn.com


誰かがこれを手伝ってくれますか?ありがとう。

4

5 に答える 5

9

NSTaskのようなインターフェイスを備えたAuthorizationExecuteWithPrivileges()のObjective-CラッパークラスであるSTPrivilegedTaskを確認してください。

于 2011-12-12T14:07:36.953 に答える
6

これは、Mac OS X で適切に行うのが最も難しいタスクの 1 つです。

これを行う方法を文書化したガイドはAuthorization Services Programming Guideです。複数の可能性がありますが、通常、最も安全なものは実装が最も困難です。

launchd デーモン (最も安全な方法) を使用するツールの作成を開始しました。コードは google code で入手できます。必要に応じて、そのコードをコピーできます。

于 2010-10-29T09:59:08.350 に答える
5

グーグルとこのSOの質問での素晴らしい発見のおかげで、私は今これに答えることができると思います。少しハッキーですが、IMHOは満足のいく解決策です。

私はあなたが望むものを達成するはずのこのジェネリック実装を書きました:

- (BOOL) runProcessAsAdministrator:(NSString*)scriptPath
                     withArguments:(NSArray *)arguments
                            output:(NSString **)output
                  errorDescription:(NSString **)errorDescription {

    NSString * allArgs = [arguments componentsJoinedByString:@" "];
    NSString * fullScript = [NSString stringWithFormat:@"%@ %@", scriptPath, allArgs];

    NSDictionary *errorInfo = [NSDictionary new];
    NSString *script =  [NSString stringWithFormat:@"do shell script \"%@\" with administrator privileges", fullScript];

    NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:script];
    NSAppleEventDescriptor * eventResult = [appleScript executeAndReturnError:&errorInfo];

    // Check errorInfo
    if (! eventResult)
    {
        // Describe common errors
        *errorDescription = nil;
        if ([errorInfo valueForKey:NSAppleScriptErrorNumber])
        {
            NSNumber * errorNumber = (NSNumber *)[errorInfo valueForKey:NSAppleScriptErrorNumber];
            if ([errorNumber intValue] == -128)
                *errorDescription = @"The administrator password is required to do this.";
        }

        // Set error message from provided message
        if (*errorDescription == nil)
        {
            if ([errorInfo valueForKey:NSAppleScriptErrorMessage])
                *errorDescription =  (NSString *)[errorInfo valueForKey:NSAppleScriptErrorMessage];
        }

        return NO;
    }
    else
    {
        // Set output to the AppleScript's output
        *output = [eventResult stringValue];

        return YES;
    }
}

使用例:

    NSString * output = nil;
    NSString * processErrorDescription = nil;
    BOOL success = [self runProcessAsAdministrator:@"/usr/bin/id"
                    withArguments:[NSArray arrayWithObjects:@"-un", nil]
                           output:&output
                            errorDescription:&processErrorDescription
                  asAdministrator:YES];


    if (!success) // Process failed to run
    {
         // ...look at errorDescription 
    }
    else
    {
         // ...process output
    }
于 2013-03-06T13:21:58.867 に答える
-3

私の場合、これは正しくありません。

> 問題は、ユーザーがパスワードを入力する必要があるため、単純に Substitute User Do (sudo) を使用しても機能しないことです >

/etc/sudoers を編集して、目的のユーザーがパスワードの入力を求めることなく .sh スクリプトを開始できるようにしました。したがって、sudo sed [...] /etc/printers.conf のようなコマンド ラインを含むシェル スクリプトを実行して、printers.conf ファイルを変更すると、/etc/sudoers ファイルにこの行が含まれます。

myLocalUser ALL=(ALL) NOPASSWD: ALL

しかしもちろん、スクリプトまたは NSTask の実行を許可するために、管理者パスワードを入力するようにユーザーに正しく求めるより良いソリューションを探しています。AppleScript 呼び出しを使用してタスク/シェル スクリプトをプロンプトおよび実行するコードに感謝します。

于 2013-05-06T13:37:21.203 に答える