2010-03-25 50 views
0

我已经厌倦了内置的open Mac OS X命令,主要是因为它使用您的实际用户ID运行程序,而不是有效的用户ID;这导致事实sudo open Foo用您的帐户而不是root帐户将Foo与其关联的应用程序打开,这让我很烦恼。所以我决定做一些更换。如何使用通过NSTask启动的应用程序打开文档?

到目前为止,我已经成功了:我可以在open -aopen -b时尚下打开任何程序,并支持随时等待。我为此使用了NSTask

但是,我希望能够打开文档。据我所知,您需要使用NSWorkspace,但使用NSWorkspace启动程序会导致它们以您的账户凭证而不是您的命令行程序凭证启动。这正是默认的open工具所做的,正是我不想要的。

那么,我怎么能有一个程序请求,另一个程序打开一个文件,而不使用NSWorkspace?从NSTask对象中,我可以拥有进程ID,但这就是它。

+0

你所描述的将是一种极端的安全风险。以root身份运行GUI应用程序并不是一个好主意。你为什么想这样做?可能有更好的方法。 – 2010-03-26 00:37:30

+0

@Rob Keniger:我的目标是有一个'open'-like程序,在'root'下运行程序,如果我'sudo打开'它们,而不必执行'sudo/full/application/path/Contents/MacOS/program'。我知道作为'root'运行程序的风险,我想为自己做。没有重新分配计划,也没有任何生产环境取决于它。例如,有时我只想从活动监视器获取信息,只有在以“root”身份运行时才能收集信息(如打开文件和守护进程的端口)。这并不像我想以'root'运行Finder或Safari。 – zneak 2010-03-26 01:06:17

回答

1

希望这将这样的伎俩:

- (void)openFile:(NSString *)filePath withTask:(NSTask *)task { 
    int pid = [task processIdentifier]; 
    NSAppleEventDescriptor *target = [NSAppleEventDescriptor descriptorWithDescriptorType:typeKernelProcessID bytes:&pid length:sizeof(pid)]; 

    const char *urlUTF8 = [[[NSURL fileURLWithPath:filePath] absoluteString] UTF8String]; 
    NSAppleEventDescriptor *urlDescriptor = [NSAppleEventDescriptor descriptorWithDescriptorType:typeFileURL bytes:urlUTF8 length:strlen(urlUTF8)]; 

    NSAppleEventDescriptor *event = [NSAppleEventDescriptor appleEventWithEventClass:kEventParamAppleEvent eventID:kAEOpen targetDescriptor:target returnID:kAutoGenerateReturnID transactionID:kAnyTransactionID]; 
    [event setParamDescriptor:urlDescriptor forKeyword:keyDirectObject]; 

    OSStatus err = AESendMessage([event aeDesc], NULL, kAENoReply | kAENeverInteract, kAEDefaultTimeout); 

    if (err != noErr) { 
     // Error handling goes here 
    } 

    // Activate the application 

    event = [NSAppleEventDescriptor appleEventWithEventClass:kAEMiscStandards eventID:kAEActivate targetDescriptor:target returnID:kAutoGenerateReturnID transactionID:kAnyTransactionID]; 
    err = AESendMessage([event aeDesc], NULL, kAENoReply | kAENeverInteract, kAEDefaultTimeout); 
} 

您可能需要使用NSTask启动应用程序 ,然后向它发送 适当打开苹果事件。

其实,你可以启动使用 NSTask,然后通过 NSWorkspace打开该文件,一旦你知道它 运行?或者是否在您的 用户下启动了该应用程序的新实例 ?

原件回复:

是否

open -a SomeApplication SomeFile

工作?

+0

我觉得你没有完全阅读这个问题。 :/'open -a SomeApp SomeFile'将在所需的应用程序中打开所需的文件,但'sudo open -a SomeApp SomeFile'不会用'root'帐户运行,这是我对'open'程序的悲痛,以及我正在写一个替代品的原因。 – zneak 2010-03-25 23:44:36

+0

呵呵,打开-a *时尚*。我误读了那部分。让我编辑。 – Wevah 2010-03-26 00:06:21

+0

感谢您的编辑。是的,一旦应用程序以'root'帐户运行,将从NSWorkspace打开文档将打开文档;但是,在某些情况下,它会失败(例如,在普通用户帐户下运行的另一个打开的应用程序实例)。苹果事件可能是要走的路;你有什么有用的文件链接? 'initWithEventClass:eventID:targetDescriptor:returnID:transactionID:'吓到我了。 – zneak 2010-03-26 00:19:03