使用NSAppleScript在目标C中创建和调用AppleScript应用程序是否有相同代码的不同结果?

使用NSAppleScript在目标C中创建和调用AppleScript应用程序是否有相同代码的不同结果?,applescript,initwithcontentsofurl,nsapplescript,Applescript,Initwithcontentsofurl,Nsapplescript,首先,我创建了一个AppleScript应用程序,代码如下(文件名:UnloadTest.scpt): 并使用NSAppleScript类调用,代码如下: NSString * strScript = [[NSBundle mainBundle] pathForResource:@"UnloadTest" ofType:@"scpt"]; NSAppleScript * appScript = [[NSAppleScript alloc] initWithContentsOfURL:[NSURL

首先,我创建了一个AppleScript应用程序,代码如下(文件名:UnloadTest.scpt):

并使用NSAppleScript类调用,代码如下:

NSString * strScript = [[NSBundle mainBundle] pathForResource:@"UnloadTest" ofType:@"scpt"];
NSAppleScript * appScript = [[NSAppleScript alloc] initWithContentsOfURL:[NSURL fileURLWithPath:strScript] error:nil];
[appScript executeAndReturnError:NULL];
[appScript release];
它可以正常工作,但有一个问题:如果我想在另一台计算机上运行我的应用程序,我需要将用户名和密码更改为“UnloadTest.scpt”文件中其他人的用户名和密码,这太愚蠢了!所以我想换一种方式:使用“-(id)initWithSource:(NSString*)source”函数从代码创建AppleScript,我可以从我的应用程序界面发送用户名和密码:

    NSString        *strScriptUnload    = [NSString stringWithFormat:@"\
                                           set UserName to \"%@\"\
                                           set MyPASSWORD to \"%@\"\
                                           do shell script \"sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext\" user name UserName password MyPASSWORD with administrator privileges\
                                           do shell script \"sudo cp ./libftd2xx.1.0.2.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\
                                           do shell script \"sudo cp ./libd2xx_table.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\
                                           do shell script \"cd /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\
                                           do shell script \"sudo ln -sf libftd2xx.1.0.2.dylib libftd2xx.dylib\" user name UserName password MyPASSWORD with administrator privileges",[m_textUserName stringValue], [m_textPassword stringValue]];
    NSAppleScript   *appUnloadScript    = [[NSAppleScript alloc] initWithSource:strScriptUnload];
    returnDescriptor = [appUnloadScript executeAndReturnError:nil];
    [appUnloadScript release];
但它对我来说失败了,看起来

sudo ln -sf libftd2xx.1.0.2.dylib libftd2xx.dylib
不成功。我想是AppleScript没有获得特权,但我不知道如何更正它


是否有人可以帮助我理解此问题?

我已找到导致此问题的原因,只是在AppleScript代码行后缺少“\n”。下面是成功的代码:

NSString        *strScriptUnload    = [NSString stringWithFormat:@"\
                                       set UserName to \"%@\"\n\
                                       set MyPASSWORD to \"%@\"\n\
                                       do shell script \"sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext\" user name UserName password MyPASSWORD with administrator privileges\n\
                                       do shell script \"sudo cp ./libftd2xx.1.0.2.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\n\
                                       do shell script \"sudo cp ./libd2xx_table.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\n\
                                       do shell script \"cd /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\n\
                                       do shell script \"sudo ln -sf libftd2xx.1.0.2.dylib libftd2xx.dylib\" user name UserName password MyPASSWORD with administrator privileges\n",[m_textUserName stringValue], [m_textPassword stringValue]];
NSAppleScript   *appUnloadScript    = [[NSAppleScript alloc] initWithSource:strScriptUnload];
returnDescriptor = [appUnloadScript executeAndReturnError:nil];
[appUnloadScript release];

谢谢大家

从不硬编码用户的登录详细信息;这是一个巨大的安全违规行为。使用一个具有管理员权限的
do shell脚本“set-e;cmd1;cmd2;cmd3;…”,该命令将自动提示用户在继续之前进行一次身份验证。但这对我来说并不好,因为我的应用程序每次都需要调用AppleScript。如果我像你说的那样做,它将每次提示用户进行身份验证,而不是一次。你的应用程序需要多久运行一次此脚本?您的原始帖子没有提供任何背景信息。使用字符串蒙格向脚本传递参数是一种不好的做法。在将输入插入字符串之前未能对其进行清理是非常糟糕的做法,而且是完全不安全的。(如果文本包含双引号或反斜杠,会发生什么情况?)
NSString        *strScriptUnload    = [NSString stringWithFormat:@"\
                                       set UserName to \"%@\"\n\
                                       set MyPASSWORD to \"%@\"\n\
                                       do shell script \"sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext\" user name UserName password MyPASSWORD with administrator privileges\n\
                                       do shell script \"sudo cp ./libftd2xx.1.0.2.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\n\
                                       do shell script \"sudo cp ./libd2xx_table.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\n\
                                       do shell script \"cd /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\n\
                                       do shell script \"sudo ln -sf libftd2xx.1.0.2.dylib libftd2xx.dylib\" user name UserName password MyPASSWORD with administrator privileges\n",[m_textUserName stringValue], [m_textPassword stringValue]];
NSAppleScript   *appUnloadScript    = [[NSAppleScript alloc] initWithSource:strScriptUnload];
returnDescriptor = [appUnloadScript executeAndReturnError:nil];
[appUnloadScript release];