2010-03-25 6 views
0

Je suis lassé de la intégré open commande Mac OS X, la plupart du temps, car il gère des programmes avec votre ID utilisateur réel au lieu de l'ID de l'utilisateur effectif; il en résulte le fait sudo open Foo ouvre Foo avec son application associée à votre compte au lieu du compte root, et cela me contrarie. J'ai donc décidé de faire une sorte de remplacement.Comment ouvrir un document en utilisant une application lancée via NSTask?

Jusqu'ici, j'ai réussi: je peux ouvrir n'importe quel programme sous la mode open -a ou open -b, et le soutien éventuellement en attente. J'utilise NSTask à cet effet.

Cependant, je voudrais être en mesure d'ouvrir des documents aussi. Pour autant que je peux voir, vous devez utiliser NSWorkspace pour cela, mais en utilisant NSWorkspace pour lancer des programmes en eux des résultats en cours de lancement avec les informations d'identification de votre compte au lieu des informations d'identification de votre programme de ligne de commande. Ce qui est précisément ce que l'outil par défaut open fait, et précisément ce que je ne veux pas.

Alors, comment puis-je avoir une demande de programme qu'un autre programme ouvre un document sans utiliser NSWorkspace? De l'objet NSTask, je peux avoir l'ID de processus, mais c'est à peu près tout.

+0

Ce que vous décrivez constituerait un risque extrême de sécurité. L'exécution d'une application graphique en tant que root n'est pas une bonne idée du tout. Pourquoi veux-tu faire cela? Il y a probablement un meilleur moyen. –

+0

@Rob Keniger: Mon but est d'avoir un 'programme open' comme qui exécute des programmes sous' 'root' si je sudo open' eux, au lieu d'avoir à faire' sudo/full/application/chemin/Contents/MacOS/programme ». Je connais les risques de l'exécution de programmes comme «root», et je veux le faire pour moi-même. Il n'y a pas de redistribution planifiée ni d'environnement de production en fonction de cela. Par exemple, parfois je veux juste des informations du Moniteur d'activité qui ne peuvent être rassemblées que si elles sont exécutées en tant que root (comme les fichiers ouverts et les ports de démons). Ce n'est pas comme si je voulais lancer le Finder ou Safari en tant que root. – zneak

Répondre

1

Espérons que cela fera l'affaire:

- (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); 
} 

Vous pourriez avoir à lancer l'application à l'aide d'un NSTask puis envoyer l'événement d'Apple ouvert approprié .

En fait, vous pouvez lancer l'aide d'un NSTask puis ouvrez le fichier via NSWorkspace une fois que vous savez qu'il en cours d'exécution? Ou cela lance-t-il une nouvelle instance de l'application sous votre ?

réponse originale:

Est-ce que

open -a SomeApplication SomeFile

travail?

+0

Je pense que vous n'avez pas tout à fait lu la question. :/'open -a SomeApp SomeFile' ouvrira le fichier désiré dans l'application désirée, mais' sudo open -a SomeApp SomeFile' ne l'exécutera pas avec le compte 'root', ce qui est mon chagrin par rapport au programme' open' et la raison pour laquelle j'écris un remplacement. – zneak

+0

Oh, sous la mode ouverte * a *. J'ai mal interprété cette partie. Laisse-moi éditer. – Wevah

+0

Merci pour votre modification.Oui, l'ouverture du document à partir de NSWorkspace une fois que l'application s'exécute avec le compte 'root' ouvrira le document dedans; cependant, il y a des cas dans lesquels il échouera (comme s'il y avait une autre instance de l'application ouverte s'exécutant sous le compte d'utilisateur normal). Apple Events pourrait être le chemin à parcourir. avez-vous un lien de documentation utile pour cela? 'initWithEventClass: eventID: targetDescriptor: returnID: transactionID:' me fait peur. – zneak

Questions connexes