16 votos

¿Cómo iniciar una aplicación GUI en otro usuario ' sesión gráfica s?

Estoy tratando de averiguar cómo iniciar una aplicación de interfaz de usuario como otro usuario que se registra en forma interactiva, en la que el usuario de la sesión gráfica.

Por ejemplo, decir que tengo dos usuarios, foo y bar. Tanto la sesión, pero el usuario interactivo actual es foo. Me gustaría lanzar la Calculadora.aplicación como usuario "bar", así que cuando me cambio rápido de usuario a la barra, me parece que la Calculadora se abra la ventana en la barra de sesión.

Esto es lo que yo he probado que no funciona:

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

De esta forma se inicia la Calculadora.aplicación como bar, pero la ventana se abre en foo gráfica de la sesión.

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

El mismo efecto.

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

Lanza de la Calculadora como foo, no de la barra.

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

El mismo efecto.

Es allí cualquier manera de lograr esto? Estoy dispuesto a entretener a todo tipo de posibles soluciones, incluyendo scripts de bash, AppleScript, la escritura de un Núcleo de Fundación o de Cacao del programa, y así sucesivamente. En mi situación, cualquier programa o secuencia de comandos se puede ejecutar como cualquier usuario, incluyendo la root.

Nota: soy consciente de que es posible, mediante remoto Eventos de Apple, pero no los puedo usar que, dado que en la situación que estoy tratando de hacer esto tengo ninguna garantía de que "Remoto Eventos de Apple" será activado en las preferencias de Compartir.

Cualquier ayuda sería muy apreciada!

8voto

Boris Vidolov Puntos 11

Ninguna de las respuestas de bsexec anteriores trabajo en El Capitan (10.11), debido a la integración de sistema protección (SIP) cerrando los puertos. "launchctl asuser" funciona, pero requiere que se ejecute como root. El siguiente comando trabaja en El capitán (y más reciente sistema operativo-es):

sudo launchctl asuser 501 open /Applications/Calculator.app

Tenga en cuenta que el 501 es el ID de mi otro usuario.

7voto

Steve Evans Puntos 155

Lo que queremos conseguir es posible, pero difícil. Usted necesita para el lanzamiento de la aplicación dentro de la correspondiente sesión de usuario. Por razones de seguridad, el cruce de la sesión de usuario se divide es difícil.

Usted necesita un proceso ya que se ejecuta en la otra sesión del usuario al escuchar su petición y el lanzamiento de la aplicación en su nombre.

launchd del bsexec

Afortunadamente, las últimas versiones de launchd tienen esta capacidad; a pesar de que los ingenieros de Apple no recomienda su uso general. El uso de la bsexec opción en launchctl a la meta de la correspondiente sesión de usuario:

 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.

El enfoque recomendado es escribir un launchd boleto del trabajo y reinicie el Mac - o pedir al usuario que inicie sesión y volver a iniciarla.

Causa de los Problemas

Los problemas se derivan de la aplicación que se conecta a la equivocada WindowServer proceso. Cada sesión de usuario ha separado WindowServer; este proceso se encarga de la interfaz de usuario. Sus métodos anteriores lugar la apropiación del proceso con el derecho de usuario, pero conectado a su propia WindowServer proceso.

Este problema se menciona en los Demonios y los Agentes de la nota técnica de Apple.

Experiencia

Sé por experiencia personal. Para Poder Administrador, me escribió pmuser que existen dentro de cada sesión de usuario. pmuser escucha a nuestro demonio y se maneja por usuario lanza y comandos. A pesar de nuestro demonio de tener root de la autoridad, que todavía necesita cada proceso de usuario para trabajar de forma fiable dentro de las sesiones de usuario.

2voto

Zyx Puntos 340

Finalmente 10.10 proporciona un correcto "launchctl bsexec" implementación yo puede usar:

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

el hombre dice

Este se ejecuta el comando dado en como similares en un contexto de ejecución como sea posible a la meta PID.

Así como PID param puede utilizar el pid de la correspondiente loginwindowproceso. El UID es el id de usuario del usuario dueño de la loginwindow y el GID es el grupo primario.

Esto funciona bien para cualquier comando y, por supuesto, para launchd de puestos de trabajo (f.e. launchagents) también en el pasado como:

/bin/launchctl bsexec 104 chroot -u 501 -g 20 / /bin/launchctl load -S Aqua /Library/LaunchAgents/com.youragent.plist 2>&1

0voto

moodforaday Puntos 2633

Esto se hace mediante 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

pero si intentarlo vía Terminal.app, luego abre TextEdit en interfaz gráfica del usuario actual.

Si usted no está seguro que ssh está activado, tal vez usted puede temporalmente habilitarlo

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

¿y desactivar otra vez luego si es necesario?

De lo contrario yo estoy perplejo.

Probado en 10.9.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X