使用具有管理员权限的AppleScript;五分钟内不得再次要求认证。”;不';不行?

使用具有管理员权限的AppleScript;五分钟内不得再次要求认证。”;不';不行?,applescript,Applescript,在苹果的文档中,它提到“使用管理员权限执行shell脚本命令”,当使用这种方式时,“一旦脚本被正确验证,它将在五分钟内不再要求验证。” 但是,它仍然需要一次又一次地请求身份验证 我发现,当使用ScriptEditor.app时,Apple文档是正确的。 如: do shell script”/bin/cp-r/Users/Simon/Desktop/Test/Test.zip/Users/Simon/Desktop/“具有管理员权限 但是,当使用运行shell脚本的NSAppleScript时,

在苹果的文档中,它提到“使用管理员权限执行shell脚本命令”,当使用这种方式时,“一旦脚本被正确验证,它将在五分钟内不再要求验证。”

但是,它仍然需要一次又一次地请求身份验证

我发现,当使用ScriptEditor.app时,Apple文档是正确的。 如:
do shell script”/bin/cp-r/Users/Simon/Desktop/Test/Test.zip/Users/Simon/Desktop/“具有管理员权限

但是,当使用运行shell脚本的NSAppleScript时,Apple文档是错误的。 例如:


我希望,当使用NSAppleScript执行shell脚本时,它也不会在五分钟内再次请求身份验证。

首先,我不认为这是解决此问题的最佳方法。但让我先回答这个问题,然后再提出另一条途径

请注意,技术说明2065中说明:

身份验证仅适用于该特定脚本:另一个脚本 脚本,或同一脚本的修改版本,将要求自己的 认证

每次运行此行时:

NSAppleScript *copyAppleScript = [[NSAppleScript alloc] initWithSource:copyScript];
…您创建了一个新脚本,该新脚本需要自己的授权。如果您想重用给定的脚本而不需要不断地重新授权,则需要创建一个
NSAppleScript
属性,将脚本存储在那里一次,然后重复调用它。换言之:

@接口MyObject()
@属性(强)NSAppleScript*myAppleScript;
@结束
@实现MyObject
-(无效)设置脚本{
//叫这一次
NSDictionary*错误=nil;
NSString*copyScript=@“do shell script\”/bin/cp-r/Users/Simon/Desktop/Test/Test.zip/Users/Simon/Desktop\“具有管理员权限”;
self.myAppleScript=[[NSAppleScript alloc]initWithSource:copyScript];
}
-(void)运行脚本{
//根据需要调用此;不需要重新授权
if([self.myAppleScript executeAndReturnError:&error]){
NSLog(@“myAppleScript成功!”);
}否则{
NSLog(@“myAppleScript失败!”);
}
}
@结束
但是,由于您的目标是运行shell脚本,我建议您完全忘记
NSAppleScript
,而是使用
NSTask
是shell脚本从objC运行的方式,应该完全避免授权问题。最简单的方法是编写一个显式shell脚本并将其存储在bundle中:

#/bin/bash
cp-r/Users/Simon/Desktop/Test/Test.zip/Users/Simon/Desktop
然后调用并运行该shell脚本:

n错误*err;
NSTask*task=[NSTask launchedTaskWithExecutableURL:[[NSBundle mainBundle]URLForResource:@“ShellScript”
带扩展名:@“sh”]
参数:[NSArray数组]
错误:&错误
terminationHandler:nil];
…或者,如果你不想捆绑脚本

n错误*err;
NSTask*任务=[[NSTask alloc]init]
task.arguments=[NSArray arrayWithObjects:@“#!/bin/bash”,
@“-c”,
@“cp-r/Users/Simon/Desktop/Test/Test.zip/Users/Simon/Desktop”,
零];
[任务启动和返回错误:&错误];
p.S.


我一直认为这个
cp
命令只是概念上的证明,但是如果您的实际目标是复制文件,那么请忘记
NSAppleScript
NSTask
。改为使用
copyitematrol:toul:error:

我被这句话弄糊涂了:“它仍然需要请求身份验证”。您的意思是您的脚本确实会反复请求身份验证,而您不希望这样做吗?或者,您的意思是希望它重复请求身份验证,但事实并非如此?我再次描述了该问题。非常感谢@Ted WrigleThanks,你太棒了!从你漂亮的回答,我知道苹果的文档是正确的。事实上,我的要求是将文件复制到“/Library/Audio/Plug-Ins/HAL”,此操作需要管理员权限。NSFileManager不满足我的要求。另一个要求是,当显示权限的警报窗口时,我可以更改警报窗口的提示,例如:do shell script“/bin/cp-r/Users/Simon/Desktop/Test/Test.zip/Library/”并提示“changed title”具有管理员权限。因此,NSAppleScript的方式满足了我的需求
NSAppleScript *copyAppleScript = [[NSAppleScript alloc] initWithSource:copyScript];