Tôi cần phải thực hiện "sudo" về cơ bản nhưng, tôi cần phải cho phép loại đó vào mã NSTask của mình. Điều này có thể không?Cách cấp quyền sử dụng NSTask - mục tiêu-c
Cảm ơn, Elijah
Tôi cần phải thực hiện "sudo" về cơ bản nhưng, tôi cần phải cho phép loại đó vào mã NSTask của mình. Điều này có thể không?Cách cấp quyền sử dụng NSTask - mục tiêu-c
Cảm ơn, Elijah
Một số thông tin liên quan được đưa ra trong bài viết "Communicating with a Privileged Tool "
Xem thêm: http://osx.hyperjeff.net/Reference/CocoaArticles?cat=29
Nếu bạn đang tìm kiếm một giải pháp nhẹ hơn, tôi đã viết thực hiện chung này mà phải đạt được những gì bạn muốn: Ví dụ
- (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;
}
}
Cách sử dụng:
NSString * output = nil;
NSString * processErrorDescription = nil;
BOOL success = [self runProcessAsAdministrator:@"/usr/bin/id"
withArguments:[NSArray arrayWithObjects:@"-un", nil]
output:&output
errorDescription:&processErrorDescription];
if (!success) // Process failed to run
{
// ...look at errorDescription
}
else
{
// ...process output
}
Nó hơi hacky, nhưng IMHO là một giải pháp thỏa đáng. Ghi có để khám phá cho this SO question.