リモートマネージメントと画面共有の違いを知る

今まで、画面共有するなら、以下の方法しか知らなかった。

  • システム環境設定 >> 共有 >> 画面共有 を「入」にする。


上記でまったく問題ないのだが、実はもう1つ別の方法があった。

  • システム環境設定 >> 共有 >> リモートマネージメント を「入」にする。


どちらの方法でも同じように、ネットワークを経由して、離れた場所のマシンのGUIなデスクトップを操作できる。しかし、それならなぜ2つの方法が用意されているのか?リモートマネージメントは、Apple Remote Desktopが利用する共有サービスだといってしまえばそれまでなのだが、Apple Remote Desktopとは何なのか?何ができるのか?自分はそんな基本的なことさえ知らなかったので、その違いを調べてみた。

設定画面の違い

画面共有 リモートマネージメント
基本
コンピュータ設定...
アクセス許可のユーザ追加
オプション なし

GUIの設定画面を並べて見比べると、その違いがよく分かる。アクセス許可のユーザを追加する画面以外は、リモートマネージメントは画面共有と同じ設定を含んでいる。

リモートマネージメントは画面共有より優先される

  • 画面共有が「入」の最中に、リモートマネージメントも「入」にすると...
    • 画面共有は「切」に変更され、変更不可能な項目になる。
    • そして、画面共有がリモートマネージメントによって制御されていることがアナウンスされる。


アクセス許可のユーザ追加

  • ちょっと分かり難かったのが、アクセス許可でユーザを追加する設定の部分。
  • リモートマネージメントの場合は、システム環境設定 >> アカウント に表示されるログインユーザだけが扱える。(これが標準的な機能だと思う)
  • 一方、画面共有の場合は、アドレス帳の個人名や、まったくの新規メンバーを追加するボタンまで用意されている。
  • ログインユーザ以外に好き勝手にユーザを追加する機能って何だろう?と思って、実際に試してみる。
    • まずは+ボタンを押して、新規メンバーボタンを押し、アカウントを作成した。

    • testユーザが追加されているので、選択ボタンを押した。

    • すると、アクセスを許可:にtestユーザが追加された。


    • 他のマシンからtestユーザで画面共有してみると、見事、接続できた!
  • ちなみに、アドレス帳から追加する場合は、名前をそのまま利用できるというだけで、新規メンバーボタンで追加したユーザとの違いはなかった。

新規メンバーはどこに居る?

  • お試しのtestユーザを追加して、利用できて、満足していたのだが、
  • testユーザを削除する方法が分からなくて、暫し悩んでしまった...。
  • 実は、testユーザは システム環境設定 >> アカウントで、「共有のみ」という区分のユーザとして登録されていたのであった。
  • 「共有のみ」という区分は、その名のとおり、共有サービスを利用するためだけのユーザ区分である。
    • 具体的には、画面共有・ファイル共有・プリンタ共有で、testユーザを指定可能だった。
    • だから、testユーザには、ホームフォルダもなく、ログインもできない。
    • 画面共有では、ネットワークを経由した操作を許可されているだけであり、あくまでも他のユーザのログイン済みの環境を操作しているに過ぎない。
    • もし、誰もログインしていなければ、ログインウィンドウが表示されることになるだろう。
  • 無事、システム環境設定 >> アカウントを開いて、お試しのtestユーザを削除できたのであった。

アクセスを許可の違いから読み取る

受け身の画面共有
  • 画面共有はその名のとおり、1台の共有マシンに、複数のマシンから接続して利用する状況を想定していると感じた。
  • 共有マシンは、複数のユーザに自分を開放して、利用されるのを待っているという受け身の状態が、画面共有だと思った。
  • だから、画面共有の設定ではログインユーザ以外にも、任意の共有のみユーザを設定して、アクセスを許可できる。
積極的なリモートマネージメント
  • 一方のリモートマネージメントは、1台のメインマシンで、複数のマシンをコントロールする状況を想定していると感じた。
  • メインマシンが、複数の共有マシンを次々と切り換えながら、必要な操作をこなしていく積極的な状態が、リモートマネージメントだと思った。
  • リモートマネージメントでは、ログインユーザーのみアクセスを許可される。
    • リモート操作する側が主体なので、ログインユーザであることが、どうしても必要なのだ。
    • もしログインユーザーでないと、接続先のマシンで、誰かがログインするまでは何も操作できないことになってしまう...。
    • 但し、画面共有.appから接続する状況においては、共有のみのユーザも利用可能だった。(少なくとも、後述するkickstartコマンドで設定した場合は)

ターミナルからリモートマネージメントを有効にする

