別のユーザーのグラフィカルセッションでGUIアプリケーションを起動する方法


15

私は、そのユーザーのグラフィカルセッションで対話的にログインしている別のユーザーとしてGUIアプリケーションを起動する方法を見つけようとしています。

たとえば、fooとbarという2人のユーザーがいるとします。両方ともログインしていますが、現在の対話ユーザーはfooです。ユーザーを「バー」としてCalculator.appを起動したいので、ユーザーをバーにすばやく切り替えると、バーのセッションで電卓ウィンドウが開いていることがわかります。

ここで私が試したのはうまくいきません:

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

これにより、Calculator.appがバーとして起動されますが、fooのグラフィカルセッションでウィンドウが開きます。

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

同じ効果。

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

電卓をバーではなくfooとして起動します。

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

同じ効果。

これを達成する方法はありますか?私は、bashスクリプト、AppleScript、Core FoundationまたはCocoaプログラムの作成などを含む、あらゆる種類の可能な解決策を楽しませるつもりです。私の状況では、プログラムやスクリプトは、rootを含むすべてのユーザーとして実行できます。

注:リモートApple Eventsを使用することは可能ですが、これを使用しようとしている状況では、共有設定で「リモートApple Events」が有効になる保証はないため、使用できません。

どんな助けも大歓迎です!


1
openを使用してコマンドを試しましたSSHか?
マチューリーグラー

奇妙なことに、アプリのドックアイコンはfooのセッションに表示されますが、アプリウィンドウはバーに表示されます。したがって、それはうまくいかないようですが、良い提案です。残念ながら、私がこれを必要とする状況(インストーラー用)でセキュアログインが有効になっているという保証はありません。
GuyGizmo

このパズルの一部には-psnコマンドライン引数が関係していると思いますが、これは状況によってはOSによって追加されます。過去にOS Xへのコードの移植作業中にこれに遭遇しました。この質問とそれが参照するAppleのドキュメントを参照してください。
アシュリー

最後の10.10のよう怒鳴る言及bsexecは完璧に動作します
Hofi

回答:


7

達成したいことは可能ですが困難です。適切なユーザーセッション内でアプリケーションを起動する必要があります。セキュリティ上の理由から、ユーザーセッションの分割を越えることは困難です。

リクエストをリッスンし、代わりにアプリケーションを起動するには、他のユーザーのセッションで既に実行されているプロセスが必要です。

launchdのbsexec

ありがたいことに、最近のバージョンにlaunchdはこの機能があります。Appleのエンジニアは一般的な使用を推奨していません。launchctlbsexecオプションを使用して、適切なユーザーセッションをターゲットにします。

 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.

推奨されるアプローチは、launchdジョブチケットを作成してMacを再起動するか、ユーザーにログアウトして再度ログインするように依頼することです。

問題の原因

問題は、アプリケーションが間違ったWindowServerプロセスに接続されていることに起因します。各ユーザーセッションには個別のWindowServerがあります。このプロセスは、ユーザーインターフェイスを処理します。以前の方法では、プロセスの所有権を適切なユーザーに設定しますが、独自のWindowServerプロセスに接続します。

この問題は、AppleのDaemons and Agentsテクニカルノートに記載されています。

経験

これは個人的な経験から知っています。Power Managerの場合、各ユーザーセッション内に存在するpmuserを作成しました。pmuserデーモンをリッスンし、ユーザーごとの起動とコマンドを処理します。デーモンがルート権限を持っているにもかかわらず、ユーザーセッション内で確実に動作するためにユーザーごとのプロセスが必要でした。


TJの回答のような簡単なスクリプトを提供してもらえますか?それとも、そのようなことには複雑すぎますか?
クレゴックス14年

正しいソリューションは、短いスクリプトには複雑すぎます。理想的には、別のトランポリンのようなプロセスがターゲットユーザーセッションで必要です。これは、Power Managerで行う必要がありました:dssw.co.uk/powermanager何を達成したいですか?
グラハムミル14年

