I'm developing my first Mac App have some issues with shell commands... I'm trying to find out how to get the permission windows that the user can enter his password. I want to copy a picture in a system folder, and change the name of another picture too. I try to change the Login window background.
Command 1: "sudo mv DefaultDesktop.jpg DefaultDesktop_copy.jpg"
Command 2: "sudo cp /path/of/image.jpg DefaultDesktop.jpg"
With the terminal, it is very easy. But with an interface, i would like this prompt asking for the password.
Here is my code for the first command:
- (void)copyDefaultBackground:(id)sender {
NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/sudo"];
NSArray *arguments;
arguments = [NSArray arrayWithObjects:@"mv"
@"/System/Library/CoreServices/DefaultDesktop.jpg",
@"/System/Library/CoreServices/DefaultDesktop_copy.jpg",
nil];
[task setArguments: arguments];
NSPipe *pipe;
开发者_运维技巧 pipe = [NSPipe pipe];
[task setStandardOutput: pipe];
NSFileHandle *file;
file = [pipe fileHandleForReading];
[task launch];
NSData *data;
data = [file readDataToEndOfFile];
NSString *string;
string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog (@"Script returned:\n%@", string);
}
Update:
I found that NSFileManager is an object that allow to manage file on the disk. Isn't it better than using a NSTask with a shell command?
Thank you.
You will need to use Authorization Services to authorize the move:
Introduction to Authorization Services Programming Guide
For the file move itself, why not use NSFileManager? Authorization aside, both your steps (make a backup, then move the new file into place) can be done with a single line of code each with NSFileManager.
What you want is STPrivilegedTask, which is an NSTask-like class which abstracts Authorization Services.
Get rid of sudo and execute the command using STPrivilegedTask -- the user will be prompted for an admin password, and your command will be executed with admin privileges.
精彩评论