# OSX 10.6(上段:入 / 下段:切)
sudo touch /etc/RemoteManagement.launchd
sudo rm /etc/RemoteManagement.launchd
  • しかし、この方法は、うっかりリモートマネージメントが「切」になってしまっているマシンに対する救済策であり、どちらかと言うと、受け身の技である。
  • リモートマネージメントの設定(コンピュータ設定・アクセス許可・オプション)は、事前にシステム環境設定の共有パネルで設定しておく必要があるのだ。
  • リモートマネージメントは、1台のメインマシンで、積極的に複数のマシンを管理する目的がある。
  • しかし、その初めの一歩が「管理されるマシンの前に座ってリモートマネージメントの設定をすること」になってしまうのは考えものである。
  • 管理されるマシンは、同じ部屋にあるとは限らない。もしかしたら、北海道や沖縄に分散しているかもしれない。
  • その場所に行かずして、リモート操作できることが最大の魅力なのに、最初の設定で遥々足を運んでいたのでは、利用価値が半減してしまう...。

そんなジレンマを解消するには...

kickstartコマンド

  • Appleの正式な文書で紹介されるkickstartは、システム環境設定 >> 共有 >> リモートマネージメント のすべてを設定可能なコマンドだ。*1
RemoteDesktop 3.0 Help: kickstart を使用する
  • 上記で解説されているkickstartの操作例を実際に試して、何が起こっているか確認してみた。
# kickstartまでのパスが長いので、ディレクトリを移動した。
$ cd /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/

# ヘルプ表示
$ sudo ./kickstart -help

# リモートマネージメントを「入」にする
# アクセスを許可:すべてのユーザ
$ sudo ./kickstart -activate -configure -access -on
Starting...
Activated Remote Management.
zari: Set user remote access.
test: Set user remote access.
Done.

# リモートマネージメントを「入」にする
# アクセスを許可:すべてのユーザ
# プロセス ARDAgent(Apple Remote Desktop Agent)を再起動する
# オプションのすべてを「入」にする
$ sudo ./kickstart -activate -configure -access -on -restart -agent -privs -all
Starting...
Activated Remote Management.
Stopped ARD Agent.
Stopped RFB Register MDNS
zari: Set user remote control privileges.
zari: Set user remote access.
test: Set user remote control privileges.
test: Set user remote access.
Done.

# リモートマネージメントを「入」にする
# アクセスを許可:testユーザのみ
# オプションのすべてを「入」にする
# プロセス ARDAgent(Apple Remote Desktop Agent)とメニューエスクトラを再起動する
$sudo ./kickstart -activate -configure -access -on -users test -privs -all -restart -agent -menu
Starting...
Activated Remote Management.
Stopped ARD Agent.
Stopped RFB Register MDNS
Restarted Menu Extra (System UI Server).
Done.

# リモートマネージメントを「入」にする
# アクセスを許可:すべてのユーザを削除(VNCからの接続のみ可能)
$sudo ./kickstart -activate -configure -access -off
Starting...
Activated Remote Management.
zari: Set user remote access.
test: Set user remote access.
Done.

# プロセス ARDAgent(Apple Remote Desktop Agent)を終了する
$sudo ./kickstart -agent -stop
Starting...
Stopped ARD Agent.
Stopped VNC Server.
Stopped RFB Register MDNS
Done.

# リモートマネージメントを「切」にする
# アクセスを許可:すべてのユーザを削除
$sudo ./kickstart -deactivate -configure -access -off
Starting...
Removed preference to start ARD after reboot.
zari: Set user remote access.
test: Set user remote access.
Done.
Remote Desktop: 複数のクライアントに VNC パスワードを割り当てる場合のヒント
  • VNCパスワードは以下のファイルに保存されている。(画面共有・リモートマネージメント 共通)
/Library/Preferences/com.apple.VNCSettings.txt
  • メインのMacBookから、複数のiMacに、VNCパスワードを設定する場合...
    • まずは、MacBookでシステム環境設定 >> 共有 >> リモートマネージメント >> コンピュータ設定... で VNCパスワードを設定しておく。
    • その後、MacBooKの/Library/Preferences/com.apple.VNCSettings.txtを、以下のようにiMacにコピーすれば、MacBookと同じパスワードがiMacにも設定される。
  • MacBookからiMacへリモートログインして、
  • MacBookMacintosh HDをマウントして、
  • com.apple.VNCSettings.txtをコピーして、
  • iMacのリモートマネージメントのVNCアクセスを有効にして、
  • MacBookMacintosh HDをアンマウントする。
# iMacにリモートログイン
MacBook:~ zari$ ssh zari@iMac.local
Password:
Last login: Mon May 24 15:34:37 2010

# マウント場所を作成
iMac:~ zari$ mkdir /Volumes/Macintosh\ HD