タイトルに書かれていることを正確に達成したい:別のユーザーのセッションでGUIアプリケーションを起動します。他のユーザーがログインする必要がない場合、またはプログラムでログインできる場合は、「ボーナスポイント」。具体的には、複数のGoogleドライブが必要です。単に手動でログインし、システム環境設定のそのユーザーのログインアイテムの下にある場合に機能します。トランポリンプロセスはボーナスポイントをもたらしませんが、それが唯一の方法である場合、Appleエンジニアがそれに対して正確に推奨するものは何ですか?このような単純なハックスクリプトを正確に実行するためだと思いました!:P
クレゴックス14年

@Cawasは、これを新しい質問として尋ね、それがどのように達成されるかではなく、複数のGoogleドライブが欲しいという目標に焦点を当ててください。フォーカスを変更すると、質問が重複としてマークされなくなります。
グラハムミル14年


7

システム統合保護(SIP)がポートを閉じているため、El Capitan(10.11)に対する上記のbsexecの回答はありません。「launchctl asuser」は機能しますが、rootとして実行する必要があります。以下のコマンドは、El Capitan(および最新のOS-es)で機能します。

sudo launchctl asuser 501 open /Applications/Calculator.app

501は他のユーザーのユーザーIDであることに注意してください。


これは私の結果です:bruno.medeiros@brunojcm-macbook:~ $ sudo launchctl asuser 501 open /Applications/Firefox.app、そして得たLSOpenURLsWithRole() failed with error -600 for the file /Applications/Firefox.app
ブルーノJCM

@BrunoJCM 501がそれを開きたいユーザーのユーザーIDコードであると確信していますか?コマンドが次のようなものである場合、もう少し明確になりますsudo launchctl asuser $(id -u <user_id_name>) <app>。そうは言っposix_spawn(): 13: Permission deniedても、ログインしている(セッションを所有している)ユーザーIDと同じユーザーIDで実行した場合でも、エラーが発生しますsudo launchctl asuser $(id -u mtylutki) /Applications/Calculator.app
Marcus

2

最終的に10.10が正しい「launchctl bsexec」実装を提供するため、次を使用できます。

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

男は言う

これにより、ターゲットPIDと可能な限り類似した実行コンテキストで指定されたコマンドが実行されます。

したがって、PID パラメーターとして、適切なloginwindowプロセスのpidを使用できます。UIDはそのログインウィンドウを所有するユーザーのユーザーIDであり、GIDはそのプライマリグループです。

これはどのコマンドでも問題なく動作し、もちろんlaunchdジョブ(launchagents)でも次のように機能します。

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

これが他の人に当てはまるかどうかはわかりませんがtask_for_pid(): 0x5、PIDが正しいことを確認したため、ここでエラーが表示されます。
マーカス

1

Finderを適切な権限のホストとして使用できますosascript -e "tell application \"Finder\" to open (\"${app}\" as POSIX file as alias)"。そのようにして、Finderを起動したGUIコンテキストを介して起動します。


0

これは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

ただし、Terminal.appで試してみると、現在のユーザーのGUIでTextEditが開きます。

ssh有効になっているかどうかわからない場合は、一時的に有効にすることができます

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

必要に応じて再度無効にしますか?

そうでなければ私は困惑しています。

10.9でテスト済み。


あなたが言うようにアプリケーションを開きますが、それは現在のユーザーセッションで開き、要求された他のユーザーのセッションでは開きません。
クレゴックス14年

-1

シンプル

sudo su name_of_user

その後、通常どおりコマンドを実行します。


コマンドはによって実行されますがbar、まだfooグラフィカルセッションで実行されます。
ジョンN

申し訳ありませんが、はい、質問について混乱しています。fooグラフィカルセッションでは実行されません。
PandBソフトウェア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.