Come avviare un'applicazione GUI nella sessione grafica di un altro utente?

13

Sto cercando di capire come avviare un'applicazione GUI come un altro utente che ha effettuato l'accesso interattivo, nella sessione grafica dell'utente.

Ad esempio, dire che ho due utenti, foo e bar. Entrambi sono collegati, ma l'utente interattivo attuale è foo. Vorrei avviare Calculator.app come utente "bar", in modo che quando l'utente veloce passa alla barra, trovo la finestra della Calcolatrice aperta nella sessione della barra.

Ecco cosa ho provato che non funziona:

sudo -u bar /Applications/Calculator.app/Contents/MacOS/Calculator

Questo avvia Calculator.app come barra, ma la finestra si apre nella sessione grafica di foo.

sudo -u bar osascript -e "tell application \"Calculator\" to activate"

Stesso effetto.

sudo -u bar open "/Applications/Calculator.app"

Avvia Calcolatrice come pippo, non barra.

launchctl asuser [uid of bar] [any of the above commands]

Stesso effetto.

C'è un modo per farlo? Sono disposto a intrattenere tutti i tipi di soluzioni possibili, inclusi script di bash, AppleScript, scrivere un programma Core Foundation o Cocoa e così via. Nella mia situazione, qualsiasi programma o script può essere eseguito come qualsiasi utente, incluso root.

Nota: sono consapevole che è possibile utilizzare eventi Apple remoti, ma non posso utilizzarlo poiché nella situazione in cui sto cercando di farlo non ho alcuna garanzia che "Remote Apple Events" sarà abilitato in Condivisione preferenze.

Qualsiasi aiuto sarebbe molto apprezzato!

    
posta GuyGizmo 03.09.2013 - 22:55
fonte

5 risposte

7

Quello che vuoi ottenere è possibile ma difficile. È necessario avviare l'applicazione all'interno della sessione utente appropriata. Per motivi di sicurezza, attraversare la divisione della sessione utente è difficile.

Hai bisogno di un processo già in esecuzione nella sessione di un altro utente per ascoltare la tua richiesta e avviare l'applicazione per tuo conto.

launchd's bsexec

Per fortuna, le versioni recenti di launchd hanno questa capacità; anche se gli ingegneri Apple non hanno raccomandato il suo uso generale. Utilizza l'opzione bsexec in launchctl come target la sessione utente appropriata:

 bslist [PID | ..] [-j]
          This prints out Mach bootstrap services and their respective states. While the namespace
          appears flat, it is in fact hierarchical, thus allowing for certain services to be only avail-
          able to a subset of processes. The three states a service can be in are active ("A"), inactive
          ("I") and on-demand ("D").

          If [PID] is specified, print the Mach bootstrap services available to that PID. If [..] is
          specified, print the Mach bootstrap services available in the parent of the current bootstrap.
          Note that in Mac OS X v10.6, the per-user Mach bootstrap namespace is flat, so you will only
          see a different set of services in a per-user bootstrap if you are in an explicitly-created
          bootstrap subset.

          If [-j] is specified, each service name will be followed by the name of the job which regis-
          tered it.

 bsexec PID command [args]
          This executes the given command in the same Mach bootstrap namespace hierachy as the given
          PID.

 bstree [-j]
          This prints a hierarchical view of the entire Mach bootstrap tree. If [-j] is specified, each
          service name will be followed by the name of the job which registered it.  Requires root priv-
          ileges.

L'approccio consigliato è quello di scrivere un ticket di lavoro launchd e riavviare il Mac, oppure chiedere all'utente di disconnettersi e rientrare di nuovo.

Causa dei problemi

I problemi derivano dall'applicazione connessa al processo WindowServer sbagliato. Ogni sessione utente ha un WindowServer separato; questo processo gestisce l'interfaccia utente. I tuoi metodi precedenti collocano la proprietà del processo con l'utente giusto ma connesso al tuo processo WindowServer.

Questo problema è menzionato nella nota tecnica di Daemons and Agents di Apple.

L'esperienza

Lo so per esperienza personale. Per Power Manager, ho scritto pmuser per esistere all'interno di ciascun utente sessione. pmuser ascolta il nostro daemon e gestisce gli avvii e i comandi per utente. Nonostante il nostro daemon abbia l'autorizzazione root, abbiamo comunque bisogno di un processo per utente che funzioni in maniera affidabile all'interno delle sessioni utente.

    
risposta data 18.09.2013 - 09:47
fonte
4

Nessuna delle risposte bsexec di cui sopra funziona su El Capitan (10.11), a causa del System Integration Protection (SIP) che chiude le porte. "launchctl asuser" funziona, ma richiede di essere eseguito come root. Il comando seguente funziona su El Capitan (e sui SO più recenti):

sudo launchctl asuser 501 open /Applications/Calculator.app

Notare che 501 è l'ID utente per il mio altro utente.

    
risposta data 24.03.2016 - 00:00
fonte
1

Come finalmente 10.10 fornisce un'implementazione corretta di "launchctl bsexec" puoi usare:

sudo /bin/launchctl bsexec PID chroot -u UID -g GID / open /Applications/TextWrangler.app

l'uomo dice

This executes the given command in as similar an execution context as possible to the target PID.

Quindi come parametro PID puoi usare il pid del processo loginwindow appropriato. L'UID è l'id utente dell'utente che possiede la finestra di login e il GID è il suo gruppo principale.

Funziona bene per qualsiasi comando e, naturalmente, per i lavori di avvio (ad esempio launchagents), anche alla fine:

/bin/launchctl bsexec 104 chroot -u 501 -g 20 / /bin/launchctl load -S Aqua /Library/LaunchAgents/com.youragent.plist 2>&1
    
risposta data 20.06.2015 - 19:52
fonte
0

Funziona tramite ssh:

#!/bin/bash

PID=$(ps auxwww | egrep "^bar" |\
fgrep /System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow |\
awk '{print $2}')

sudo launchctl bsexec "$PID" open -a TextEdit

ma se provalo tramite Terminal.app, allora apre TextEdit nella GUI dell'utente corrente.

Se non sei sicuro che ssh sia abilitato, forse puoi abilitarlo temporaneamente

sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

e disattivarlo di nuovo in seguito, se necessario?

Altrimenti sono perplesso.

Testato il 10.9.

    
risposta data 23.10.2013 - 10:06
fonte
-1

Semplice

sudo su name_of_user

quindi esegui normalmente i comandi.

    
risposta data 11.02.2017 - 21:05
fonte

Leggi altre domande sui tag