Ich versuche herauszufinden, wie eine GUI-Anwendung als ein anderer Benutzer gestartet wird, der interaktiv in der grafischen Sitzung dieses Benutzers angemeldet ist.
Angenommen, ich habe zwei Benutzer, foo und bar. Beide sind angemeldet, aber der aktuelle interaktive Benutzer ist foo. Ich möchte Calculator.app als Benutzer "bar" starten, damit das Fenster "Calculator" in der Sitzung der Leiste geöffnet ist, wenn der Benutzer schnell zur Leiste wechselt.
Folgendes habe ich versucht, was nicht funktioniert:
sudo -u bar /Applications/Calculator.app/Contents/MacOS/Calculator
Dadurch wird Calculator.app als Leiste gestartet, das Fenster wird jedoch in der grafischen Sitzung von foo geöffnet.
sudo -u bar osascript -e "tell application \"Calculator\" to activate"
Gleicher Effekt.
sudo -u bar open "/Applications/Calculator.app"
Startet den Rechner als foo, nicht als bar.
launchctl asuser [uid of bar] [any of the above commands]
Gleicher Effekt.
Gibt es eine Möglichkeit, dies zu erreichen? Ich bin bereit, alle möglichen Lösungen in Betracht zu ziehen, einschließlich Bash-Scripting, AppleScript, Schreiben eines Core Foundation- oder Cocoa-Programms und so weiter. In meiner Situation könnte jedes Programm oder Skript als jeder Benutzer ausgeführt werden, einschließlich root.
Hinweis: Ich bin mir bewusst, dass es möglich ist, Remote-Apple-Ereignisse zu verwenden, aber ich kann dies nicht verwenden, da ich in der Situation, in der ich dies versuche, keine Garantie dafür habe, dass "Remote-Apple-Ereignisse" in den Freigabeeinstellungen aktiviert werden.
Jede Hilfe wäre sehr dankbar!
quelle
open
Befehl mit ausprobiertSSH
?Antworten:
Was Sie erreichen wollen, ist möglich, aber schwierig. Sie müssen die Anwendung in der entsprechenden Benutzersitzung starten. Aus Sicherheitsgründen ist das Überschreiten der Benutzersitzung schwierig.
Sie benötigen einen Prozess, der bereits in der Sitzung des anderen Benutzers ausgeführt wird, um Ihre Anforderung abzuhören und die Anwendung in Ihrem Namen zu starten.
launchd's bsexec
Zum Glück
launchd
verfügen neuere Versionen über diese Fähigkeit. Obwohl Apple-Ingenieure die allgemeine Verwendung nicht empfohlen haben. Verwenden Sie diebsexec
Option in launchctl , um die entsprechende Benutzersitzung auszuwählen :Der empfohlene Ansatz besteht darin, ein Start-Job-Ticket zu erstellen und den Mac neu zu starten - oder den Benutzer aufzufordern, sich abzumelden und wieder anzumelden.
Ursache der Probleme
Die Probleme sind darauf zurückzuführen, dass die Anwendung mit dem falschen
WindowServer
Prozess verbunden ist. Jede Benutzersitzung verfügt über einen separaten WindowServer. Dieser Prozess behandelt die Benutzeroberfläche. Bei Ihren früheren Methoden ist der Eigentümer des Prozesses der richtige Benutzer, der jedoch mit Ihrem eigenen WindowServer-Prozess verbunden ist.Dieses Problem wird in dem technischen Hinweis Daemons and Agents von Apple erwähnt.
Erfahrung
Ich weiß das aus eigener Erfahrung. Für Power Manager habe ich pmuser geschrieben , damit es in jeder Benutzersitzung existiert.
pmuser
Hört auf unseren Daemon und verwaltet die benutzerspezifischen Starts und Befehle. Obwohl unser Daemon über Root-Berechtigung verfügt, benötigten wir einen Prozess pro Benutzer, um in Benutzersitzungen zuverlässig zu arbeiten.quelle
Keine der obigen Antworten von bsexec funktioniert auf El Capitan (10.11), da der System Integration Protection (SIP) die Ports schließt. "launchctl asuser" funktioniert, muss jedoch als root ausgeführt werden. Der folgende Befehl funktioniert auf El Capitan (und den neuesten Betriebssystemen):
Beachten Sie, dass 501 die Benutzer-ID für meinen anderen Benutzer ist.
quelle
bruno.medeiros@brunojcm-macbook:~ $ sudo launchctl asuser 501 open /Applications/Firefox.app
und bekamLSOpenURLsWithRole() failed with error -600 for the file /Applications/Firefox.app
sudo launchctl asuser $(id -u <user_id_name>) <app>
. Das heißt, ich bekomme eine andere Fehlermeldung,posix_spawn(): 13: Permission denied
auch wenn ich mit der gleichen Benutzer-ID ausgeführt werde, mit der ich angemeldet bin (und die Sitzung besitzt) fürsudo launchctl asuser $(id -u mtylutki) /Applications/Calculator.app
Ab 10.10 gibt es eine korrekte "launchctl bsexec" -Implementierung, die Sie verwenden können:
Mann sagt
Als PID-Parameter können Sie also die PID des entsprechenden Login-Fensters verwenden. Die UID ist die Benutzer-ID des Benutzers, der das Anmeldefenster besitzt, und die GID ist die primäre Gruppe.
Dies funktioniert für jeden Befehl und natürlich auch für gestartete Jobs (z. B. Launchagents) wie folgt:
quelle
task_for_pid(): 0x5
Ich bin mir nicht sicher, ob dies für andere zutrifft, aber ich erhalte jetzt eine Fehlermeldung, in der ich die Richtigkeit der PID überprüft habe.Sie können den Finder als Host für die richtigen Berechtigungen verwenden
osascript -e "tell application \"Finder\" to open (\"${app}\" as POSIX file as alias)"
. Auf diese Weise wird Finder über den GUI-Kontext gestartet.quelle
Das funktioniert via ssh:
Wenn Sie es jedoch über Terminal.app versuchen, wird TextEdit in der Benutzeroberfläche des aktuellen Benutzers geöffnet.
Wenn Sie nicht sicher sind, ob dies
ssh
aktiviert ist, können Sie es möglicherweise vorübergehend aktivierenund bei Bedarf danach wieder deaktivieren?
Ansonsten bin ich ratlos.
Getestet am 10.9.
quelle
Einfach
Führen Sie dann die Befehle normal aus.
quelle
bar
, würden aber weiterhin infoo
der grafischen Sitzung ausgeführt.