# マウント
#   mount_afp -i afp://ユーザー名:パスワード@ホスト名/Macintosh\ HD /Volumes/Macintosh\ HD
#   -iオプションにより、ユーザー名あるいはパスワードを省略すると、対話的に確認してくれる。
iMac:~ zari$ mount_afp -i afp://zari@MacBook.local/Macintosh\ HD /Volumes/Macintosh\ HD
Password:

# コピー
iMac:~ zari$ cp /Volumes/Macintosh\ HD/Library/Preferences/com.apple.VNCSettings.txt /Library/Preferences/

# アンマウント
iMac:~ zari$ umount /Volumes/Macintosh\ HD

# リモートマネージメントのVNC アクセスを有効にする
#   ちなみに、無効にするには「no」を設定する .../kickstart -configure -clientopts -setvnclegacy -vnclegacy no
iMac:~ zari$ /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -configure -clientopts -setvnclegacy -vnclegacy yes

# iMacをログアウト
iMac:~ zari$ exit
logout
Connection to iMac.local closed.


以上のように、kickstartコマンドによって、リモートマネージメントを自在に設定可能なのであった。リモートログインさえ可能な状態であれば、あらゆるマシンはいつでも画面共有を開始できるのだ。

リモートマネージメントにできること、画面共有にできないこと

  • 画面共有中に表示されるメニューバーアイコンの表示・非表示のコントロール
    • コンピュータ設定... >> リモートマネージメントの状況をメニューバーに表示
  • kickstartコマンドからの自由な設定変更
    • リモートログインさえできれば、好みのリモートマネージメントに設定できる。
  • Apple Remote Desktop経由の高度な管理
    • リンク先に様々な機能が紹介されている。特に、以下の機能は魅力的で、画面共有.appにも欲しい...。
    • ドラッグ&ドロップによる異なるコンピュータ間のファイルコピー
      • 画面共有.appでは、テキストデータのみ、クリップボードの送受信でやり取りできた。
    • カーテンモード(デスクトップにカーテンを表示して、操作の様子を見せないモード)
      • 画面共有.appでは、操作中の様子はそのまま画面に表示されてしまう。隠す手段はない。


launchdの設定ファイル

/System/Library/LaunchAgents/com.apple.ScreenSharing.plist
  • KeepAliveとPathStateによって、/etc/ScreenSharing.launchdというファイルが存在する限り、AppleVNCServerを起動し続ける仕様になっている。
    • もし、強制終了した場合も、即座に再起動する。
  • 画面共有を「入」にした瞬間、以下のプロセスが開始された。
    • VNCPrivilegeProxy
    • RFBRegisterMDNS
    • AppleVNCServer
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>EnableTransactions</key>
	<true/>
	<key>KeepAlive</key>
	<dict>
		<key>PathState</key>
		<dict>
			<key>/etc/ScreenSharing.launchd</key>
			<true/>
		</dict>
	</dict>
	<key>Label</key>
	<string>com.apple.ScreenSharing.server</string>
	<key>LimitLoadToSessionType</key>
	<array>
		<string>Aqua</string>
		<string>LoginWindow</string>
	</array>
	<key>Program</key>
	<string>/System/Library/CoreServices/RemoteManagement/AppleVNCServer.bundle/Contents/MacOS/AppleVNCServer</string>
</dict>
</plist>
/System/Library/LaunchAgents/com.apple.RemoteDesktop.plist
  • KeepAliveとPathStateによって、/etc/RemoteManagement.launchdというファイルが存在する限り、com.apple.RemoteDesktop.agentサービスとARDAgentを起動し続ける仕様になっている。
    • もし、強制終了した場合も、即座に再起動する。
  • リモートマネージメントを「入」にした瞬間、以下のプロセスが開始された。
    • VNCPrivilegeProxy
    • RFBRegisterMDNS
    • AppleVNCServer
    • ARDAgent
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>KeepAlive</key>
	<dict>
		<key>PathState</key>
		<dict>
			<key>/etc/RemoteManagement.launchd</key>
			<true/>
		</dict>
	</dict>
	<key>Label</key>
	<string>com.apple.RemoteDesktop.agent</string>
	<key>LimitLoadToSessionType</key>
	<array>
		<string>Aqua</string>
		<string>LoginWindow</string>
	</array>
	<key>MachServices</key>
	<dict>
		<key>com.apple.RemoteDesktop.agent</key>
		<true/>
	</dict>
	<key>Program</key>
	<string>/System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/MacOS/ARDAgent</string>
</dict>
</plist>

*1:逆に、kickstartコマンドにGUIを被せたものがシステム環境設定として提供されていると考えるべきかもしれないが。